// StringValue 判断 state 中下一个值是否为 String func StringValue(st p.State) (interface{}, error) { return p.Do(func(state p.State) interface{} { val := p.P(p.One).Exec(state) if _, ok := val.(string); ok { return val } panic(st.Trap("expect a string but %v", val)) })(st) }
// FloatParser 解析浮点数 func FloatParser(state p.State) (interface{}, error) { return p.Do(func(st p.State) interface{} { f := p.Try(p.Float).Exec(st) val, err := strconv.ParseFloat(f.(string), 64) if err == nil { return Float(val) } panic(st.Trap("%v", err)) })(state) }
// AtomParserExt 生成带扩展包的 Atom func AtomParserExt(env Env) p.P { return p.Do(func(st p.State) interface{} { a := atomNameParser().Exec(st) t, err := p.Try(ExtTypeParser(env)).Parse(st) if err == nil { return Atom{a.(string), t.(Type)} } return Atom{a.(string), ANYMUST} }) }
func atomNameParser() p.P { return p.Do(func(state p.State) interface{} { ret := p.Many1(p.RuneNone("'[]() \t\r\n\".:")).Bind(p.ReturnString).Exec(state) test := p.BasicStateFromText(ret.(string)) _, err := p.Many1(p.Digit).Then(p.EOF).Parse(&test) if err == nil { p.Fail("atom name can't be a int like %s", ret) } return ret }) }
} 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)) } }) //用于rune var EscapeCharr = p.Do(func(st p.State) interface{} { p.Chr('\\').Exec(st) r := p.RuneOf("nrt'\\").Exec(st) ru := r.(rune)