package h
import (
"github.com/eaburns/peggy/peg"
)
const (
_sep int = 0
_space int = 1
_h int = 2
_H int = 3
_N int = 4
)
type _Parser struct {
text string
deltaPos [][_N]int32
deltaErr [][_N]int32
node map[_key]*peg.Node
fail map[_key]*peg.Fail
act map[_key]interface{}
lastFail int
data interface{}
}
type _key struct {
start int
rule int
}
type tooBigError struct{}
func (tooBigError) Error() string { return "input is too big" }
func _NewParser(text string) (*_Parser, error) {
n := len(text) + 1
if n < 0 {
return nil, tooBigError{}
}
p := &_Parser{
text: text,
deltaPos: make([][_N]int32, n),
deltaErr: make([][_N]int32, n),
node: make(map[_key]*peg.Node),
fail: make(map[_key]*peg.Fail),
act: make(map[_key]interface{}),
}
return p, nil
}
func _max(a, b int) int {
if a > b {
return a
}
return b
}
func _memoize(parser *_Parser, rule, start, pos, perr int) (int, int) {
parser.lastFail = perr
derr := perr - start
parser.deltaErr[start][rule] = int32(derr + 1)
if pos >= 0 {
dpos := pos - start
parser.deltaPos[start][rule] = int32(dpos + 1)
return dpos, derr
}
parser.deltaPos[start][rule] = -1
return -1, derr
}
func _memo(parser *_Parser, rule, start int) (int, int, bool) {
dp := parser.deltaPos[start][rule]
if dp == 0 {
return 0, 0, false
}
if dp > 0 {
dp--
}
de := parser.deltaErr[start][rule] - 1
return int(dp), int(de), true
}
func _failMemo(parser *_Parser, rule, start, errPos int) (int, *peg.Fail) {
if start > parser.lastFail {
return -1, &peg.Fail{}
}
dp := parser.deltaPos[start][rule]
de := parser.deltaErr[start][rule]
if start+int(de-1) < errPos {
if dp > 0 {
return start + int(dp-1), &peg.Fail{}
}
return -1, &peg.Fail{}
}
f := parser.fail[_key{start: start, rule: rule}]
if dp < 0 && f != nil {
return -1, f
}
if dp > 0 && f != nil {
return start + int(dp-1), f
}
return start, nil
}
func _accept(parser *_Parser, f func(*_Parser, int) (int, int), pos, perr *int) bool {
dp, de := f(parser, *pos)
*perr = _max(*perr, *pos+de)
if dp < 0 {
return false
}
*pos += dp
return true
}
func _node(parser *_Parser, f func(*_Parser, int) (int, *peg.Node), node *peg.Node, pos *int) bool {
p, kid := f(parser, *pos)
if kid == nil {
return false
}
node.Kids = append(node.Kids, kid)
*pos = p
return true
}
func _fail(parser *_Parser, f