summaryrefslogtreecommitdiff
path: root/combinator.go
diff options
context:
space:
mode:
authorAdam Scarr <adam@vektah.net>2017-08-07 21:45:12 +1000
committerAdam Scarr <adam@vektah.net>2017-08-07 21:45:12 +1000
commit88aaf567a51e9a0b11322db8a967f54057a7e340 (patch)
treebec13c95851d2b4fad9bbc529e1033414ff230ed /combinator.go
parent132876fce437c35fc861b0796cd231405250bbd5 (diff)
*Node -> Node
Diffstat (limited to 'combinator.go')
-rw-r--r--combinator.go50
1 files changed, 24 insertions, 26 deletions
diff --git a/combinator.go b/combinator.go
index 15e6cea..48aef09 100644
--- a/combinator.go
+++ b/combinator.go
@@ -4,8 +4,8 @@ import (
"bytes"
)
-var Nil = NewParser("Nil", func(ps *State) *Node {
- return nil
+var Nil = NewParser("Nil", func(ps *State) Node {
+ return Node{}
})
func And(parsers ...Parserish) Parser {
@@ -15,26 +15,24 @@ func And(parsers ...Parserish) Parser {
parserfied := ParsifyAll(parsers...)
- return NewParser("And()", func(ps *State) *Node {
- var nodes = make([]*Node, 0, len(parserfied))
+ return NewParser("And()", func(ps *State) Node {
+ var nodes = make([]Node, 0, len(parserfied))
startpos := ps.Pos
for _, parser := range parserfied {
node := parser(ps)
if ps.Errored() {
ps.Pos = startpos
- return nil
- }
- if node != nil {
- nodes = append(nodes, node)
+ return Node{}
}
+ nodes = append(nodes, node)
}
- return &Node{Children: nodes}
+ return Node{Children: nodes}
})
}
func NoAutoWS(parser Parserish) Parser {
parserfied := Parsify(parser)
- return func(ps *State) *Node {
+ return func(ps *State) Node {
ps.NoAutoWS = true
ret := parserfied(ps)
@@ -51,7 +49,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 {
@@ -68,7 +66,7 @@ func Any(parsers ...Parserish) Parser {
ps.Error = longestError
ps.Pos = startpos
- return nil
+ return Node{}
})
}
@@ -96,9 +94,9 @@ func manyImpl(min int, op Parserish, until Parserish, sep ...Parserish) Parser {
sepParser = Parsify(sep[0])
}
- return func(ps *State) *Node {
- var node *Node
- nodes := make([]*Node, 0, 20)
+ return func(ps *State) Node {
+ var node Node
+ nodes := make([]Node, 0, 20)
startpos := ps.Pos
for {
tempPos := ps.Pos
@@ -109,7 +107,7 @@ func manyImpl(min int, op Parserish, until Parserish, sep ...Parserish) Parser {
if len(nodes) < min {
ps.Pos = startpos
ps.ErrorHere("something else")
- return nil
+ return Node{}
}
break
}
@@ -120,7 +118,7 @@ func manyImpl(min int, op Parserish, until Parserish, sep ...Parserish) Parser {
if ps.Errored() {
if len(nodes) < min {
ps.Pos = startpos
- return nil
+ return Node{}
}
ps.ClearError()
break
@@ -134,37 +132,37 @@ func manyImpl(min int, op Parserish, until Parserish, sep ...Parserish) Parser {
break
}
}
- return &Node{Children: nodes}
+ return Node{Children: nodes}
}
}
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()
- return nil
+ return Node{}
}
return node
})
}
-func Map(parser Parserish, f func(n *Node) *Node) 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
+ return Node{}
}
return f(node)
})
}
-func flatten(n *Node) string {
+func flatten(n Node) string {
if n.Token != "" {
return n.Token
}
@@ -181,7 +179,7 @@ func flatten(n *Node) string {
}
func Merge(parser Parserish) Parser {
- return NewParser("Merge()", Map(parser, func(n *Node) *Node {
- return &Node{Token: flatten(n)}
+ return NewParser("Merge()", Map(parser, func(n Node) Node {
+ return Node{Token: flatten(n)}
}))
}