diff options
author | Adam Scarr <adam@vektah.net> | 2017-08-07 21:38:46 +1000 |
---|---|---|
committer | Adam Scarr <adam@vektah.net> | 2017-08-07 21:38:46 +1000 |
commit | 132876fce437c35fc861b0796cd231405250bbd5 (patch) | |
tree | 409078673207a3745606a83a32407faa8ad0dd06 /combinator.go | |
parent | a656dc0d78c5f51a16dc4c26936d337cdae5105c (diff) |
Small perf tweaks
Diffstat (limited to 'combinator.go')
-rw-r--r-- | combinator.go | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/combinator.go b/combinator.go index 12991a3..15e6cea 100644 --- a/combinator.go +++ b/combinator.go @@ -8,11 +8,6 @@ var Nil = NewParser("Nil", func(ps *State) *Node { return nil }) -var Never = NewParser("Never", func(ps *State) *Node { - ps.ErrorHere("not anything") - return nil -}) - func And(parsers ...Parserish) Parser { if len(parsers) == 0 { return Nil @@ -20,7 +15,7 @@ func And(parsers ...Parserish) Parser { parserfied := ParsifyAll(parsers...) - return NewParser("And", func(ps *State) *Node { + return NewParser("And()", func(ps *State) *Node { var nodes = make([]*Node, 0, len(parserfied)) startpos := ps.Pos for _, parser := range parserfied { @@ -56,7 +51,7 @@ func Any(parsers ...Parserish) Parser { parserfied := ParsifyAll(parsers...) - return NewParser("Any", func(ps *State) *Node { + return NewParser("Any()", func(ps *State) *Node { longestError := Error{} startpos := ps.Pos for _, parser := range parserfied { @@ -78,19 +73,19 @@ func Any(parsers ...Parserish) Parser { } func Kleene(opScan Parserish, sepScan ...Parserish) Parser { - return NewParser("Kleene", manyImpl(0, opScan, Never, sepScan...)) + return NewParser("Kleene()", manyImpl(0, opScan, nil, sepScan...)) } func KleeneUntil(opScan Parserish, untilScan Parserish, sepScan ...Parserish) Parser { - return NewParser("KleeneUntil", manyImpl(0, opScan, untilScan, sepScan...)) + return NewParser("KleeneUntil()", manyImpl(0, opScan, untilScan, sepScan...)) } func Many(opScan Parserish, sepScan ...Parserish) Parser { - return NewParser("Many", manyImpl(1, opScan, Never, sepScan...)) + return NewParser("Many()", manyImpl(1, opScan, nil, sepScan...)) } func ManyUntil(opScan Parserish, untilScan Parserish, sepScan ...Parserish) Parser { - return NewParser("ManyUntil", manyImpl(1, opScan, untilScan, sepScan...)) + return NewParser("ManyUntil()", manyImpl(1, opScan, untilScan, sepScan...)) } func manyImpl(min int, op Parserish, until Parserish, sep ...Parserish) Parser { @@ -107,17 +102,19 @@ func manyImpl(min int, op Parserish, until Parserish, sep ...Parserish) Parser { startpos := ps.Pos for { tempPos := ps.Pos - node = untilParser(ps) - if !ps.Errored() { - ps.Pos = tempPos - if len(nodes) < min { - ps.Pos = startpos - ps.ErrorHere("something else") - return nil + if untilParser != nil { + node = untilParser(ps) + if !ps.Errored() { + ps.Pos = tempPos + if len(nodes) < min { + ps.Pos = startpos + ps.ErrorHere("something else") + return nil + } + break } - break + ps.ClearError() } - ps.ClearError() node = opParser(ps) if ps.Errored() { @@ -144,7 +141,7 @@ func manyImpl(min int, op Parserish, until Parserish, sep ...Parserish) Parser { func Maybe(parser Parserish) Parser { parserfied := Parsify(parser) - return NewParser("Maybe", func(ps *State) *Node { + return NewParser("Maybe()", func(ps *State) *Node { node := parserfied(ps) if ps.Errored() { ps.ClearError() @@ -158,7 +155,7 @@ func Maybe(parser Parserish) Parser { func Map(parser Parserish, f func(n *Node) *Node) Parser { p := Parsify(parser) - return NewParser("Map", func(ps *State) *Node { + return NewParser("Map()", func(ps *State) *Node { node := p(ps) if ps.Errored() { return nil @@ -184,7 +181,7 @@ func flatten(n *Node) string { } func Merge(parser Parserish) Parser { - return NewParser("Merge", Map(parser, func(n *Node) *Node { + return NewParser("Merge()", Map(parser, func(n *Node) *Node { return &Node{Token: flatten(n)} })) } |