diff options
| author | Christine Dodrill <me@christine.website> | 2019-06-25 22:59:06 +0000 |
|---|---|---|
| committer | Christine Dodrill <me@christine.website> | 2019-06-25 22:59:06 +0000 |
| commit | 96a073ecddf7eee051050347a09786dc38b3a8ac (patch) | |
| tree | 44644398eaf655e5be51cdbd8bab25330bc0bd58 /h/parser.go | |
| parent | ab2f1f58d4de28aa708cdbc1602c5ae1a941fce6 (diff) | |
| download | x-96a073ecddf7eee051050347a09786dc38b3a8ac.tar.xz x-96a073ecddf7eee051050347a09786dc38b3a8ac.zip | |
h
Diffstat (limited to 'h/parser.go')
| -rw-r--r-- | h/parser.go | 42 |
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 +} |
