// NumberValue 将所有整型和浮点型处理为 Float ,其它类型不接受 func NumberValue(st p.State) (interface{}, error) { v, err := st.Next() if err != nil { return nil, err } switch val := v.(type) { case int: return Float(val), nil case int8: return Float(val), nil case int16: return Float(val), nil case int32: return Float(val), nil case int64: return Float(val), nil case Int: return Float(val), nil case float32: return Float(val), nil case float64: return Float(val), nil case Float: return val, nil default: return nil, NotNumberError{v} } }
// 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(st 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)) })(st) }
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 }
// IntValue 将所有整型处理为 Int ,其它类型不接受 func IntValue(st p.State) (interface{}, error) { v, err := st.Next() if err != nil { return nil, err } switch val := v.(type) { case int: return Int(val), nil case int8: return Int(val), nil case int16: return Int(val), nil case int32: return Int(val), nil case int64: return Int(val), nil case Int: return val, nil default: return nil, NotIntError{v} } }
// not equals function, NotEqual or !=, if anyone is nil, return false func neqsOption(st p.State) (interface{}, error) { x, err := st.Next() if err != nil { return nil, err } if x == nil { return false, nil } for { y, err := st.Next() if err != nil { if reflect.DeepEqual(err, io.EOF) { return false, nil } return nil, err } if y == nil { return false, nil } if !reflect.DeepEqual(x, y) { return true, nil } } }