本文整理汇总了Golang中github.com/Dwarfartisan/goparsec2.Choice函数的典型用法代码示例。如果您正苦于以下问题:Golang Choice函数的具体用法?Golang Choice怎么用?Golang Choice使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Choice函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: ObjectParser
// ObjectParser 实现数组解析器
func ObjectParser() p.P {
return func(st p.State) (interface{}, error) {
left := p.Chr('{').Then(Skip)
right := Skip.Then(p.Chr('}'))
empty := p.Between(left, right, Skip)
object, err := p.Between(left, right, p.Many(p.Choice(objectBodyParser, p.NChr('}'))))(st)
if err != nil {
_, e := empty(st)
if e != nil {
return nil, err
}
return Object{}, nil
}
switch o := object.(type) {
case Object:
return O(o), nil
case map[string]interface{}:
return object.(map[string]interface{}), nil
default:
return nil, fmt.Errorf("Object Parser Error: %v type is unexpected: %v", object, reflect.TypeOf(object))
}
}
}
开发者ID:MarchLiu,项目名称:pjson,代码行数:27,代码来源:parsec.go
示例2: ListParser
// ListParser 实现数组解析器
func ListParser() p.P {
return func(st p.State) (interface{}, error) {
left := p.Chr('[').Then(Skip)
right := Skip.Then(p.Chr(']'))
empty := p.Between(left, right, Skip)
list, err := p.Between(left, right, p.Many(p.Choice(p.NChr(']'), listBodyParser)))(st)
fmt.Printf("list type :%v, value :%v, err: %v\n", reflect.TypeOf(list), list, err)
if err != nil {
_, e := empty(st)
if e != nil {
return nil, err
}
return List{}, nil
}
switch l := list.(type) {
case List:
return L(l), nil
case []interface{}:
return list.([]interface{}), nil
default:
return nil, fmt.Errorf("List Parser Error: %v type is unexpected: %v", list, reflect.TypeOf(list))
}
}
}
开发者ID:MarchLiu,项目名称:pjson,代码行数:27,代码来源:parsec.go
示例3: ExtTypeParser
// ExtTypeParser 定义了带环境的类型解释器
func ExtTypeParser(env Env) p.P {
return func(st p.State) (interface{}, error) {
_, err := p.Str("::")(st)
if err != nil {
return nil, err
}
builtin := p.Choice(
p.Try(typeName("bool").Then(p.Return(BOOL))),
p.Try(typeName("float").Then(p.Return(FLOAT))),
p.Try(typeName("int").Then(p.Return(INT))),
p.Try(typeName("string").Then(p.Return(STRING))),
p.Try(typeName("time").Then(p.Return(TIME))),
p.Try(typeName("duration").Then(p.Return(DURATION))),
p.Try(typeName("any").Then(p.Return(ANY))),
p.Try(typeName("atom").Then(p.Return(ATOM))),
p.Try(p.Str("list").Then(p.Return(LIST))),
p.Try(typeName("quote").Then(p.Return(QUOTE))),
p.Try(p.Str("dict").Then(p.Return(DICT))),
p.Try(MapTypeParserExt(env)),
)
ext := func(st p.State) (interface{}, error) {
n, err := anyType(st)
if err != nil {
return nil, err
}
t, ok := env.Lookup(n.(string))
if !ok {
return nil, st.Trap("type %v not found", n)
}
if typ, ok := t.(reflect.Type); ok {
return typ, nil
}
return nil, st.Trap("var %v is't a type. It is %v", n, reflect.TypeOf(t))
}
t, err := p.Choice(builtin, ext)(st)
if err != nil {
return nil, err
}
_, err = p.Try(p.Chr('?'))(st)
option := err == nil
return Type{t.(reflect.Type), option}, nil
}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:44,代码来源:type.go
示例4: SuffixParser
// SuffixParser 定义了后缀表达式的通用判定
func SuffixParser(prefix interface{}) p.P {
suffix := p.Choice(p.Try(DotSuffix(prefix)), BracketSuffix(prefix))
return func(st p.State) (interface{}, error) {
s, err := suffix(st)
if err != nil {
return prefix, nil
}
return SuffixParser(s)(st)
}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:11,代码来源:suffix.go
示例5: FloatParser
// FloatParser 解析浮点数
func FloatParser(st p.State) (interface{}, error) {
return p.Do(func(st p.State) interface{} {
f := p.Choice(p.Try(p.Float), p.Try(p.Int)).Exec(st)
val, err := strconv.ParseFloat(f.(string), 64)
if err == nil {
return Float(val)
}
panic(st.Trap("%v", err))
})(st)
}
开发者ID:damonchen,项目名称:pjson,代码行数:11,代码来源:float.go
示例6: QuoteParser
// QuoteParser 实现 Quote 语法的解析
func QuoteParser(st p.State) (interface{}, error) {
lisp, err := p.Chr('\'').Then(
p.Choice(
p.Try(p.P(AtomParser).Bind(SuffixParser)),
ListParser().Bind(SuffixParser),
))(st)
if err == nil {
return Quote{lisp}, nil
}
return nil, err
}
开发者ID:kooksee,项目名称:gisp2,代码行数:12,代码来源:parses.go
示例7: ValueParser
// ValueParser 实现简单的值解释器
func ValueParser() p.P {
return func(st p.State) (interface{}, error) {
value, err := p.Choice(p.Try(StringParser),
p.Try(FloatParser),
p.Try(ObjectParser()),
p.Try(ListParser()),
p.Try(BoolParser),
p.Try(NullParser),
)(st)
return value, err
}
}
开发者ID:damonchen,项目名称:pjson,代码行数:14,代码来源:parsec.go
示例8: stop
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
}
开发者ID:kooksee,项目名称:gisp2,代码行数:14,代码来源:type.go
示例9: ValueParser
// ValueParser 实现简单的值解释器
func ValueParser() p.P {
return func(state p.State) (interface{}, error) {
value, err := p.Choice(p.Try(StringParser),
p.Try(FloatParser),
p.Try(IntParser),
p.Try(RuneParser),
p.Try(StringParser),
p.Try(BoolParser),
p.Try(NilParser),
p.Try(p.P(AtomParser).Bind(SuffixParser)),
p.Try(p.P(ListParser()).Bind(SuffixParser)),
p.Try(DotExprParser),
QuoteParser,
)(state)
return value, err
}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:18,代码来源:parses.go
示例10: ValueParserExt
// ValueParserExt 表示带扩展的值解释器
func ValueParserExt(env Env) p.P {
return func(st p.State) (interface{}, error) {
value, err := p.Choice(p.Try(StringParser),
p.Try(FloatParser),
p.Try(IntParser),
p.Try(RuneParser),
p.Try(StringParser),
p.Try(BoolParser),
p.Try(NilParser),
p.Try(AtomParserExt(env).Bind(SuffixParserExt(env))),
p.Try(ListParserExt(env).Bind(SuffixParserExt(env))),
p.Try(DotExprParser),
p.Try(BracketExprParserExt(env)),
QuoteParserExt(env),
)(st)
return value, err
}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:19,代码来源:parses.go
示例11: compare
func compare(st p.State) (interface{}, error) {
l, err := p.Choice(
p.Try(IntValue).Bind(LessThanNumber),
p.Try(NumberValue).Bind(LessThanFloat),
p.Try(StringValue).Bind(LessThanString),
p.P(TimeValue).Bind(LessThanTime),
).Bind(func(l interface{}) p.P {
return func(st p.State) (interface{}, error) {
_, err := p.EOF(st)
if err != nil {
return nil, fmt.Errorf("less args sign error: expect eof")
}
return l, nil
}
})(st)
if err == nil {
return l, nil
}
return nil, fmt.Errorf("expect two lessable values compare but error %v", err)
}
开发者ID:kooksee,项目名称:gisp2,代码行数:20,代码来源:compare.go
示例12: TypeParser
// TypeParser 定义了一个基本的类型解释器
func TypeParser(st p.State) (interface{}, error) {
t, err := p.Str("::").Then(
p.Choice(
p.Try(p.Str("bool").Then(p.Return(BOOL))),
p.Try(p.Str("float").Then(p.Return(FLOAT))),
p.Try(p.Str("int").Then(p.Return(INT))),
p.Try(p.Str("string").Then(p.Return(STRING))),
p.Try(p.Str("time").Then(p.Return(TIME))),
p.Try(p.Str("duration").Then(p.Return(DURATION))),
p.Try(p.Str("any").Then(p.Return(ANY))),
p.Try(p.Str("atom").Then(p.Return(ATOM))),
p.Try(p.Str("list").Then(p.Return(LIST))),
p.Try(p.Str("quote").Then(p.Return(QUOTE))),
p.Try(p.Str("dict").Then(p.Return(DICT))),
MapTypeParser,
))(st)
if err != nil {
return nil, err
}
_, err = p.Try(p.Chr('?'))(st)
option := err == nil
return Type{t.(reflect.Type), option}, nil
}
开发者ID:kooksee,项目名称:gisp2,代码行数:24,代码来源:type.go
示例13: less
func less(env Env) p.P {
return func(st p.State) (interface{}, error) {
l, err := p.Choice(
p.Try(p.P(IntValue).Bind(LessThanNumber)),
p.Try(p.P(NumberValue).Bind(LessThanFloat)),
p.Try(p.P(StringValue).Bind(LessThanString)),
p.Try(p.P(TimeValue).Bind(LessThanTime)),
p.P(ListValue).Bind(LessThanList(env)),
).Bind(func(l interface{}) p.P {
return func(st p.State) (interface{}, error) {
_, err := p.EOF(st)
if err != nil {
return nil, st.Trap("less args sign error: expect eof")
}
return l, nil
}
})(st)
if err == nil {
return l, nil
}
return nil, st.Trap("expect two lessable values compare but error %v", err)
}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:23,代码来源:compare.go
示例14: objectBodyParser
func objectBodyParser(st p.State) (interface{}, error) {
return p.SepBy1(ValueParser(), p.Choice(Colon))(st)
}
开发者ID:MarchLiu,项目名称:pjson,代码行数:3,代码来源:parsec.go
示例15: stopWord
)(st)
if err != nil {
return nil, err
}
return r, nil
}
func stopWord(x interface{}) p.P {
return p.P(stop).Then(p.Return(x))
}
func typeName(word string) p.P {
return p.Str(word).Bind(stopWord)
}
var anyType = p.Many1(p.Choice(p.Try(p.Digit), p.Letter)).Bind(stopWord).Bind(p.ReturnString)
// SliceTypeParserExt 定义了带环境的序列类型解析逻辑
func SliceTypeParserExt(env Env) p.P {
return func(st p.State) (interface{}, error) {
t, err := p.Str("[]").Then(ExtTypeParser(env))(st)
if err != nil {
return nil, err
}
return reflect.SliceOf(t.(Type).Type), nil
}
}
// MapTypeParserExt 定义了带环境的映射类型解析逻辑
func MapTypeParserExt(env Env) p.P {
return func(st p.State) (interface{}, error) {
开发者ID:kooksee,项目名称:gisp2,代码行数:31,代码来源:type.go
示例16:
func(args ...interface{}) Tasker {
return func(env Env) (interface{}, error) {
return MakeRecvChan(args[0].(reflect.Type), args[1].(Int)), nil
}
}},
"chan<-": SimpleBox{
SignChecker(TypeAs(reflect.TypeOf((*reflect.Type)(nil)).Elem()).
Then(TypeAs(INT)).Then(p.EOF)),
func(args ...interface{}) Tasker {
return func(env Env) (interface{}, error) {
return MakeSendChan(args[0].(reflect.Type), args[1].(Int)), nil
}
}},
"send": SimpleBox{
SignChecker(TypeAs(reflect.TypeOf((*Chan)(nil))).
Then(p.Choice(p.Try(TypeAs(ANYOPTION)), TypeAs(ANYMUST))).
Then(p.EOF)),
func(args ...interface{}) Tasker {
return func(env Env) (interface{}, error) {
ch := args[0].(*Chan)
ch.Send(args[1])
return nil, nil
}
}},
"send?": SimpleBox{
SignChecker(TypeAs(reflect.TypeOf((*Chan)(nil))).
Then(p.Choice(p.Try(TypeAs(ANYOPTION)), TypeAs(ANYMUST))).
Then(p.EOF)),
func(args ...interface{}) Tasker {
return func(env Env) (interface{}, error) {
ch := args[0].(*Chan)
开发者ID:kooksee,项目名称:gisp2,代码行数:31,代码来源:channel.go
示例17: BracketSuffixParser
// BracketSuffixParser 定义 bracket 表达式判定
func BracketSuffixParser(x interface{}) p.P {
return p.Choice(p.Try(BracketSuffix(x)), p.Return(x))
}
开发者ID:kooksee,项目名称:gisp2,代码行数:4,代码来源:suffix.go
示例18: ExtReverseExpr
func ExtReverseExpr(expr func(Env) p.P) LispExpr {
return func(env Env, args ...interface{}) (Lisp, error) {
return ParsecReverseExpr(expr(env))(env, args...)
}
}
var addExpr = ParsecExpr(addx)
var subExpr = ParsecExpr(subx)
var mulExpr = ParsecExpr(mulx)
var divExpr = ParsecExpr(divx)
var lessExpr = ExtExpr(less)
var lsoExpr = ExtExpr(lessOption)
var leExpr = OrExtRExpr(equals, less)
var leoExpr = OrExtRExpr(equalsOption, lessOption)
var cmpExpr = ParsecExpr(compare)
var greatExpr = ExtReverseExpr(less)
var gtoExpr = ExtReverseExpr(lessOption)
var geExpr = OrExtRExpr(equals, less)
var geoExpr = func(env Env, args ...interface{}) (Lisp, error) {
st := p.NewBasicState(args)
ret, err := p.Choice(p.Try(NotParsec(less(env))), FalseIfHasNil)(&st)
if err != nil {
return nil, err
}
return Q(ret), nil
}
var eqsExpr = ParsecExpr(equals)
var eqsoExpr = ParsecExpr(equalsOption)
var neqsExpr = NotExpr(eqsExpr)
var neqsoExpr = ParsecExpr(neqsOption)
开发者ID:kooksee,项目名称:gisp2,代码行数:30,代码来源:proposition.go
示例19:
package pjson
import (
"fmt"
p "github.com/Dwarfartisan/goparsec2"
)
// Bool 是内置的 bool 类型
type Bool bool
// BoolParser 解析 bool
// BoolParser 解析 bool
var BoolParser = p.Choice(p.Str("true"), p.Str("false")).Bind(func(input interface{}) p.P {
return func(st p.State) (interface{}, error) {
switch input.(string) {
case "true":
return Bool(true), nil
case "false":
return Bool(false), nil
default:
return nil, fmt.Errorf("Unexpect bool token %v", input)
}
}
})
// var BoolParser = p.Do(func(st p.State) interface{} {
// f := p.Try(p.Bool).Exec(st)
// switch f.(string) {
// case "true":
// return Bool(true), nil
开发者ID:MarchLiu,项目名称:pjson,代码行数:31,代码来源:bool.go
示例20:
// 环境做了妥协
var Axiom = Toolkit{
Meta: map[string]interface{}{
"name": "axiom",
"category": "package",
},
Content: map[string]interface{}{
"quote": LispExpr(func(env Env, args ...interface{}) (Lisp, error) {
if len(args) != 1 {
return nil, fmt.Errorf("Quote Args Error: expect only one arg but %v", args)
}
return Q(Q(args[0])), nil
}),
"var": LispExpr(func(env Env, args ...interface{}) (Lisp, error) {
st := p.NewBasicState(args)
_, err := TypeAs(ATOM).Then(p.Choice(p.Try(p.EOF), p.P(p.One).Then(p.EOF)))(&st)
if err != nil {
return nil, err
}
first := args[0].(Atom)
slot := VarSlot(first.Type)
if len(args) == 1 {
err := env.Defvar(first.Name, slot)
return Q(nil), err
}
val, err := Eval(env, args[1])
slot.Set(val)
err = env.Defvar(first.Name, slot)
return Q(val), err
}),
开发者ID:kooksee,项目名称:gisp2,代码行数:31,代码来源:axiom.go
注:本文中的github.com/Dwarfartisan/goparsec2.Choice函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论