aboutsummaryrefslogtreecommitdiff
path: root/h/parser.go
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2019-06-25 22:59:06 +0000
committerChristine Dodrill <me@christine.website>2019-06-25 22:59:06 +0000
commit96a073ecddf7eee051050347a09786dc38b3a8ac (patch)
tree44644398eaf655e5be51cdbd8bab25330bc0bd58 /h/parser.go
parentab2f1f58d4de28aa708cdbc1602c5ae1a941fce6 (diff)
downloadx-96a073ecddf7eee051050347a09786dc38b3a8ac.tar.xz
x-96a073ecddf7eee051050347a09786dc38b3a8ac.zip
h
Diffstat (limited to 'h/parser.go')
-rw-r--r--h/parser.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/h/parser.go b/h/parser.go
new file mode 100644
index 0000000..f061ec7
--- /dev/null
+++ b/h/parser.go
@@ -0,0 +1,42 @@
+package h
+
+//go:generate peggy -o h_gen.go h.peg
+
+import (
+ "fmt"
+
+ "github.com/eaburns/peggy/peg"
+ "within.website/x/jbo/namcu"
+)
+
+func (p *_Parser) Parse() (int, bool) {
+ pos, perr := _HAccepts(p, 0)
+ return perr, pos >= 0
+}
+
+func (p *_Parser) ErrorTree(minPos int) *peg.Fail {
+ p.fail = make(map[_key]*peg.Fail) // reset fail memo table
+ _, tree := _HFail(p, 0, minPos)
+ return tree
+}
+
+func (p *_Parser) ParseTree() *peg.Node {
+ _, tree := _HNode(p, 0)
+ return tree
+}
+
+// Parse parses h.
+// On success, the parseTree is returned.
+// On failure, both the word-level and the raw, morphological errors are returned.
+func Parse(text string) (*peg.Node, error) {
+ p := _NewParser(text)
+ if perr, ok := p.Parse(); !ok {
+ return nil, fmt.Errorf("h: gentoldra fi'o zvati zo %s", namcu.Lerfu(perr))
+ }
+
+ tree := p.ParseTree()
+ RemoveSpace(tree)
+ CollapseLists(tree)
+
+ return tree, nil
+}