// NumberValue 将所有整型和浮点型处理为 Float ,其它类型不接受 func NumberValue(st px.ParsexState) (interface{}, error) { v, err := st.Next(px.Always) 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} } }
// IntVal 尝试将 state 中的下一个数据解为 int func IntVal(st px.ParsexState) (interface{}, error) { x, err := st.Next(px.Always) if err != nil { return nil, err } if _, ok := x.(Int); ok { return x, nil } return nil, fmt.Errorf("except a Int value but got %v", x) }
// not equals function, NotEqual or !=, if anyone is nil, return false func neqsOption(st px.ParsexState) (interface{}, error) { x, err := st.Next(px.Always) if err != nil { return nil, err } if x == nil { return false, nil } for { y, err := st.Next(px.Always) 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 } } }