Beispiel #1
0
// 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)
}
Beispiel #2
0
// 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)
}
Beispiel #3
0
// 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}
	})
}
Beispiel #4
0
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
	})
}
Beispiel #5
0
	}
	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)