本文整理匯總了Golang中github.com/Dwarfartisan/goparsec2.Try函數的典型用法代碼示例。如果您正苦於以下問題:Golang Try函數的具體用法?Golang Try怎麽用?Golang Try使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了Try函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的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)
}
示例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)
}
}
}
示例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
}
示例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
}
示例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
}
示例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
}
}
示例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
}
}
示例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)
}
}
示例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)
}
}
示例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}
})
}
示例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
}
示例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
}
示例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)
}
示例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)
}
}
示例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
}
}