func stop(st p.State) (interface{}, error) { tran := st.Begin() defer st.Rollback(tran) r, err := p.Choice( p.Try(p.Space), p.Try(p.Newline), p.Try(p.RuneOf(":.()[]{}?")), p.Try(p.EOF), )(st) if err != nil { return nil, err } return r, nil }
i, err := p.Int(st) if err == nil { val, err := strconv.Atoi(i.(string)) if err == nil { return Int(val), nil } return nil, err } return nil, err } // 用于string var EscapeChars = p.Do(func(st p.State) interface{} { p.Chr('\\').Exec(st) r := p.RuneOf("nrt\"\\").Exec(st) ru := r.(rune) switch ru { case 'r': return '\r' case 'n': return '\n' case '"': return '"' case '\\': return '\\' case 't': return '\t' default: panic(st.Trap("Unknown escape sequence \\%c", r)) }