summaryrefslogtreecommitdiff
path: root/parser.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 /parser.go
parent132876fce437c35fc861b0796cd231405250bbd5 (diff)
*Node -> Node
Diffstat (limited to 'parser.go')
-rw-r--r--parser.go32
1 files changed, 16 insertions, 16 deletions
diff --git a/parser.go b/parser.go
index 2da450f..c6d7f9b 100644
--- a/parser.go
+++ b/parser.go
@@ -9,11 +9,11 @@ import (
type Node struct {
Token string
- Children []*Node
+ Children []Node
Result interface{}
}
-type Parser func(*State) *Node
+type Parser func(*State) Node
// Parserish types are any type that can be turned into a Parser by Parsify
// These currently include *Parser and string literals.
@@ -35,13 +35,13 @@ func Parsify(p Parserish) Parser {
switch p := p.(type) {
case nil:
return nil
- case func(*State) *Node:
+ case func(*State) Node:
return NewParser("anonymous func", p)
case Parser:
return p
case *Parser:
// Todo: Maybe capture this stack and on nil show it? Is there a good error library to do this?
- return func(ptr *State) *Node {
+ return func(ptr *State) Node {
return (*p)(ptr)
}
case string:
@@ -60,9 +60,9 @@ func ParsifyAll(parsers ...Parserish) []Parser {
}
func WS() Parser {
- return NewParser("AutoWS", func(ps *State) *Node {
+ return NewParser("AutoWS", func(ps *State) Node {
ps.WS()
- return nil
+ return Node{}
})
}
@@ -81,16 +81,16 @@ func ParseString(parser Parserish, input string) (result interface{}, remaining
}
func Exact(match string) Parser {
- return NewParser(match, func(ps *State) *Node {
+ return NewParser(match, func(ps *State) Node {
ps.AutoWS()
if !strings.HasPrefix(ps.Get(), match) {
ps.ErrorHere(match)
- return nil
+ return Node{}
}
ps.Advance(len(match))
- return &Node{Token: match}
+ return Node{Token: match}
})
}
@@ -149,7 +149,7 @@ func charsImpl(matcher string, stopOn bool, repetition ...int) Parser {
min, max := parseRepetition(1, -1, repetition...)
matches, ranges := parseMatcher(matcher)
- return func(ps *State) *Node {
+ return func(ps *State) Node {
ps.AutoWS()
matched := 0
for ps.Pos+matched < len(ps.Input) {
@@ -177,17 +177,17 @@ func charsImpl(matcher string, stopOn bool, repetition ...int) Parser {
if matched < min {
ps.ErrorHere(matcher)
- return nil
+ return Node{}
}
result := ps.Input[ps.Pos : ps.Pos+matched]
ps.Advance(matched)
- return &Node{Token: result}
+ return Node{Token: result}
}
}
func String(quote rune) Parser {
- return NewParser("string", func(ps *State) *Node {
+ return NewParser("string", func(ps *State) Node {
ps.AutoWS()
var r rune
var w int
@@ -195,7 +195,7 @@ func String(quote rune) Parser {
r, matched = utf8.DecodeRuneInString(ps.Input[ps.Pos:])
if r != quote {
ps.ErrorHere("\"")
- return nil
+ return Node{}
}
result := &bytes.Buffer{}
@@ -213,12 +213,12 @@ func String(quote rune) Parser {
if r == quote {
ps.Advance(matched)
- return &Node{Token: result.String()}
+ return Node{Token: result.String()}
}
result.WriteRune(r)
}
ps.ErrorHere("\"")
- return nil
+ return Node{}
})
}