aboutsummaryrefslogtreecommitdiff
path: root/cmd/hlang/h/parser.go
diff options
context:
space:
mode:
authorXe <me@christine.website>2022-12-30 10:13:56 -0500
committerXe <me@christine.website>2022-12-30 10:13:56 -0500
commite3e8ebbcf82f221d026385c5a85d0afde62b3e3d (patch)
tree1ab8a5811db5a64ed14d3112e47730d0fe97325a /cmd/hlang/h/parser.go
parent9bdbd3156177640afaf18ca2c4ad783138004e4a (diff)
downloadx-e3e8ebbcf82f221d026385c5a85d0afde62b3e3d.tar.xz
x-e3e8ebbcf82f221d026385c5a85d0afde62b3e3d.zip
add old hlang draft
Signed-off-by: Xe <me@christine.website>
Diffstat (limited to 'cmd/hlang/h/parser.go')
-rw-r--r--cmd/hlang/h/parser.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/cmd/hlang/h/parser.go b/cmd/hlang/h/parser.go
new file mode 100644
index 0000000..4daa833
--- /dev/null
+++ b/cmd/hlang/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 fe li %s", namcu.Lerfu(perr))
+ }
+
+ tree := p.ParseTree()
+ RemoveSpace(tree)
+ CollapseLists(tree)
+
+ return tree, nil
+}