• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Golang goparsec2.Try函数代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了Golang中github.com/Dwarfartisan/goparsec2.Try函数的典型用法代码示例。如果您正苦于以下问题:Golang Try函数的具体用法?Golang Try怎么用?Golang Try使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。



在下文中一共展示了Try函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。

示例1: 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


示例2: SuffixParserExt

// SuffixParserExt 在后缀表达式判定中允许传入环境
func SuffixParserExt(env Env) func(interface{}) p.P {
	return func(prefix interface{}) p.P {
		suffix := p.Choice(p.Try(DotSuffix(prefix)), BracketSuffixExt(env)(prefix))
		return func(st p.State) (interface{}, error) {
			s, err := p.Try(suffix)(st)
			if err != nil {
				return prefix, nil
			}
			return SuffixParserExt(env)(s)(st)
		}
	}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:13,代码来源:suffix.go


示例3: 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


示例4: divx

// divx 实现一个左折叠的 parsec 连除解析器,精度向上适配。
func divx(st p.State) (interface{}, error) {
	data, err := p.Try(p.Many(IntValue).Over(p.EOF))(st)
	if err == nil {
		ints := data.([]interface{})
		root := ints[0].(Int)
		for _, x := range ints[1:] {
			root /= x.(Int)
		}
		return root, nil
	}
	data, err = p.Many(NumberValue).Over(p.EOF)(st)
	if err == nil {
		numbers := data.([]interface{})
		root := numbers[0].(Float)
		for _, x := range numbers[1:] {
			root /= x.(Float)
		}
		return root, nil
	}

	if nerr, ok := err.(NotNumberError); ok {
		return nil, TypeSignError{Type: Type{FLOAT, false}, Value: nerr.Value}
	}
	return nil, err
}
开发者ID:kooksee,项目名称:gisp2,代码行数:26,代码来源:math.go


示例5: Parse

// Parse 分析JSON源码
func Parse(code string) (interface{}, error) {
	st := p.BasicStateFromText(code)
	var v interface{}
	var e error

	for {
		Skip(&st)
		_, err := p.Try(p.EOF)(&st)
		if err == nil {
			break
		}

		value, err := ValueParser()(&st)
		if err != nil {
			return nil, err
		}

		switch vv := value.(type) {
		default:
			v = vv
			e = nil
		}
	}
	return v, e
}
开发者ID:MarchLiu,项目名称:pjson,代码行数:26,代码来源:parse.go


示例6: 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


示例7: bracketSuffix

func bracketSuffix(x interface{}) p.P {
	return func(st p.State) (interface{}, error) {
		b, err := p.Try(BracketParser())(st)
		if err != nil {
			return x, nil
		}
		return Bracket{x, b.([]interface{})}, nil
	}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:9,代码来源:suffix.go


示例8: BracketSuffix

// BracketSuffix 表示带 [] 后缀的表达式
func BracketSuffix(x interface{}) p.P {
	return func(st p.State) (interface{}, error) {
		b, err := p.Try(BracketParser())(st)
		if err != nil {
			return nil, err
		}
		return bracketSuffix(Bracket{x, b.([]interface{})})(st)
	}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:10,代码来源:suffix.go


示例9: dotSuffix

func dotSuffix(x interface{}) p.P {
	return func(st p.State) (interface{}, error) {
		d, err := p.Try(DotParser)(st)
		if err != nil {
			return x, nil
		}
		return dotSuffix(Dot{x, d.(Atom)})(st)
	}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:9,代码来源:suffix.go


示例10: AtomParserExt

// 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}
	})
}
开发者ID:kooksee,项目名称:gisp2,代码行数:11,代码来源:atom.go


示例11: AtomParser

// AtomParser 生成 Atom 对象,但是它不带扩展环境
func AtomParser(st p.State) (interface{}, error) {
	a, err := atomNameParser().Parse(st)
	if err != nil {
		return nil, err
	}
	t, err := p.Try(TypeParser).Parse(st)
	if err == nil {
		return Atom{a.(string), t.(Type)}, nil
	}
	return Atom{a.(string), ANYMUST}, nil
}
开发者ID:kooksee,项目名称:gisp2,代码行数:12,代码来源:atom.go


示例12: 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


示例13: 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


示例14: 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


示例15: 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


示例16: addx

// addx 实现一个parsex累加解析器,精度向上适配。我一直觉得应该有一个简单的高效版本,不需要回溯的
// 但是目前还没有找到。
func addx(st p.State) (interface{}, error) {
	ints, err := p.Try(p.Many(IntValue).Over(p.EOF))(st)
	if err == nil {
		root := Int(0)
		for _, x := range ints.([]interface{}) {
			root += x.(Int)
		}
		return root, nil
	}
	numbers, err := p.Many(NumberValue).Over(p.EOF)(st)
	if err == nil {
		root := Float(0)
		for _, x := range numbers.([]interface{}) {
			root += x.(Float)
		}
		return root, nil
	}

	if nerr, ok := err.(NotNumberError); ok {
		return nil, TypeSignError{Type: FLOATMUST, Value: nerr.Value}
	}
	return nil, err
}
开发者ID:kooksee,项目名称:gisp2,代码行数:25,代码来源:math.go


示例17: ListParserExt

// ListParserExt 实现带扩展的列表解析器
func ListParserExt(env Env) p.P {
	left := p.Chr('(').Then(Skip)
	right := Skip.Then(p.Chr(')'))
	empty := left.Then(right)
	return func(st p.State) (interface{}, error) {
		list, err := p.Try(p.Between(left, right, bodyParserExt(env)))(st)
		if err == nil {
			switch l := list.(type) {
			case List:
				return L(l), nil
			case []interface{}:
				return List(l), nil
			default:
				return nil, fmt.Errorf("List Parser(ext) Error: %v type is unexpected: %v", list, reflect.TypeOf(list))
			}
		} else {
			_, e := empty(st)
			if e == nil {
				return List{}, nil
			}
			return nil, err
		}
	}
}
开发者ID:kooksee,项目名称:gisp2,代码行数:25,代码来源:parses.go


示例18: Parse

// Parse 解释执行一段文本
func (gisp *Gisp) Parse(code string) (interface{}, error) {
	st := p.BasicStateFromText(code)
	var v interface{}
	var e error
	for {
		Skip(&st)
		_, err := p.Try(p.EOF)(&st)
		if err == nil {
			break
		}
		value, err := ValueParserExt(gisp)(&st)
		if err != nil {
			return nil, err
		}
		switch lisp := value.(type) {
		case Lisp:
			v, e = lisp.Eval(gisp)
		default:
			v = lisp
			e = nil
		}
	}
	return v, e
}
开发者ID:kooksee,项目名称:gisp2,代码行数:25,代码来源:parser.go


示例19:

// 环境做了妥协
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


示例20: 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



注:本文中的github.com/Dwarfartisan/goparsec2.Try函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Golang goparsec2.State类代码示例发布时间:2022-05-23
下一篇:
Golang goparsec2.Choice函数代码示例发布时间:2022-05-23
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap