diff --git a/char_test.go b/char_test.go index b674a3e..9e2d9e8 100644 --- a/char_test.go +++ b/char_test.go @@ -1,17 +1 @@ package treerack - -import ( - "bufio" - "bytes" - "testing" -) - -func TestCharBuildNoop(t *testing.T) { - c := newChar("foo", false, nil, nil) - c.init(newRegistry()) - b := c.builder() - ctx := newContext(bufio.NewReader(bytes.NewBuffer(nil))) - if n, ok := b.build(ctx); len(n) != 0 || ok { - t.Error("char build not noop") - } -} diff --git a/escape.go b/escape.go index f938526..359c73e 100644 --- a/escape.go +++ b/escape.go @@ -91,7 +91,3 @@ func unescape(escape rune, banned, chars []rune) ([]rune, error) { return unescaped, nil } - -func unescapeCharSequence(s string) ([]rune, error) { - return unescape('\\', []rune{'"', '\\'}, []rune(s)) -} diff --git a/gendoc.go b/gendoc.go index 7289fd1..022548f 100644 --- a/gendoc.go +++ b/gendoc.go @@ -14,7 +14,7 @@ unless explicitly stated otherwise, if treerack's license allows changing the license of this source code. Treerack's license: MIT https://opensource.org/licenses/MIT -where YEAR=2018, COPYRIGHT HOLDER=Arpad Ryszka (arpad.ryszka@gmail.com) +where YEAR=2017, COPYRIGHT HOLDER=Arpad Ryszka (arpad.ryszka@gmail.com) The rest of the content of this file falls under the same license as the one that the user of treerack generating this file declares for it, or it is diff --git a/head.go b/head.go index 3b2fbe8..b15f52f 100644 --- a/head.go +++ b/head.go @@ -1,4 +1,4 @@ package treerack // generated with scripts/createhead.go -const headCode = "import (\n\t\"strconv\"\n\t\"io\"\n\t\"strings\"\n\t\"unicode\"\n\t\"fmt\"\n\t\"bufio\"\n\t\"errors\"\n)\n\ntype charParser struct {\n\tname\tstring\n\tid\tint\n\tnot\tbool\n\tchars\t[]rune\n\tranges\t[][]rune\n}\ntype charBuilder struct {\n\tname\tstring\n\tid\tint\n}\n\nfunc (p *charParser) nodeName() string {\n\treturn p.name\n}\nfunc (p *charParser) nodeID() int {\n\treturn p.id\n}\nfunc (p *charParser) commitType() CommitType {\n\treturn Alias\n}\nfunc matchChar(chars []rune, ranges [][]rune, not bool, char rune) bool {\n\tfor _, ci := range chars {\n\t\tif ci == char {\n\t\t\treturn !not\n\t\t}\n\t}\n\tfor _, ri := range ranges {\n\t\tif char >= ri[0] && char <= ri[1] {\n\t\t\treturn !not\n\t\t}\n\t}\n\treturn not\n}\nfunc (p *charParser) match(t rune) bool {\n\treturn matchChar(p.chars, p.ranges, p.not, t)\n}\nfunc (p *charParser) parse(c *context) {\n\tif tok, ok := c.token(); !ok || !p.match(tok) {\n\t\tif c.offset > c.failOffset {\n\t\t\tc.failOffset = c.offset\n\t\t\tc.failingParser = nil\n\t\t}\n\t\tc.fail(c.offset)\n\t\treturn\n\t}\n\tc.success(c.offset + 1)\n}\nfunc (b *charBuilder) nodeName() string {\n\treturn b.name\n}\nfunc (b *charBuilder) nodeID() int {\n\treturn b.id\n}\nfunc (b *charBuilder) build(c *context) ([]*Node, bool) {\n\treturn nil, false\n}\n\ntype sequenceParser struct {\n\tname\t\tstring\n\tid\t\tint\n\tcommit\t\tCommitType\n\titems\t\t[]parser\n\tranges\t\t[][]int\n\tgeneralizations\t[]int\n\tallChars\tbool\n}\ntype sequenceBuilder struct {\n\tname\t\tstring\n\tid\t\tint\n\tcommit\t\tCommitType\n\titems\t\t[]builder\n\tranges\t\t[][]int\n\tallChars\tbool\n}\n\nfunc (p *sequenceParser) nodeName() string {\n\treturn p.name\n}\nfunc (p *sequenceParser) nodeID() int {\n\treturn p.id\n}\nfunc (p *sequenceParser) commitType() CommitType {\n\treturn p.commit\n}\nfunc (p *sequenceParser) parse(c *context) {\n\tif !p.allChars {\n\t\tif c.results.pending(c.offset, p.id) {\n\t\t\tc.fail(c.offset)\n\t\t\treturn\n\t\t}\n\t\tc.results.markPending(c.offset, p.id)\n\t}\n\tvar (\n\t\tcurrentCount\tint\n\t\tparsed\t\tbool\n\t)\n\titemIndex := 0\n\tfrom := c.offset\n\tto := c.offset\n\tfor itemIndex < len(p.items) {\n\t\tp.items[itemIndex].parse(c)\n\t\tif !c.matchLast {\n\t\t\tif currentCount >= p.ranges[itemIndex][0] {\n\t\t\t\titemIndex++\n\t\t\t\tcurrentCount = 0\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif c.failingParser == nil && p.commit&userDefined != 0 && p.commit&Whitespace == 0 && p.commit&FailPass == 0 {\n\t\t\t\tc.failingParser = p\n\t\t\t}\n\t\t\tc.fail(from)\n\t\t\tif !p.allChars {\n\t\t\t\tc.results.unmarkPending(from, p.id)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tparsed = c.offset > to\n\t\tif parsed {\n\t\t\tcurrentCount++\n\t\t}\n\t\tto = c.offset\n\t\tif !parsed || p.ranges[itemIndex][1] > 0 && currentCount == p.ranges[itemIndex][1] {\n\t\t\titemIndex++\n\t\t\tcurrentCount = 0\n\t\t}\n\t}\n\tfor _, g := range p.generalizations {\n\t\tif c.results.pending(from, g) {\n\t\t\tc.results.setMatch(from, g, to)\n\t\t}\n\t}\n\tif to > c.failOffset {\n\t\tc.failOffset = -1\n\t\tc.failingParser = nil\n\t}\n\tc.results.setMatch(from, p.id, to)\n\tc.success(to)\n\tif !p.allChars {\n\t\tc.results.unmarkPending(from, p.id)\n\t}\n}\nfunc (b *sequenceBuilder) nodeName() string {\n\treturn b.name\n}\nfunc (b *sequenceBuilder) nodeID() int {\n\treturn b.id\n}\nfunc (b *sequenceBuilder) build(c *context) ([]*Node, bool) {\n\tto, ok := c.results.longestMatch(c.offset, b.id)\n\tif !ok {\n\t\treturn nil, false\n\t}\n\tfrom := c.offset\n\tparsed := to > from\n\tif b.allChars {\n\t\tc.offset = to\n\t\tif b.commit&Alias != 0 {\n\t\t\treturn nil, true\n\t\t}\n\t\treturn []*Node{{Name: b.name, From: from, To: to, tokens: c.tokens}}, true\n\t} else if parsed {\n\t\tc.results.dropMatchTo(c.offset, b.id, to)\n\t} else {\n\t\tif c.results.pending(c.offset, b.id) {\n\t\t\treturn nil, false\n\t\t}\n\t\tc.results.markPending(c.offset, b.id)\n\t}\n\tvar (\n\t\titemIndex\tint\n\t\tcurrentCount\tint\n\t\tnodes\t\t[]*Node\n\t)\n\tfor itemIndex < len(b.items) {\n\t\titemFrom := c.offset\n\t\tn, ok := b.items[itemIndex].build(c)\n\t\tif !ok {\n\t\t\titemIndex++\n\t\t\tcurrentCount = 0\n\t\t\tcontinue\n\t\t}\n\t\tif c.offset > itemFrom {\n\t\t\tnodes = append(nodes, n...)\n\t\t\tcurrentCount++\n\t\t\tif b.ranges[itemIndex][1] > 0 && currentCount == b.ranges[itemIndex][1] {\n\t\t\t\titemIndex++\n\t\t\t\tcurrentCount = 0\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif currentCount < b.ranges[itemIndex][0] {\n\t\t\tfor i := 0; i < b.ranges[itemIndex][0]-currentCount; i++ {\n\t\t\t\tnodes = append(nodes, n...)\n\t\t\t}\n\t\t}\n\t\titemIndex++\n\t\tcurrentCount = 0\n\t}\n\tif !parsed {\n\t\tc.results.unmarkPending(from, b.id)\n\t}\n\tif b.commit&Alias != 0 {\n\t\treturn nodes, true\n\t}\n\treturn []*Node{{Name: b.name, From: from, To: to, Nodes: nodes, tokens: c.tokens}}, true\n}\n\ntype choiceParser struct {\n\tname\t\tstring\n\tid\t\tint\n\tcommit\t\tCommitType\n\toptions\t\t[]parser\n\tgeneralizations\t[]int\n}\ntype choiceBuilder struct {\n\tname\tstring\n\tid\tint\n\tcommit\tCommitType\n\toptions\t[]builder\n}\n\nfunc (p *choiceParser) nodeName() string {\n\treturn p.name\n}\nfunc (p *choiceParser) nodeID() int {\n\treturn p.id\n}\nfunc (p *choiceParser) commitType() CommitType {\n\treturn p.commit\n}\nfunc (p *choiceParser) parse(c *context) {\n\tif c.fromResults(p) {\n\t\treturn\n\t}\n\tif c.results.pending(c.offset, p.id) {\n\t\tc.fail(c.offset)\n\t\treturn\n\t}\n\tc.results.markPending(c.offset, p.id)\n\tvar (\n\t\tmatch\t\tbool\n\t\toptionIndex\tint\n\t\tfoundMatch\tbool\n\t\tfailingParser\tparser\n\t)\n\tfrom := c.offset\n\tto := c.offset\n\tinitialFailOffset := c.failOffset\n\tinitialFailingParser := c.failingParser\n\tfailOffset := initialFailOffset\n\tfor {\n\t\tfoundMatch = false\n\t\toptionIndex = 0\n\t\tfor optionIndex < len(p.options) {\n\t\t\tp.options[optionIndex].parse(c)\n\t\t\toptionIndex++\n\t\t\tif !c.matchLast {\n\t\t\t\tif c.failOffset > failOffset {\n\t\t\t\t\tfailOffset = c.failOffset\n\t\t\t\t\tfailingParser = c.failingParser\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !c.matchLast || match && c.offset <= to {\n\t\t\t\tc.offset = from\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmatch = true\n\t\t\tfoundMatch = true\n\t\t\tto = c.offset\n\t\t\tc.offset = from\n\t\t\tc.results.setMatch(from, p.id, to)\n\t\t}\n\t\tif !foundMatch {\n\t\t\tbreak\n\t\t}\n\t}\n\tif match {\n\t\tif failOffset > to {\n\t\t\tc.failOffset = failOffset\n\t\t\tc.failingParser = failingParser\n\t\t} else if to > initialFailOffset {\n\t\t\tc.failOffset = -1\n\t\t\tc.failingParser = nil\n\t\t} else {\n\t\t\tc.failOffset = initialFailOffset\n\t\t\tc.failingParser = initialFailingParser\n\t\t}\n\t\tc.success(to)\n\t\tc.results.unmarkPending(from, p.id)\n\t\treturn\n\t}\n\tif failOffset > initialFailOffset {\n\t\tc.failOffset = failOffset\n\t\tc.failingParser = failingParser\n\t\tif c.failingParser == nil && p.commitType()&userDefined != 0 && p.commitType()&Whitespace == 0 && p.commitType()&FailPass == 0 {\n\t\t\tc.failingParser = p\n\t\t}\n\t}\n\tc.results.setNoMatch(from, p.id)\n\tc.fail(from)\n\tc.results.unmarkPending(from, p.id)\n}\nfunc (b *choiceBuilder) nodeName() string {\n\treturn b.name\n}\nfunc (b *choiceBuilder) nodeID() int {\n\treturn b.id\n}\nfunc (b *choiceBuilder) build(c *context) ([]*Node, bool) {\n\tto, ok := c.results.longestMatch(c.offset, b.id)\n\tif !ok {\n\t\treturn nil, false\n\t}\n\tfrom := c.offset\n\tparsed := to > from\n\tif parsed {\n\t\tc.results.dropMatchTo(c.offset, b.id, to)\n\t} else {\n\t\tif c.results.pending(c.offset, b.id) {\n\t\t\treturn nil, false\n\t\t}\n\t\tc.results.markPending(c.offset, b.id)\n\t}\n\tvar option builder\n\tfor _, o := range b.options {\n\t\tif c.results.hasMatchTo(c.offset, o.nodeID(), to) {\n\t\t\toption = o\n\t\t\tbreak\n\t\t}\n\t}\n\tn, _ := option.build(c)\n\tif !parsed {\n\t\tc.results.unmarkPending(from, b.id)\n\t}\n\tif b.commit&Alias != 0 {\n\t\treturn n, true\n\t}\n\treturn []*Node{{Name: b.name, From: from, To: to, Nodes: n, tokens: c.tokens}}, true\n}\n\ntype idSet struct{ ids []uint }\n\nfunc divModBits(id int) (int, int) {\n\treturn id / strconv.IntSize, id % strconv.IntSize\n}\nfunc (s *idSet) set(id int) {\n\td, m := divModBits(id)\n\tif d >= len(s.ids) {\n\t\tif d < cap(s.ids) {\n\t\t\ts.ids = s.ids[:d+1]\n\t\t} else {\n\t\t\ts.ids = s.ids[:cap(s.ids)]\n\t\t\tfor i := cap(s.ids); i <= d; i++ {\n\t\t\t\ts.ids = append(s.ids, 0)\n\t\t\t}\n\t\t}\n\t}\n\ts.ids[d] |= 1 << uint(m)\n}\nfunc (s *idSet) unset(id int) {\n\td, m := divModBits(id)\n\tif d >= len(s.ids) {\n\t\treturn\n\t}\n\ts.ids[d] &^= 1 << uint(m)\n}\nfunc (s *idSet) has(id int) bool {\n\td, m := divModBits(id)\n\tif d >= len(s.ids) {\n\t\treturn false\n\t}\n\treturn s.ids[d]&(1< offset {\n\t\treturn ints\n\t}\n\tif cap(ints) > offset {\n\t\tints = ints[:offset+1]\n\t\treturn ints\n\t}\n\tints = ints[:cap(ints)]\n\tfor i := len(ints); i <= offset; i++ {\n\t\tints = append(ints, nil)\n\t}\n\treturn ints\n}\nfunc ensureOffsetIDs(ids []*idSet, offset int) []*idSet {\n\tif len(ids) > offset {\n\t\treturn ids\n\t}\n\tif cap(ids) > offset {\n\t\tids = ids[:offset+1]\n\t\treturn ids\n\t}\n\tids = ids[:cap(ids)]\n\tfor i := len(ids); i <= offset; i++ {\n\t\tids = append(ids, nil)\n\t}\n\treturn ids\n}\nfunc (r *results) setMatch(offset, id, to int) {\n\tr.match = ensureOffsetInts(r.match, offset)\n\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\tif r.match[offset][i] != id || r.match[offset][i+1] != to {\n\t\t\tcontinue\n\t\t}\n\t\treturn\n\t}\n\tr.match[offset] = append(r.match[offset], id, to)\n}\nfunc (r *results) setNoMatch(offset, id int) {\n\tif len(r.match) > offset {\n\t\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\t\tif r.match[offset][i] != id {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\tr.noMatch = ensureOffsetIDs(r.noMatch, offset)\n\tif r.noMatch[offset] == nil {\n\t\tr.noMatch[offset] = &idSet{}\n\t}\n\tr.noMatch[offset].set(id)\n}\nfunc (r *results) hasMatchTo(offset, id, to int) bool {\n\tif len(r.match) <= offset {\n\t\treturn false\n\t}\n\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\tif r.match[offset][i] != id {\n\t\t\tcontinue\n\t\t}\n\t\tif r.match[offset][i+1] == to {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\nfunc (r *results) longestMatch(offset, id int) (int, bool) {\n\tif len(r.match) <= offset {\n\t\treturn 0, false\n\t}\n\tvar found bool\n\tto := -1\n\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\tif r.match[offset][i] != id {\n\t\t\tcontinue\n\t\t}\n\t\tif r.match[offset][i+1] > to {\n\t\t\tto = r.match[offset][i+1]\n\t\t}\n\t\tfound = true\n\t}\n\treturn to, found\n}\nfunc (r *results) longestResult(offset, id int) (int, bool, bool) {\n\tif len(r.noMatch) > offset && r.noMatch[offset] != nil && r.noMatch[offset].has(id) {\n\t\treturn 0, false, true\n\t}\n\tto, ok := r.longestMatch(offset, id)\n\treturn to, ok, ok\n}\nfunc (r *results) dropMatchTo(offset, id, to int) {\n\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\tif r.match[offset][i] != id {\n\t\t\tcontinue\n\t\t}\n\t\tif r.match[offset][i+1] == to {\n\t\t\tr.match[offset][i] = -1\n\t\t\treturn\n\t\t}\n\t}\n}\nfunc (r *results) resetPending() {\n\tr.isPending = nil\n}\nfunc (r *results) pending(offset, id int) bool {\n\tif len(r.isPending) <= id {\n\t\treturn false\n\t}\n\tfor i := range r.isPending[id] {\n\t\tif r.isPending[id][i] == offset {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\nfunc (r *results) markPending(offset, id int) {\n\tr.isPending = ensureOffsetInts(r.isPending, id)\n\tfor i := range r.isPending[id] {\n\t\tif r.isPending[id][i] == -1 {\n\t\t\tr.isPending[id][i] = offset\n\t\t\treturn\n\t\t}\n\t}\n\tr.isPending[id] = append(r.isPending[id], offset)\n}\nfunc (r *results) unmarkPending(offset, id int) {\n\tfor i := range r.isPending[id] {\n\t\tif r.isPending[id][i] == offset {\n\t\t\tr.isPending[id][i] = -1\n\t\t\tbreak\n\t\t}\n\t}\n}\n\ntype context struct {\n\treader\t\tio.RuneReader\n\toffset\t\tint\n\treadOffset\tint\n\tconsumed\tint\n\tfailOffset\tint\n\tfailingParser\tparser\n\treadErr\t\terror\n\teof\t\tbool\n\tresults\t\t*results\n\ttokens\t\t[]rune\n\tmatchLast\tbool\n}\n\nfunc newContext(r io.RuneReader) *context {\n\treturn &context{reader: r, results: &results{}, failOffset: -1}\n}\nfunc (c *context) read() bool {\n\tif c.eof || c.readErr != nil {\n\t\treturn false\n\t}\n\ttoken, n, err := c.reader.ReadRune()\n\tif err != nil {\n\t\tif err == io.EOF {\n\t\t\tif n == 0 {\n\t\t\t\tc.eof = true\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\tc.readErr = err\n\t\t\treturn false\n\t\t}\n\t}\n\tc.readOffset++\n\tif token == unicode.ReplacementChar {\n\t\tc.readErr = ErrInvalidUnicodeCharacter\n\t\treturn false\n\t}\n\tc.tokens = append(c.tokens, token)\n\treturn true\n}\nfunc (c *context) token() (rune, bool) {\n\tif c.offset == c.readOffset {\n\t\tif !c.read() {\n\t\t\treturn 0, false\n\t\t}\n\t}\n\treturn c.tokens[c.offset], true\n}\nfunc (c *context) fromResults(p parser) bool {\n\tto, m, ok := c.results.longestResult(c.offset, p.nodeID())\n\tif !ok {\n\t\treturn false\n\t}\n\tif m {\n\t\tc.success(to)\n\t} else {\n\t\tc.fail(c.offset)\n\t}\n\treturn true\n}\nfunc (c *context) success(to int) {\n\tc.offset = to\n\tc.matchLast = true\n\tif to > c.consumed {\n\t\tc.consumed = to\n\t}\n}\nfunc (c *context) fail(offset int) {\n\tc.offset = offset\n\tc.matchLast = false\n}\nfunc findLine(tokens []rune, offset int) (line, column int) {\n\ttokens = tokens[:offset]\n\tfor i := range tokens {\n\t\tcolumn++\n\t\tif tokens[i] == '\\n' {\n\t\t\tcolumn = 0\n\t\t\tline++\n\t\t}\n\t}\n\treturn\n}\nfunc (c *context) parseError(p parser) error {\n\tdefinition := p.nodeName()\n\tflagIndex := strings.Index(definition, \":\")\n\tif flagIndex > 0 {\n\t\tdefinition = definition[:flagIndex]\n\t}\n\tif c.failingParser == nil {\n\t\tc.failOffset = c.consumed\n\t}\n\tline, col := findLine(c.tokens, c.failOffset)\n\treturn &ParseError{Offset: c.failOffset, Line: line, Column: col, Definition: definition}\n}\nfunc (c *context) finalizeParse(root parser) error {\n\tfp := c.failingParser\n\tif fp == nil {\n\t\tfp = root\n\t}\n\tto, match, found := c.results.longestResult(0, root.nodeID())\n\tif !found || !match || found && match && to < c.readOffset {\n\t\treturn c.parseError(fp)\n\t}\n\tc.read()\n\tif c.eof {\n\t\treturn nil\n\t}\n\tif c.readErr != nil {\n\t\treturn c.readErr\n\t}\n\treturn c.parseError(root)\n}\n\ntype Node struct {\n\tName\t\tstring\n\tNodes\t\t[]*Node\n\tFrom, To\tint\n\ttokens\t\t[]rune\n}\n\nfunc (n *Node) Tokens() []rune {\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\tprintln(len(n.tokens), n.From, n.To)\n\t\t\tpanic(err)\n\t\t}\n\t}()\n\treturn n.tokens\n}\nfunc (n *Node) String() string {\n\treturn fmt.Sprintf(\"%s:%d:%d:%s\", n.Name, n.From, n.To, n.Text())\n}\nfunc (n *Node) Text() string {\n\treturn string(n.Tokens()[n.From:n.To])\n}\n\ntype CommitType int\n\nconst (\n\tNone\tCommitType\t= 0\n\tAlias\tCommitType\t= 1 << iota\n\tWhitespace\n\tNoWhitespace\n\tFailPass\n\tRoot\n\tuserDefined\n)\n\ntype formatFlags int\n\nconst (\n\tformatNone\tformatFlags\t= 0\n\tformatPretty\tformatFlags\t= 1 << iota\n\tformatIncludeComments\n)\n\ntype ParseError struct {\n\tInput\t\tstring\n\tOffset\t\tint\n\tLine\t\tint\n\tColumn\t\tint\n\tDefinition\tstring\n}\ntype parser interface {\n\tnodeName() string\n\tnodeID() int\n\tcommitType() CommitType\n\tparse(*context)\n}\ntype builder interface {\n\tnodeName() string\n\tnodeID() int\n\tbuild(*context) ([]*Node, bool)\n}\n\nvar ErrInvalidUnicodeCharacter = errors.New(\"invalid unicode character\")\n\nfunc (pe *ParseError) Error() string {\n\treturn fmt.Sprintf(\"%s:%d:%d:parse failed, parsing: %s\", pe.Input, pe.Line+1, pe.Column+1, pe.Definition)\n}\nfunc parse(r io.Reader, p parser, b builder) (*Node, error) {\n\tc := newContext(bufio.NewReader(r))\n\tp.parse(c)\n\tif c.readErr != nil {\n\t\treturn nil, c.readErr\n\t}\n\tif err := c.finalizeParse(p); err != nil {\n\t\tif perr, ok := err.(*ParseError); ok {\n\t\t\tperr.Input = \"\"\n\t\t}\n\t\treturn nil, err\n\t}\n\tc.offset = 0\n\tc.results.resetPending()\n\tn, _ := b.build(c)\n\treturn n[0], nil\n}\n" +const headCode = "import (\n\t\"strconv\"\n\t\"io\"\n\t\"strings\"\n\t\"unicode\"\n\t\"fmt\"\n\t\"bufio\"\n\t\"errors\"\n)\n\ntype charParser struct {\n\tname\tstring\n\tid\tint\n\tnot\tbool\n\tchars\t[]rune\n\tranges\t[][]rune\n}\ntype charBuilder struct {\n\tname\tstring\n\tid\tint\n}\n\nfunc (p *charParser) nodeName() string {\n\treturn p.name\n}\nfunc (p *charParser) nodeID() int {\n\treturn p.id\n}\nfunc (p *charParser) commitType() CommitType {\n\treturn Alias\n}\nfunc matchChar(chars []rune, ranges [][]rune, not bool, char rune) bool {\n\tfor _, ci := range chars {\n\t\tif ci == char {\n\t\t\treturn !not\n\t\t}\n\t}\n\tfor _, ri := range ranges {\n\t\tif char >= ri[0] && char <= ri[1] {\n\t\t\treturn !not\n\t\t}\n\t}\n\treturn not\n}\nfunc (p *charParser) match(t rune) bool {\n\treturn matchChar(p.chars, p.ranges, p.not, t)\n}\nfunc (p *charParser) parse(c *context) {\n\tif tok, ok := c.token(); !ok || !p.match(tok) {\n\t\tif c.offset > c.failOffset {\n\t\t\tc.failOffset = c.offset\n\t\t\tc.failingParser = nil\n\t\t}\n\t\tc.fail(c.offset)\n\t\treturn\n\t}\n\tc.success(c.offset + 1)\n}\nfunc (b *charBuilder) nodeName() string {\n\treturn b.name\n}\nfunc (b *charBuilder) nodeID() int {\n\treturn b.id\n}\nfunc (b *charBuilder) build(c *context) ([]*Node, bool) {\n\treturn nil, false\n}\n\ntype sequenceParser struct {\n\tname\t\tstring\n\tid\t\tint\n\tcommit\t\tCommitType\n\titems\t\t[]parser\n\tranges\t\t[][]int\n\tgeneralizations\t[]int\n\tallChars\tbool\n}\ntype sequenceBuilder struct {\n\tname\t\tstring\n\tid\t\tint\n\tcommit\t\tCommitType\n\titems\t\t[]builder\n\tranges\t\t[][]int\n\tallChars\tbool\n}\n\nfunc (p *sequenceParser) nodeName() string {\n\treturn p.name\n}\nfunc (p *sequenceParser) nodeID() int {\n\treturn p.id\n}\nfunc (p *sequenceParser) commitType() CommitType {\n\treturn p.commit\n}\nfunc (p *sequenceParser) parse(c *context) {\n\tif !p.allChars {\n\t\tif c.results.pending(c.offset, p.id) {\n\t\t\tc.fail(c.offset)\n\t\t\treturn\n\t\t}\n\t\tc.results.markPending(c.offset, p.id)\n\t}\n\tvar (\n\t\tcurrentCount\tint\n\t\tparsed\t\tbool\n\t)\n\titemIndex := 0\n\tfrom := c.offset\n\tto := c.offset\n\tfor itemIndex < len(p.items) {\n\t\tp.items[itemIndex].parse(c)\n\t\tif !c.matchLast {\n\t\t\tif currentCount >= p.ranges[itemIndex][0] {\n\t\t\t\titemIndex++\n\t\t\t\tcurrentCount = 0\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif c.failingParser == nil && p.commit&userDefined != 0 && p.commit&Whitespace == 0 && p.commit&FailPass == 0 {\n\t\t\t\tc.failingParser = p\n\t\t\t}\n\t\t\tc.fail(from)\n\t\t\tif !p.allChars {\n\t\t\t\tc.results.unmarkPending(from, p.id)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tparsed = c.offset > to\n\t\tif parsed {\n\t\t\tcurrentCount++\n\t\t}\n\t\tto = c.offset\n\t\tif !parsed || p.ranges[itemIndex][1] > 0 && currentCount == p.ranges[itemIndex][1] {\n\t\t\titemIndex++\n\t\t\tcurrentCount = 0\n\t\t}\n\t}\n\tfor _, g := range p.generalizations {\n\t\tif c.results.pending(from, g) {\n\t\t\tc.results.setMatch(from, g, to)\n\t\t}\n\t}\n\tif to > c.failOffset {\n\t\tc.failOffset = -1\n\t\tc.failingParser = nil\n\t}\n\tc.results.setMatch(from, p.id, to)\n\tc.success(to)\n\tif !p.allChars {\n\t\tc.results.unmarkPending(from, p.id)\n\t}\n}\nfunc (b *sequenceBuilder) nodeName() string {\n\treturn b.name\n}\nfunc (b *sequenceBuilder) nodeID() int {\n\treturn b.id\n}\nfunc (b *sequenceBuilder) build(c *context) ([]*Node, bool) {\n\tto, ok := c.results.longestMatch(c.offset, b.id)\n\tif !ok {\n\t\treturn nil, false\n\t}\n\tfrom := c.offset\n\tparsed := to > from\n\tif b.allChars {\n\t\tc.offset = to\n\t\tif b.commit&Alias != 0 {\n\t\t\treturn nil, true\n\t\t}\n\t\treturn []*Node{{Name: b.name, From: from, To: to, tokens: c.tokens}}, true\n\t} else if parsed {\n\t\tc.results.dropMatchTo(c.offset, b.id, to)\n\t} else {\n\t\tif c.results.pending(c.offset, b.id) {\n\t\t\treturn nil, false\n\t\t}\n\t\tc.results.markPending(c.offset, b.id)\n\t}\n\tvar (\n\t\titemIndex\tint\n\t\tcurrentCount\tint\n\t\tnodes\t\t[]*Node\n\t)\n\tfor itemIndex < len(b.items) {\n\t\titemFrom := c.offset\n\t\tn, ok := b.items[itemIndex].build(c)\n\t\tif !ok {\n\t\t\titemIndex++\n\t\t\tcurrentCount = 0\n\t\t\tcontinue\n\t\t}\n\t\tif c.offset > itemFrom {\n\t\t\tnodes = append(nodes, n...)\n\t\t\tcurrentCount++\n\t\t\tif b.ranges[itemIndex][1] > 0 && currentCount == b.ranges[itemIndex][1] {\n\t\t\t\titemIndex++\n\t\t\t\tcurrentCount = 0\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif currentCount < b.ranges[itemIndex][0] {\n\t\t\tfor i := 0; i < b.ranges[itemIndex][0]-currentCount; i++ {\n\t\t\t\tnodes = append(nodes, n...)\n\t\t\t}\n\t\t}\n\t\titemIndex++\n\t\tcurrentCount = 0\n\t}\n\tif !parsed {\n\t\tc.results.unmarkPending(from, b.id)\n\t}\n\tif b.commit&Alias != 0 {\n\t\treturn nodes, true\n\t}\n\treturn []*Node{{Name: b.name, From: from, To: to, Nodes: nodes, tokens: c.tokens}}, true\n}\n\ntype choiceParser struct {\n\tname\t\tstring\n\tid\t\tint\n\tcommit\t\tCommitType\n\toptions\t\t[]parser\n\tgeneralizations\t[]int\n}\ntype choiceBuilder struct {\n\tname\tstring\n\tid\tint\n\tcommit\tCommitType\n\toptions\t[]builder\n}\n\nfunc (p *choiceParser) nodeName() string {\n\treturn p.name\n}\nfunc (p *choiceParser) nodeID() int {\n\treturn p.id\n}\nfunc (p *choiceParser) commitType() CommitType {\n\treturn p.commit\n}\nfunc (p *choiceParser) parse(c *context) {\n\tif c.fromResults(p) {\n\t\treturn\n\t}\n\tif c.results.pending(c.offset, p.id) {\n\t\tc.fail(c.offset)\n\t\treturn\n\t}\n\tc.results.markPending(c.offset, p.id)\n\tvar (\n\t\tmatch\t\tbool\n\t\toptionIndex\tint\n\t\tfoundMatch\tbool\n\t\tfailingParser\tparser\n\t)\n\tfrom := c.offset\n\tto := c.offset\n\tinitialFailOffset := c.failOffset\n\tinitialFailingParser := c.failingParser\n\tfailOffset := initialFailOffset\n\tfor {\n\t\tfoundMatch = false\n\t\toptionIndex = 0\n\t\tfor optionIndex < len(p.options) {\n\t\t\tp.options[optionIndex].parse(c)\n\t\t\toptionIndex++\n\t\t\tif !c.matchLast {\n\t\t\t\tif c.failOffset > failOffset {\n\t\t\t\t\tfailOffset = c.failOffset\n\t\t\t\t\tfailingParser = c.failingParser\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !c.matchLast || match && c.offset <= to {\n\t\t\t\tc.offset = from\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmatch = true\n\t\t\tfoundMatch = true\n\t\t\tto = c.offset\n\t\t\tc.offset = from\n\t\t\tc.results.setMatch(from, p.id, to)\n\t\t}\n\t\tif !foundMatch {\n\t\t\tbreak\n\t\t}\n\t}\n\tif match {\n\t\tif failOffset > to {\n\t\t\tc.failOffset = failOffset\n\t\t\tc.failingParser = failingParser\n\t\t} else if to > initialFailOffset {\n\t\t\tc.failOffset = -1\n\t\t\tc.failingParser = nil\n\t\t} else {\n\t\t\tc.failOffset = initialFailOffset\n\t\t\tc.failingParser = initialFailingParser\n\t\t}\n\t\tc.success(to)\n\t\tc.results.unmarkPending(from, p.id)\n\t\treturn\n\t}\n\tif failOffset > initialFailOffset {\n\t\tc.failOffset = failOffset\n\t\tc.failingParser = failingParser\n\t\tif c.failingParser == nil && p.commitType()&userDefined != 0 && p.commitType()&Whitespace == 0 && p.commitType()&FailPass == 0 {\n\t\t\tc.failingParser = p\n\t\t}\n\t}\n\tc.results.setNoMatch(from, p.id)\n\tc.fail(from)\n\tc.results.unmarkPending(from, p.id)\n}\nfunc (b *choiceBuilder) nodeName() string {\n\treturn b.name\n}\nfunc (b *choiceBuilder) nodeID() int {\n\treturn b.id\n}\nfunc (b *choiceBuilder) build(c *context) ([]*Node, bool) {\n\tto, ok := c.results.longestMatch(c.offset, b.id)\n\tif !ok {\n\t\treturn nil, false\n\t}\n\tfrom := c.offset\n\tparsed := to > from\n\tif parsed {\n\t\tc.results.dropMatchTo(c.offset, b.id, to)\n\t} else {\n\t\tif c.results.pending(c.offset, b.id) {\n\t\t\treturn nil, false\n\t\t}\n\t\tc.results.markPending(c.offset, b.id)\n\t}\n\tvar option builder\n\tfor _, o := range b.options {\n\t\tif c.results.hasMatchTo(c.offset, o.nodeID(), to) {\n\t\t\toption = o\n\t\t\tbreak\n\t\t}\n\t}\n\tn, _ := option.build(c)\n\tif !parsed {\n\t\tc.results.unmarkPending(from, b.id)\n\t}\n\tif b.commit&Alias != 0 {\n\t\treturn n, true\n\t}\n\treturn []*Node{{Name: b.name, From: from, To: to, Nodes: n, tokens: c.tokens}}, true\n}\n\ntype idSet struct{ ids []uint }\n\nfunc divModBits(id int) (int, int) {\n\treturn id / strconv.IntSize, id % strconv.IntSize\n}\nfunc (s *idSet) set(id int) {\n\td, m := divModBits(id)\n\tif d >= len(s.ids) {\n\t\tif d < cap(s.ids) {\n\t\t\ts.ids = s.ids[:d+1]\n\t\t} else {\n\t\t\ts.ids = s.ids[:cap(s.ids)]\n\t\t\tfor i := cap(s.ids); i <= d; i++ {\n\t\t\t\ts.ids = append(s.ids, 0)\n\t\t\t}\n\t\t}\n\t}\n\ts.ids[d] |= 1 << uint(m)\n}\nfunc (s *idSet) unset(id int) {\n\td, m := divModBits(id)\n\tif d >= len(s.ids) {\n\t\treturn\n\t}\n\ts.ids[d] &^= 1 << uint(m)\n}\nfunc (s *idSet) has(id int) bool {\n\td, m := divModBits(id)\n\tif d >= len(s.ids) {\n\t\treturn false\n\t}\n\treturn s.ids[d]&(1< offset {\n\t\treturn ints\n\t}\n\tif cap(ints) > offset {\n\t\tints = ints[:offset+1]\n\t\treturn ints\n\t}\n\tints = ints[:cap(ints)]\n\tfor i := len(ints); i <= offset; i++ {\n\t\tints = append(ints, nil)\n\t}\n\treturn ints\n}\nfunc ensureOffsetIDs(ids []*idSet, offset int) []*idSet {\n\tif len(ids) > offset {\n\t\treturn ids\n\t}\n\tif cap(ids) > offset {\n\t\tids = ids[:offset+1]\n\t\treturn ids\n\t}\n\tids = ids[:cap(ids)]\n\tfor i := len(ids); i <= offset; i++ {\n\t\tids = append(ids, nil)\n\t}\n\treturn ids\n}\nfunc (r *results) setMatch(offset, id, to int) {\n\tr.match = ensureOffsetInts(r.match, offset)\n\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\tif r.match[offset][i] != id || r.match[offset][i+1] != to {\n\t\t\tcontinue\n\t\t}\n\t\treturn\n\t}\n\tr.match[offset] = append(r.match[offset], id, to)\n}\nfunc (r *results) setNoMatch(offset, id int) {\n\tif len(r.match) > offset {\n\t\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\t\tif r.match[offset][i] != id {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\tr.noMatch = ensureOffsetIDs(r.noMatch, offset)\n\tif r.noMatch[offset] == nil {\n\t\tr.noMatch[offset] = &idSet{}\n\t}\n\tr.noMatch[offset].set(id)\n}\nfunc (r *results) hasMatchTo(offset, id, to int) bool {\n\tif len(r.match) <= offset {\n\t\treturn false\n\t}\n\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\tif r.match[offset][i] != id {\n\t\t\tcontinue\n\t\t}\n\t\tif r.match[offset][i+1] == to {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\nfunc (r *results) longestMatch(offset, id int) (int, bool) {\n\tif len(r.match) <= offset {\n\t\treturn 0, false\n\t}\n\tvar found bool\n\tto := -1\n\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\tif r.match[offset][i] != id {\n\t\t\tcontinue\n\t\t}\n\t\tif r.match[offset][i+1] > to {\n\t\t\tto = r.match[offset][i+1]\n\t\t}\n\t\tfound = true\n\t}\n\treturn to, found\n}\nfunc (r *results) longestResult(offset, id int) (int, bool, bool) {\n\tif len(r.noMatch) > offset && r.noMatch[offset] != nil && r.noMatch[offset].has(id) {\n\t\treturn 0, false, true\n\t}\n\tto, ok := r.longestMatch(offset, id)\n\treturn to, ok, ok\n}\nfunc (r *results) dropMatchTo(offset, id, to int) {\n\tfor i := 0; i < len(r.match[offset]); i += 2 {\n\t\tif r.match[offset][i] != id {\n\t\t\tcontinue\n\t\t}\n\t\tif r.match[offset][i+1] == to {\n\t\t\tr.match[offset][i] = -1\n\t\t\treturn\n\t\t}\n\t}\n}\nfunc (r *results) resetPending() {\n\tr.isPending = nil\n}\nfunc (r *results) pending(offset, id int) bool {\n\tif len(r.isPending) <= id {\n\t\treturn false\n\t}\n\tfor i := range r.isPending[id] {\n\t\tif r.isPending[id][i] == offset {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\nfunc (r *results) markPending(offset, id int) {\n\tr.isPending = ensureOffsetInts(r.isPending, id)\n\tfor i := range r.isPending[id] {\n\t\tif r.isPending[id][i] == -1 {\n\t\t\tr.isPending[id][i] = offset\n\t\t\treturn\n\t\t}\n\t}\n\tr.isPending[id] = append(r.isPending[id], offset)\n}\nfunc (r *results) unmarkPending(offset, id int) {\n\tfor i := range r.isPending[id] {\n\t\tif r.isPending[id][i] == offset {\n\t\t\tr.isPending[id][i] = -1\n\t\t\tbreak\n\t\t}\n\t}\n}\n\ntype context struct {\n\treader\t\tio.RuneReader\n\toffset\t\tint\n\treadOffset\tint\n\tconsumed\tint\n\tfailOffset\tint\n\tfailingParser\tparser\n\treadErr\t\terror\n\teof\t\tbool\n\tresults\t\t*results\n\ttokens\t\t[]rune\n\tmatchLast\tbool\n}\n\nfunc newContext(r io.RuneReader) *context {\n\treturn &context{reader: r, results: &results{}, failOffset: -1}\n}\nfunc (c *context) read() bool {\n\tif c.eof || c.readErr != nil {\n\t\treturn false\n\t}\n\ttoken, n, err := c.reader.ReadRune()\n\tif err != nil {\n\t\tif err == io.EOF {\n\t\t\tif n == 0 {\n\t\t\t\tc.eof = true\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\tc.readErr = err\n\t\t\treturn false\n\t\t}\n\t}\n\tc.readOffset++\n\tif token == unicode.ReplacementChar {\n\t\tc.readErr = ErrInvalidUnicodeCharacter\n\t\treturn false\n\t}\n\tc.tokens = append(c.tokens, token)\n\treturn true\n}\nfunc (c *context) token() (rune, bool) {\n\tif c.offset == c.readOffset {\n\t\tif !c.read() {\n\t\t\treturn 0, false\n\t\t}\n\t}\n\treturn c.tokens[c.offset], true\n}\nfunc (c *context) fromResults(p parser) bool {\n\tto, m, ok := c.results.longestResult(c.offset, p.nodeID())\n\tif !ok {\n\t\treturn false\n\t}\n\tif m {\n\t\tc.success(to)\n\t} else {\n\t\tc.fail(c.offset)\n\t}\n\treturn true\n}\nfunc (c *context) success(to int) {\n\tc.offset = to\n\tc.matchLast = true\n\tif to > c.consumed {\n\t\tc.consumed = to\n\t}\n}\nfunc (c *context) fail(offset int) {\n\tc.offset = offset\n\tc.matchLast = false\n}\nfunc findLine(tokens []rune, offset int) (line, column int) {\n\ttokens = tokens[:offset]\n\tfor i := range tokens {\n\t\tcolumn++\n\t\tif tokens[i] == '\\n' {\n\t\t\tcolumn = 0\n\t\t\tline++\n\t\t}\n\t}\n\treturn\n}\nfunc (c *context) parseError(p parser) error {\n\tdefinition := p.nodeName()\n\tflagIndex := strings.Index(definition, \":\")\n\tif flagIndex > 0 {\n\t\tdefinition = definition[:flagIndex]\n\t}\n\tif c.failingParser == nil {\n\t\tc.failOffset = c.consumed\n\t}\n\tline, col := findLine(c.tokens, c.failOffset)\n\treturn &ParseError{Offset: c.failOffset, Line: line, Column: col, Definition: definition}\n}\nfunc (c *context) finalizeParse(root parser) error {\n\tfp := c.failingParser\n\tif fp == nil {\n\t\tfp = root\n\t}\n\tto, match, found := c.results.longestResult(0, root.nodeID())\n\tif !found || !match || found && match && to < c.readOffset {\n\t\treturn c.parseError(fp)\n\t}\n\tc.read()\n\tif c.eof {\n\t\treturn nil\n\t}\n\tif c.readErr != nil {\n\t\treturn c.readErr\n\t}\n\treturn c.parseError(root)\n}\n\ntype Node struct {\n\tName\t\tstring\n\tNodes\t\t[]*Node\n\tFrom, To\tint\n\ttokens\t\t[]rune\n}\n\nfunc (n *Node) Tokens() []rune {\n\treturn n.tokens\n}\nfunc (n *Node) String() string {\n\treturn fmt.Sprintf(\"%s:%d:%d:%s\", n.Name, n.From, n.To, n.Text())\n}\nfunc (n *Node) Text() string {\n\treturn string(n.Tokens()[n.From:n.To])\n}\n\ntype CommitType int\n\nconst (\n\tNone\tCommitType\t= 0\n\tAlias\tCommitType\t= 1 << iota\n\tWhitespace\n\tNoWhitespace\n\tFailPass\n\tRoot\n\tuserDefined\n)\n\ntype formatFlags int\n\nconst (\n\tformatNone\tformatFlags\t= 0\n\tformatPretty\tformatFlags\t= 1 << iota\n\tformatIncludeComments\n)\n\ntype ParseError struct {\n\tInput\t\tstring\n\tOffset\t\tint\n\tLine\t\tint\n\tColumn\t\tint\n\tDefinition\tstring\n}\ntype parser interface {\n\tnodeName() string\n\tnodeID() int\n\tcommitType() CommitType\n\tparse(*context)\n}\ntype builder interface {\n\tnodeName() string\n\tnodeID() int\n\tbuild(*context) ([]*Node, bool)\n}\n\nvar ErrInvalidUnicodeCharacter = errors.New(\"invalid unicode character\")\n\nfunc (pe *ParseError) Error() string {\n\treturn fmt.Sprintf(\"%s:%d:%d:parse failed, parsing: %s\", pe.Input, pe.Line+1, pe.Column+1, pe.Definition)\n}\nfunc parse(r io.Reader, p parser, b builder) (*Node, error) {\n\tc := newContext(bufio.NewReader(r))\n\tp.parse(c)\n\tif c.readErr != nil {\n\t\treturn nil, c.readErr\n\t}\n\tif err := c.finalizeParse(p); err != nil {\n\t\tif perr, ok := err.(*ParseError); ok {\n\t\t\tperr.Input = \"\"\n\t\t}\n\t\treturn nil, err\n\t}\n\tc.offset = 0\n\tc.results.resetPending()\n\tn, _ := b.build(c)\n\treturn n[0], nil\n}\n" diff --git a/nodehead.go b/nodehead.go index 9942c45..76f28ec 100644 --- a/nodehead.go +++ b/nodehead.go @@ -10,12 +10,6 @@ type Node struct { } func (n *Node) Tokens() []rune { - defer func() { - if err := recover(); err != nil { - println(len(n.tokens), n.From, n.To) - panic(err) - } - }() return n.tokens } diff --git a/parse_test.go b/parse_test.go index d41179a..7bf0c40 100644 --- a/parse_test.go +++ b/parse_test.go @@ -1,6 +1,10 @@ package treerack -import "testing" +import ( + "bufio" + "bytes" + "testing" +) func TestRecursion(t *testing.T) { runTests( @@ -733,3 +737,39 @@ func TestChoiceSequencePriority(t *testing.T) { }}, ) } + +func TestCharBuildNoop(t *testing.T) { + c := newChar("foo", false, nil, nil) + c.init(newRegistry()) + b := c.builder() + ctx := newContext(bufio.NewReader(bytes.NewBuffer(nil))) + if n, ok := b.build(ctx); len(n) != 0 || ok { + t.Error("char build not noop") + } +} + +func TestCharBuilderProps(t *testing.T) { + b := &charBuilder{ + name: "foo", + id: 42, + } + + if b.nodeName() != "foo" { + t.Error("invalid char builder prop") + } + + if b.nodeID() != 42 { + t.Error("invalid char builder prop") + } +} + +func TestCharAddGeneralizationNoEffect(t *testing.T) { + (&charParser{}).addGeneralization(42) +} + +func TestSequenceProps(t *testing.T) { + d := &sequenceParser{commit: Alias | userDefined} + if d.commitType() != Alias|userDefined { + t.Error("invalid commit type") + } +} diff --git a/self/self.go b/self/self.go index 5227f1f..df98cb1 100644 --- a/self/self.go +++ b/self/self.go @@ -9,7 +9,7 @@ unless explicitly stated otherwise, if treerack's license allows changing the license of this source code. Treerack's license: MIT https://opensource.org/licenses/MIT -where YEAR=2018, COPYRIGHT HOLDER=Arpad Ryszka (arpad.ryszka@gmail.com) +where YEAR=2017, COPYRIGHT HOLDER=Arpad Ryszka (arpad.ryszka@gmail.com) The rest of the content of this file falls under the same license as the one that the user of treerack generating this file declares for it, or it is @@ -666,12 +666,6 @@ type Node struct { } func (n *Node) Tokens() []rune { - defer func() { - if err := recover(); err != nil { - println(len(n.tokens), n.From, n.To) - panic(err) - } - }() return n.tokens } func (n *Node) String() string { @@ -747,598 +741,598 @@ func Parse(r io.Reader) (*Node, error) { var p188 = sequenceParser{id: 188, commit: 32, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} var p186 = choiceParser{id: 186, commit: 2} var p185 = choiceParser{id: 185, commit: 70, name: "wsc", generalizations: []int{186}} - var p114 = choiceParser{id: 114, commit: 66, name: "wschar", generalizations: []int{185, 186}} - var p1 = sequenceParser{id: 1, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{114, 185, 186}} - var p29 = charParser{id: 29, chars: []rune{32}} - p1.items = []parser{&p29} - var p80 = sequenceParser{id: 80, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{114, 185, 186}} - var p105 = charParser{id: 105, chars: []rune{9}} - p80.items = []parser{&p105} - var p81 = sequenceParser{id: 81, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{114, 185, 186}} - var p127 = charParser{id: 127, chars: []rune{10}} - p81.items = []parser{&p127} - var p2 = sequenceParser{id: 2, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{114, 185, 186}} - var p61 = charParser{id: 61, chars: []rune{8}} - p2.items = []parser{&p61} - var p106 = sequenceParser{id: 106, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{114, 185, 186}} - var p175 = charParser{id: 175, chars: []rune{12}} - p106.items = []parser{&p175} - var p113 = sequenceParser{id: 113, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{114, 185, 186}} - var p69 = charParser{id: 69, chars: []rune{13}} - p113.items = []parser{&p69} - var p20 = sequenceParser{id: 20, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{114, 185, 186}} - var p7 = charParser{id: 7, chars: []rune{11}} - p20.items = []parser{&p7} - p114.options = []parser{&p1, &p80, &p81, &p2, &p106, &p113, &p20} - var p152 = sequenceParser{id: 152, commit: 72, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{185, 186}} - var p36 = choiceParser{id: 36, commit: 74, name: "comment-segment"} - var p35 = sequenceParser{id: 35, commit: 74, name: "line-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{36}} - var p145 = sequenceParser{id: 145, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var p71 = charParser{id: 71, chars: []rune{47}} - var p160 = charParser{id: 160, chars: []rune{47}} - p145.items = []parser{&p71, &p160} - var p95 = sequenceParser{id: 95, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p21 = charParser{id: 21, not: true, chars: []rune{10}} - p95.items = []parser{&p21} - p35.items = []parser{&p145, &p95} - var p70 = sequenceParser{id: 70, commit: 74, name: "block-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{36}} - var p90 = sequenceParser{id: 90, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var p62 = charParser{id: 62, chars: []rune{47}} - var p8 = charParser{id: 8, chars: []rune{42}} - p90.items = []parser{&p62, &p8} - var p13 = choiceParser{id: 13, commit: 10} - var p3 = sequenceParser{id: 3, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{13}} - var p48 = sequenceParser{id: 48, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p47 = charParser{id: 47, chars: []rune{42}} - p48.items = []parser{&p47} - var p99 = sequenceParser{id: 99, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p9 = charParser{id: 9, not: true, chars: []rune{47}} - p99.items = []parser{&p9} - p3.items = []parser{&p48, &p99} - var p30 = sequenceParser{id: 30, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{13}} - var p136 = charParser{id: 136, not: true, chars: []rune{42}} - p30.items = []parser{&p136} - p13.options = []parser{&p3, &p30} - var p151 = sequenceParser{id: 151, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var p54 = charParser{id: 54, chars: []rune{42}} - var p100 = charParser{id: 100, chars: []rune{47}} - p151.items = []parser{&p54, &p100} - p70.items = []parser{&p90, &p13, &p151} - p36.options = []parser{&p35, &p70} - var p10 = sequenceParser{id: 10, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} - var p146 = choiceParser{id: 146, commit: 74, name: "ws-no-nl"} - var p63 = sequenceParser{id: 63, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{146}} - var p161 = charParser{id: 161, chars: []rune{32}} - p63.items = []parser{&p161} - var p107 = sequenceParser{id: 107, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{146}} - var p86 = charParser{id: 86, chars: []rune{9}} - p107.items = []parser{&p86} - var p55 = sequenceParser{id: 55, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{146}} - var p122 = charParser{id: 122, chars: []rune{8}} - p55.items = []parser{&p122} - var p108 = sequenceParser{id: 108, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{146}} - var p96 = charParser{id: 96, chars: []rune{12}} - p108.items = []parser{&p96} - var p171 = sequenceParser{id: 171, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{146}} - var p115 = charParser{id: 115, chars: []rune{13}} - p171.items = []parser{&p115} - var p137 = sequenceParser{id: 137, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{146}} - var p123 = charParser{id: 123, chars: []rune{11}} - p137.items = []parser{&p123} - p146.options = []parser{&p63, &p107, &p55, &p108, &p171, &p137} - var p162 = sequenceParser{id: 162, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p82 = charParser{id: 82, chars: []rune{10}} - p162.items = []parser{&p82} - p10.items = []parser{&p146, &p162, &p146, &p36} - p152.items = []parser{&p36, &p10} - p185.options = []parser{&p114, &p152} + var p125 = choiceParser{id: 125, commit: 66, name: "wschar", generalizations: []int{185, 186}} + var p84 = sequenceParser{id: 84, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125, 185, 186}} + var p105 = charParser{id: 105, chars: []rune{32}} + p84.items = []parser{&p105} + var p78 = sequenceParser{id: 78, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125, 185, 186}} + var p175 = charParser{id: 175, chars: []rune{9}} + p78.items = []parser{&p175} + var p97 = sequenceParser{id: 97, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125, 185, 186}} + var p85 = charParser{id: 85, chars: []rune{10}} + p97.items = []parser{&p85} + var p5 = sequenceParser{id: 5, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125, 185, 186}} + var p26 = charParser{id: 26, chars: []rune{8}} + p5.items = []parser{&p26} + var p145 = sequenceParser{id: 145, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125, 185, 186}} + var p41 = charParser{id: 41, chars: []rune{12}} + p145.items = []parser{&p41} + var p137 = sequenceParser{id: 137, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125, 185, 186}} + var p18 = charParser{id: 18, chars: []rune{13}} + p137.items = []parser{&p18} + var p181 = sequenceParser{id: 181, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125, 185, 186}} + var p98 = charParser{id: 98, chars: []rune{11}} + p181.items = []parser{&p98} + p125.options = []parser{&p84, &p78, &p97, &p5, &p145, &p137, &p181} + var p168 = sequenceParser{id: 168, commit: 72, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{185, 186}} + var p160 = choiceParser{id: 160, commit: 74, name: "comment-segment"} + var p42 = sequenceParser{id: 42, commit: 74, name: "line-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{160}} + var p35 = sequenceParser{id: 35, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var p73 = charParser{id: 73, chars: []rune{47}} + var p117 = charParser{id: 117, chars: []rune{47}} + p35.items = []parser{&p73, &p117} + var p138 = sequenceParser{id: 138, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p132 = charParser{id: 132, not: true, chars: []rune{10}} + p138.items = []parser{&p132} + p42.items = []parser{&p35, &p138} + var p159 = sequenceParser{id: 159, commit: 74, name: "block-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{160}} + var p166 = sequenceParser{id: 166, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var p182 = charParser{id: 182, chars: []rune{47}} + var p113 = charParser{id: 113, chars: []rune{42}} + p166.items = []parser{&p182, &p113} + var p148 = choiceParser{id: 148, commit: 10} + var p54 = sequenceParser{id: 54, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{148}} + var p22 = sequenceParser{id: 22, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p146 = charParser{id: 146, chars: []rune{42}} + p22.items = []parser{&p146} + var p155 = sequenceParser{id: 155, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p147 = charParser{id: 147, not: true, chars: []rune{47}} + p155.items = []parser{&p147} + p54.items = []parser{&p22, &p155} + var p106 = sequenceParser{id: 106, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{148}} + var p34 = charParser{id: 34, not: true, chars: []rune{42}} + p106.items = []parser{&p34} + p148.options = []parser{&p54, &p106} + var p50 = sequenceParser{id: 50, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var p114 = charParser{id: 114, chars: []rune{42}} + var p121 = charParser{id: 121, chars: []rune{47}} + p50.items = []parser{&p114, &p121} + p159.items = []parser{&p166, &p148, &p50} + p160.options = []parser{&p42, &p159} + var p123 = sequenceParser{id: 123, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} + var p79 = choiceParser{id: 79, commit: 74, name: "ws-no-nl"} + var p12 = sequenceParser{id: 12, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{79}} + var p167 = charParser{id: 167, chars: []rune{32}} + p12.items = []parser{&p167} + var p13 = sequenceParser{id: 13, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{79}} + var p6 = charParser{id: 6, chars: []rune{9}} + p13.items = []parser{&p6} + var p86 = sequenceParser{id: 86, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{79}} + var p172 = charParser{id: 172, chars: []rune{8}} + p86.items = []parser{&p172} + var p139 = sequenceParser{id: 139, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{79}} + var p122 = charParser{id: 122, chars: []rune{12}} + p139.items = []parser{&p122} + var p14 = sequenceParser{id: 14, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{79}} + var p183 = charParser{id: 183, chars: []rune{13}} + p14.items = []parser{&p183} + var p141 = sequenceParser{id: 141, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{79}} + var p43 = charParser{id: 43, chars: []rune{11}} + p141.items = []parser{&p43} + p79.options = []parser{&p12, &p13, &p86, &p139, &p14, &p141} + var p156 = sequenceParser{id: 156, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p64 = charParser{id: 64, chars: []rune{10}} + p156.items = []parser{&p64} + p123.items = []parser{&p79, &p156, &p79, &p160} + p168.items = []parser{&p160, &p123} + p185.options = []parser{&p125, &p168} p186.options = []parser{&p185} var p187 = sequenceParser{id: 187, commit: 66, name: "syntax:wsroot", ranges: [][]int{{0, 1}, {0, -1}, {0, 1}, {0, 1}}} - var p182 = sequenceParser{id: 182, commit: 2, ranges: [][]int{{1, 1}, {0, -1}}} - var p135 = sequenceParser{id: 135, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p155 = charParser{id: 155, chars: []rune{59}} - p135.items = []parser{&p155} - var p181 = sequenceParser{id: 181, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p181.items = []parser{&p186, &p135} - p182.items = []parser{&p135, &p181} - var p121 = sequenceParser{id: 121, commit: 66, name: "definitions", ranges: [][]int{{1, 1}, {0, 1}}} - var p44 = sequenceParser{id: 44, commit: 64, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} - var p18 = sequenceParser{id: 18, commit: 74, name: "definition-name", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var p128 = sequenceParser{id: 128, commit: 72, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}, generalizations: []int{52, 26, 177}} - var p39 = sequenceParser{id: 39, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p57 = charParser{id: 57, not: true, chars: []rune{92, 32, 10, 9, 8, 12, 13, 11, 47, 46, 91, 93, 34, 123, 125, 94, 43, 42, 63, 124, 40, 41, 58, 61, 59}} - p39.items = []parser{&p57} - p128.items = []parser{&p39} - var p178 = sequenceParser{id: 178, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var p133 = sequenceParser{id: 133, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p43 = charParser{id: 43, chars: []rune{58}} - p133.items = []parser{&p43} - var p132 = choiceParser{id: 132, commit: 66, name: "flag"} - var p93 = sequenceParser{id: 93, commit: 72, name: "alias", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{132}} - var p163 = charParser{id: 163, chars: []rune{97}} - var p27 = charParser{id: 27, chars: []rune{108}} - var p164 = charParser{id: 164, chars: []rune{105}} - var p158 = charParser{id: 158, chars: []rune{97}} - var p118 = charParser{id: 118, chars: []rune{115}} - p93.items = []parser{&p163, &p27, &p164, &p158, &p118} - var p131 = sequenceParser{id: 131, commit: 72, name: "ws", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{132}} - var p53 = charParser{id: 53, chars: []rune{119}} - var p5 = charParser{id: 5, chars: []rune{115}} - p131.items = []parser{&p53, &p5} - var p172 = sequenceParser{id: 172, commit: 72, name: "nows", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{132}} - var p109 = charParser{id: 109, chars: []rune{110}} - var p110 = charParser{id: 110, chars: []rune{111}} - var p60 = charParser{id: 60, chars: []rune{119}} - var p79 = charParser{id: 79, chars: []rune{115}} - p172.items = []parser{&p109, &p110, &p60, &p79} - var p25 = sequenceParser{id: 25, commit: 72, name: "failpass", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{132}} - var p45 = charParser{id: 45, chars: []rune{102}} - var p94 = charParser{id: 94, chars: []rune{97}} - var p89 = charParser{id: 89, chars: []rune{105}} - var p28 = charParser{id: 28, chars: []rune{108}} - var p42 = charParser{id: 42, chars: []rune{112}} - var p173 = charParser{id: 173, chars: []rune{97}} - var p149 = charParser{id: 149, chars: []rune{115}} - var p150 = charParser{id: 150, chars: []rune{115}} - p25.items = []parser{&p45, &p94, &p89, &p28, &p42, &p173, &p149, &p150} - var p144 = sequenceParser{id: 144, commit: 72, name: "root", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{132}} - var p159 = charParser{id: 159, chars: []rune{114}} - var p174 = charParser{id: 174, chars: []rune{111}} - var p76 = charParser{id: 76, chars: []rune{111}} - var p75 = charParser{id: 75, chars: []rune{116}} - p144.items = []parser{&p159, &p174, &p76, &p75} - p132.options = []parser{&p93, &p131, &p172, &p25, &p144} - p178.items = []parser{&p133, &p132} - p18.items = []parser{&p128, &p178} - var p111 = sequenceParser{id: 111, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p19 = charParser{id: 19, chars: []rune{61}} - p111.items = []parser{&p19} - var p52 = choiceParser{id: 52, commit: 66, name: "expression"} - var p11 = choiceParser{id: 11, commit: 66, name: "terminal", generalizations: []int{52, 26, 177}} - var p37 = sequenceParser{id: 37, commit: 72, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{11, 52, 26, 177}} - var p97 = charParser{id: 97, chars: []rune{46}} - p37.items = []parser{&p97} - var p49 = sequenceParser{id: 49, commit: 72, name: "char-class", ranges: [][]int{{1, 1}, {0, 1}, {0, -1}, {1, 1}, {1, 1}, {0, 1}, {0, -1}, {1, 1}}, generalizations: []int{11, 52, 26, 177}} - var p101 = sequenceParser{id: 101, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p67 = charParser{id: 67, chars: []rune{91}} - p101.items = []parser{&p67} - var p87 = sequenceParser{id: 87, commit: 72, name: "class-not", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p138 = charParser{id: 138, chars: []rune{94}} - p87.items = []parser{&p138} - var p83 = choiceParser{id: 83, commit: 10} - var p74 = choiceParser{id: 74, commit: 72, name: "class-char", generalizations: []int{83}} - var p56 = sequenceParser{id: 56, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{74, 83}} - var p165 = charParser{id: 165, not: true, chars: []rune{92, 91, 93, 94, 45}} - p56.items = []parser{&p165} - var p31 = sequenceParser{id: 31, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{74, 83}} - var p147 = sequenceParser{id: 147, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p91 = charParser{id: 91, chars: []rune{92}} - p147.items = []parser{&p91} - var p73 = sequenceParser{id: 73, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p72 = charParser{id: 72, not: true} - p73.items = []parser{&p72} - p31.items = []parser{&p147, &p73} - p74.options = []parser{&p56, &p31} - var p64 = sequenceParser{id: 64, commit: 72, name: "char-range", ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{83}} - var p167 = sequenceParser{id: 167, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p77 = charParser{id: 77, chars: []rune{45}} - p167.items = []parser{&p77} - p64.items = []parser{&p74, &p167, &p74} - p83.options = []parser{&p74, &p64} - var p65 = sequenceParser{id: 65, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p124 = charParser{id: 124, chars: []rune{93}} - p65.items = []parser{&p124} - p49.items = []parser{&p101, &p87, &p83, &p65} - var p140 = sequenceParser{id: 140, commit: 72, name: "char-sequence", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{11, 52, 26, 177}} - var p38 = sequenceParser{id: 38, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p88 = charParser{id: 88, chars: []rune{34}} - p38.items = []parser{&p88} - var p22 = choiceParser{id: 22, commit: 72, name: "sequence-char"} - var p156 = sequenceParser{id: 156, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{22}} - var p102 = charParser{id: 102, not: true, chars: []rune{92, 34}} - p156.items = []parser{&p102} - var p153 = sequenceParser{id: 153, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{22}} - var p139 = sequenceParser{id: 139, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p50 = charParser{id: 50, chars: []rune{92}} - p139.items = []parser{&p50} - var p78 = sequenceParser{id: 78, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p116 = charParser{id: 116, not: true} - p78.items = []parser{&p116} - p153.items = []parser{&p139, &p78} - p22.options = []parser{&p156, &p153} - var p142 = sequenceParser{id: 142, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p14 = charParser{id: 14, chars: []rune{34}} - p142.items = []parser{&p14} - p140.items = []parser{&p38, &p22, &p142} - p11.options = []parser{&p37, &p49, &p140} - var p33 = sequenceParser{id: 33, commit: 66, name: "group", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{52, 26, 177}} - var p40 = sequenceParser{id: 40, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p166 = charParser{id: 166, chars: []rune{40}} - p40.items = []parser{&p166} - var p12 = sequenceParser{id: 12, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p98 = charParser{id: 98, chars: []rune{41}} - p12.items = []parser{&p98} - p33.items = []parser{&p40, &p186, &p52, &p186, &p12} - var p130 = sequenceParser{id: 130, commit: 64, name: "sequence", ranges: [][]int{{1, 1}, {0, -1}}, generalizations: []int{52, 177}} - var p143 = sequenceParser{id: 143, commit: 72, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}} - var p26 = choiceParser{id: 26, commit: 10} - p26.options = []parser{&p11, &p128, &p33} - var p176 = choiceParser{id: 176, commit: 66, name: "quantity"} - var p148 = sequenceParser{id: 148, commit: 64, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{176}} - var p58 = sequenceParser{id: 58, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p6 = charParser{id: 6, chars: []rune{123}} - p58.items = []parser{&p6} - var p15 = sequenceParser{id: 15, commit: 64, name: "count", ranges: [][]int{{1, 1}}} - var p32 = sequenceParser{id: 32, commit: 74, name: "number", ranges: [][]int{{1, -1}, {1, -1}}} - var p68 = sequenceParser{id: 68, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p34 = charParser{id: 34, ranges: [][]rune{{48, 57}}} - p68.items = []parser{&p34} - p32.items = []parser{&p68} - p15.items = []parser{&p32} - var p157 = sequenceParser{id: 157, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p103 = charParser{id: 103, chars: []rune{125}} - p157.items = []parser{&p103} - p148.items = []parser{&p58, &p186, &p15, &p186, &p157} - var p141 = sequenceParser{id: 141, commit: 64, name: "range-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}, generalizations: []int{176}} - var p85 = sequenceParser{id: 85, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p66 = charParser{id: 66, chars: []rune{123}} - p85.items = []parser{&p66} - var p125 = sequenceParser{id: 125, commit: 64, name: "range-from", ranges: [][]int{{1, 1}}} - p125.items = []parser{&p32} - var p168 = sequenceParser{id: 168, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p41 = charParser{id: 41, chars: []rune{44}} - p168.items = []parser{&p41} - var p84 = sequenceParser{id: 84, commit: 64, name: "range-to", ranges: [][]int{{1, 1}}} - p84.items = []parser{&p32} - var p16 = sequenceParser{id: 16, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p51 = charParser{id: 51, chars: []rune{125}} - p16.items = []parser{&p51} - p141.items = []parser{&p85, &p186, &p125, &p186, &p168, &p186, &p84, &p186, &p16} - var p4 = sequenceParser{id: 4, commit: 72, name: "one-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{176}} - var p23 = charParser{id: 23, chars: []rune{43}} - p4.items = []parser{&p23} - var p17 = sequenceParser{id: 17, commit: 72, name: "zero-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{176}} - var p134 = charParser{id: 134, chars: []rune{42}} - p17.items = []parser{&p134} - var p59 = sequenceParser{id: 59, commit: 72, name: "zero-or-one", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{176}} - var p117 = charParser{id: 117, chars: []rune{63}} - p59.items = []parser{&p117} - p176.options = []parser{&p148, &p141, &p4, &p17, &p59} - p143.items = []parser{&p26, &p176} - var p129 = sequenceParser{id: 129, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p129.items = []parser{&p186, &p143} - p130.items = []parser{&p143, &p129} - var p170 = sequenceParser{id: 170, commit: 64, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{52}} - var p177 = choiceParser{id: 177, commit: 66, name: "option"} - p177.options = []parser{&p11, &p128, &p33, &p130} - var p92 = sequenceParser{id: 92, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}} + var p70 = sequenceParser{id: 70, commit: 2, ranges: [][]int{{1, 1}, {0, -1}}} + var p161 = sequenceParser{id: 161, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p25 = charParser{id: 25, chars: []rune{59}} + p161.items = []parser{&p25} + var p69 = sequenceParser{id: 69, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p69.items = []parser{&p186, &p161} + p70.items = []parser{&p161, &p69} + var p112 = sequenceParser{id: 112, commit: 66, name: "definitions", ranges: [][]int{{1, 1}, {0, 1}}} + var p68 = sequenceParser{id: 68, commit: 64, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} + var p90 = sequenceParser{id: 90, commit: 74, name: "definition-name", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var p162 = sequenceParser{id: 162, commit: 72, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}, generalizations: []int{165, 83, 103}} + var p29 = sequenceParser{id: 29, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p135 = charParser{id: 135, not: true, chars: []rune{92, 32, 10, 9, 8, 12, 13, 11, 47, 46, 91, 93, 34, 123, 125, 94, 43, 42, 63, 124, 40, 41, 58, 61, 59}} + p29.items = []parser{&p135} + p162.items = []parser{&p29} + var p136 = sequenceParser{id: 136, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var p89 = sequenceParser{id: 89, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p59 = charParser{id: 59, chars: []rune{58}} + p89.items = []parser{&p59} + var p56 = choiceParser{id: 56, commit: 66, name: "flag"} + var p32 = sequenceParser{id: 32, commit: 72, name: "alias", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{56}} + var p58 = charParser{id: 58, chars: []rune{97}} + var p11 = charParser{id: 11, chars: []rune{108}} + var p116 = charParser{id: 116, chars: []rune{105}} + var p151 = charParser{id: 151, chars: []rune{97}} + var p1 = charParser{id: 1, chars: []rune{115}} + p32.items = []parser{&p58, &p11, &p116, &p151, &p1} + var p2 = sequenceParser{id: 2, commit: 72, name: "ws", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{56}} + var p40 = charParser{id: 40, chars: []rune{119}} + var p88 = charParser{id: 88, chars: []rune{115}} + p2.items = []parser{&p40, &p88} + var p104 = sequenceParser{id: 104, commit: 72, name: "nows", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{56}} + var p118 = charParser{id: 118, chars: []rune{110}} + var p67 = charParser{id: 67, chars: []rune{111}} + var p174 = charParser{id: 174, chars: []rune{119}} + var p52 = charParser{id: 52, chars: []rune{115}} + p104.items = []parser{&p118, &p67, &p174, &p52} + var p171 = sequenceParser{id: 171, commit: 72, name: "failpass", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{56}} + var p66 = charParser{id: 66, chars: []rune{102}} + var p119 = charParser{id: 119, chars: []rune{97}} + var p124 = charParser{id: 124, chars: []rune{105}} + var p3 = charParser{id: 3, chars: []rune{108}} + var p53 = charParser{id: 53, chars: []rune{112}} + var p140 = charParser{id: 140, chars: []rune{97}} + var p170 = charParser{id: 170, chars: []rune{115}} + var p131 = charParser{id: 131, chars: []rune{115}} + p171.items = []parser{&p66, &p119, &p124, &p3, &p53, &p140, &p170, &p131} + var p27 = sequenceParser{id: 27, commit: 72, name: "root", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{56}} + var p109 = charParser{id: 109, chars: []rune{114}} + var p49 = charParser{id: 49, chars: []rune{111}} + var p120 = charParser{id: 120, chars: []rune{111}} + var p152 = charParser{id: 152, chars: []rune{116}} + p27.items = []parser{&p109, &p49, &p120, &p152} + p56.options = []parser{&p32, &p2, &p104, &p171, &p27} + p136.items = []parser{&p89, &p56} + p90.items = []parser{&p162, &p136} var p24 = sequenceParser{id: 24, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p154 = charParser{id: 154, chars: []rune{124}} - p24.items = []parser{&p154} - p92.items = []parser{&p24, &p186, &p177} - var p169 = sequenceParser{id: 169, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p169.items = []parser{&p186, &p92} - p170.items = []parser{&p177, &p186, &p92, &p169} - p52.options = []parser{&p11, &p128, &p33, &p130, &p170} - p44.items = []parser{&p18, &p186, &p111, &p186, &p52} - var p120 = sequenceParser{id: 120, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} - var p180 = sequenceParser{id: 180, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {0, -1}, {1, 1}}} - var p112 = sequenceParser{id: 112, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p104 = charParser{id: 104, chars: []rune{59}} - p112.items = []parser{&p104} - var p179 = sequenceParser{id: 179, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p179.items = []parser{&p186, &p112} - p180.items = []parser{&p112, &p179, &p186, &p44} - var p119 = sequenceParser{id: 119, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p119.items = []parser{&p186, &p180} - p120.items = []parser{&p186, &p180, &p119} - p121.items = []parser{&p44, &p120} - var p184 = sequenceParser{id: 184, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var p17 = charParser{id: 17, chars: []rune{61}} + p24.items = []parser{&p17} + var p165 = choiceParser{id: 165, commit: 66, name: "expression"} + var p37 = choiceParser{id: 37, commit: 66, name: "terminal", generalizations: []int{165, 83, 103}} + var p87 = sequenceParser{id: 87, commit: 72, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{37, 165, 83, 103}} + var p176 = charParser{id: 176, chars: []rune{46}} + p87.items = []parser{&p176} + var p99 = sequenceParser{id: 99, commit: 72, name: "char-class", ranges: [][]int{{1, 1}, {0, 1}, {0, -1}, {1, 1}, {1, 1}, {0, 1}, {0, -1}, {1, 1}}, generalizations: []int{37, 165, 83, 103}} + var p142 = sequenceParser{id: 142, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p51 = charParser{id: 51, chars: []rune{91}} + p142.items = []parser{&p51} + var p55 = sequenceParser{id: 55, commit: 72, name: "class-not", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p19 = charParser{id: 19, chars: []rune{94}} + p55.items = []parser{&p19} + var p158 = choiceParser{id: 158, commit: 10} + var p28 = choiceParser{id: 28, commit: 72, name: "class-char", generalizations: []int{158}} + var p65 = sequenceParser{id: 65, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{28, 158}} + var p81 = charParser{id: 81, not: true, chars: []rune{92, 91, 93, 94, 45}} + p65.items = []parser{&p81} + var p178 = sequenceParser{id: 178, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{28, 158}} + var p177 = sequenceParser{id: 177, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p157 = charParser{id: 157, chars: []rune{92}} + p177.items = []parser{&p157} + var p36 = sequenceParser{id: 36, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p82 = charParser{id: 82, not: true} + p36.items = []parser{&p82} + p178.items = []parser{&p177, &p36} + p28.options = []parser{&p65, &p178} + var p45 = sequenceParser{id: 45, commit: 72, name: "char-range", ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{158}} + var p133 = sequenceParser{id: 133, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p44 = charParser{id: 44, chars: []rune{45}} + p133.items = []parser{&p44} + p45.items = []parser{&p28, &p133, &p28} + p158.options = []parser{&p28, &p45} + var p61 = sequenceParser{id: 61, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p92 = charParser{id: 92, chars: []rune{93}} + p61.items = []parser{&p92} + p99.items = []parser{&p142, &p55, &p158, &p61} + var p80 = sequenceParser{id: 80, commit: 72, name: "char-sequence", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{37, 165, 83, 103}} + var p107 = sequenceParser{id: 107, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p7 = charParser{id: 7, chars: []rune{34}} + p107.items = []parser{&p7} + var p46 = choiceParser{id: 46, commit: 72, name: "sequence-char"} + var p134 = sequenceParser{id: 134, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{46}} + var p20 = charParser{id: 20, not: true, chars: []rune{92, 34}} + p134.items = []parser{&p20} + var p169 = sequenceParser{id: 169, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{46}} + var p100 = sequenceParser{id: 100, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p38 = charParser{id: 38, chars: []rune{92}} + p100.items = []parser{&p38} + var p173 = sequenceParser{id: 173, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p62 = charParser{id: 62, not: true} + p173.items = []parser{&p62} + p169.items = []parser{&p100, &p173} + p46.options = []parser{&p134, &p169} + var p143 = sequenceParser{id: 143, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p93 = charParser{id: 93, chars: []rune{34}} + p143.items = []parser{&p93} + p80.items = []parser{&p107, &p46, &p143} + p37.options = []parser{&p87, &p99, &p80} + var p31 = sequenceParser{id: 31, commit: 66, name: "group", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{165, 83, 103}} + var p184 = sequenceParser{id: 184, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p94 = charParser{id: 94, chars: []rune{40}} + p184.items = []parser{&p94} + var p95 = sequenceParser{id: 95, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p30 = charParser{id: 30, chars: []rune{41}} + p95.items = []parser{&p30} + p31.items = []parser{&p184, &p186, &p165, &p186, &p95} + var p48 = sequenceParser{id: 48, commit: 64, name: "sequence", ranges: [][]int{{1, 1}, {0, -1}}, generalizations: []int{165, 103}} + var p130 = sequenceParser{id: 130, commit: 72, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}} + var p83 = choiceParser{id: 83, commit: 10} + p83.options = []parser{&p37, &p162, &p31} + var p180 = choiceParser{id: 180, commit: 66, name: "quantity"} + var p149 = sequenceParser{id: 149, commit: 64, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{180}} var p126 = sequenceParser{id: 126, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p46 = charParser{id: 46, chars: []rune{59}} - p126.items = []parser{&p46} - var p183 = sequenceParser{id: 183, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p183.items = []parser{&p186, &p126} - p184.items = []parser{&p186, &p126, &p183} - p187.items = []parser{&p182, &p186, &p121, &p184} + var p74 = charParser{id: 74, chars: []rune{123}} + p126.items = []parser{&p74} + var p163 = sequenceParser{id: 163, commit: 64, name: "count", ranges: [][]int{{1, 1}}} + var p108 = sequenceParser{id: 108, commit: 74, name: "number", ranges: [][]int{{1, -1}, {1, -1}}} + var p15 = sequenceParser{id: 15, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p144 = charParser{id: 144, ranges: [][]rune{{48, 57}}} + p15.items = []parser{&p144} + p108.items = []parser{&p15} + p163.items = []parser{&p108} + var p8 = sequenceParser{id: 8, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p9 = charParser{id: 9, chars: []rune{125}} + p8.items = []parser{&p9} + p149.items = []parser{&p126, &p186, &p163, &p186, &p8} + var p23 = sequenceParser{id: 23, commit: 64, name: "range-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}, generalizations: []int{180}} + var p63 = sequenceParser{id: 63, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p150 = charParser{id: 150, chars: []rune{123}} + p63.items = []parser{&p150} + var p127 = sequenceParser{id: 127, commit: 64, name: "range-from", ranges: [][]int{{1, 1}}} + p127.items = []parser{&p108} + var p96 = sequenceParser{id: 96, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p39 = charParser{id: 39, chars: []rune{44}} + p96.items = []parser{&p39} + var p129 = sequenceParser{id: 129, commit: 64, name: "range-to", ranges: [][]int{{1, 1}}} + p129.items = []parser{&p108} + var p101 = sequenceParser{id: 101, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p21 = charParser{id: 21, chars: []rune{125}} + p101.items = []parser{&p21} + p23.items = []parser{&p63, &p186, &p127, &p186, &p96, &p186, &p129, &p186, &p101} + var p128 = sequenceParser{id: 128, commit: 72, name: "one-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{180}} + var p16 = charParser{id: 16, chars: []rune{43}} + p128.items = []parser{&p16} + var p57 = sequenceParser{id: 57, commit: 72, name: "zero-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{180}} + var p102 = charParser{id: 102, chars: []rune{42}} + p57.items = []parser{&p102} + var p179 = sequenceParser{id: 179, commit: 72, name: "zero-or-one", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{180}} + var p75 = charParser{id: 75, chars: []rune{63}} + p179.items = []parser{&p75} + p180.options = []parser{&p149, &p23, &p128, &p57, &p179} + p130.items = []parser{&p83, &p180} + var p47 = sequenceParser{id: 47, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p47.items = []parser{&p186, &p130} + p48.items = []parser{&p130, &p47} + var p77 = sequenceParser{id: 77, commit: 64, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{165}} + var p103 = choiceParser{id: 103, commit: 66, name: "option"} + p103.options = []parser{&p37, &p162, &p31, &p48} + var p164 = sequenceParser{id: 164, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}} + var p115 = sequenceParser{id: 115, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p10 = charParser{id: 10, chars: []rune{124}} + p115.items = []parser{&p10} + p164.items = []parser{&p115, &p186, &p103} + var p76 = sequenceParser{id: 76, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p76.items = []parser{&p186, &p164} + p77.items = []parser{&p103, &p186, &p164, &p76} + p165.options = []parser{&p37, &p162, &p31, &p48, &p77} + p68.items = []parser{&p90, &p186, &p24, &p186, &p165} + var p111 = sequenceParser{id: 111, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var p154 = sequenceParser{id: 154, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {0, -1}, {1, 1}}} + var p60 = sequenceParser{id: 60, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p33 = charParser{id: 33, chars: []rune{59}} + p60.items = []parser{&p33} + var p153 = sequenceParser{id: 153, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p153.items = []parser{&p186, &p60} + p154.items = []parser{&p60, &p153, &p186, &p68} + var p110 = sequenceParser{id: 110, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p110.items = []parser{&p186, &p154} + p111.items = []parser{&p186, &p154, &p110} + p112.items = []parser{&p68, &p111} + var p72 = sequenceParser{id: 72, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var p91 = sequenceParser{id: 91, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p4 = charParser{id: 4, chars: []rune{59}} + p91.items = []parser{&p4} + var p71 = sequenceParser{id: 71, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p71.items = []parser{&p186, &p91} + p72.items = []parser{&p186, &p91, &p71} + p187.items = []parser{&p70, &p186, &p112, &p72} p188.items = []parser{&p186, &p187, &p186} var b188 = sequenceBuilder{id: 188, commit: 32, name: "syntax", ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} var b186 = choiceBuilder{id: 186, commit: 2} var b185 = choiceBuilder{id: 185, commit: 70} - var b114 = choiceBuilder{id: 114, commit: 66} - var b1 = sequenceBuilder{id: 1, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b29 = charBuilder{} - b1.items = []builder{&b29} - var b80 = sequenceBuilder{id: 80, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b125 = choiceBuilder{id: 125, commit: 66} + var b84 = sequenceBuilder{id: 84, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} var b105 = charBuilder{} - b80.items = []builder{&b105} - var b81 = sequenceBuilder{id: 81, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b127 = charBuilder{} - b81.items = []builder{&b127} - var b2 = sequenceBuilder{id: 2, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b61 = charBuilder{} - b2.items = []builder{&b61} - var b106 = sequenceBuilder{id: 106, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + b84.items = []builder{&b105} + var b78 = sequenceBuilder{id: 78, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} var b175 = charBuilder{} - b106.items = []builder{&b175} - var b113 = sequenceBuilder{id: 113, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b69 = charBuilder{} - b113.items = []builder{&b69} - var b20 = sequenceBuilder{id: 20, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b7 = charBuilder{} - b20.items = []builder{&b7} - b114.options = []builder{&b1, &b80, &b81, &b2, &b106, &b113, &b20} - var b152 = sequenceBuilder{id: 152, commit: 72, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var b36 = choiceBuilder{id: 36, commit: 74} - var b35 = sequenceBuilder{id: 35, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var b145 = sequenceBuilder{id: 145, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b71 = charBuilder{} - var b160 = charBuilder{} - b145.items = []builder{&b71, &b160} - var b95 = sequenceBuilder{id: 95, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b21 = charBuilder{} - b95.items = []builder{&b21} - b35.items = []builder{&b145, &b95} - var b70 = sequenceBuilder{id: 70, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}} - var b90 = sequenceBuilder{id: 90, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b62 = charBuilder{} - var b8 = charBuilder{} - b90.items = []builder{&b62, &b8} - var b13 = choiceBuilder{id: 13, commit: 10} - var b3 = sequenceBuilder{id: 3, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b48 = sequenceBuilder{id: 48, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b47 = charBuilder{} - b48.items = []builder{&b47} - var b99 = sequenceBuilder{id: 99, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b9 = charBuilder{} - b99.items = []builder{&b9} - b3.items = []builder{&b48, &b99} - var b30 = sequenceBuilder{id: 30, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b136 = charBuilder{} - b30.items = []builder{&b136} - b13.options = []builder{&b3, &b30} - var b151 = sequenceBuilder{id: 151, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b54 = charBuilder{} - var b100 = charBuilder{} - b151.items = []builder{&b54, &b100} - b70.items = []builder{&b90, &b13, &b151} - b36.options = []builder{&b35, &b70} - var b10 = sequenceBuilder{id: 10, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} - var b146 = choiceBuilder{id: 146, commit: 74} - var b63 = sequenceBuilder{id: 63, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b161 = charBuilder{} - b63.items = []builder{&b161} - var b107 = sequenceBuilder{id: 107, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b86 = charBuilder{} - b107.items = []builder{&b86} - var b55 = sequenceBuilder{id: 55, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b122 = charBuilder{} - b55.items = []builder{&b122} - var b108 = sequenceBuilder{id: 108, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b96 = charBuilder{} - b108.items = []builder{&b96} - var b171 = sequenceBuilder{id: 171, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b115 = charBuilder{} - b171.items = []builder{&b115} + b78.items = []builder{&b175} + var b97 = sequenceBuilder{id: 97, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b85 = charBuilder{} + b97.items = []builder{&b85} + var b5 = sequenceBuilder{id: 5, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b26 = charBuilder{} + b5.items = []builder{&b26} + var b145 = sequenceBuilder{id: 145, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b41 = charBuilder{} + b145.items = []builder{&b41} var b137 = sequenceBuilder{id: 137, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b123 = charBuilder{} - b137.items = []builder{&b123} - b146.options = []builder{&b63, &b107, &b55, &b108, &b171, &b137} - var b162 = sequenceBuilder{id: 162, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b82 = charBuilder{} - b162.items = []builder{&b82} - b10.items = []builder{&b146, &b162, &b146, &b36} - b152.items = []builder{&b36, &b10} - b185.options = []builder{&b114, &b152} + var b18 = charBuilder{} + b137.items = []builder{&b18} + var b181 = sequenceBuilder{id: 181, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b98 = charBuilder{} + b181.items = []builder{&b98} + b125.options = []builder{&b84, &b78, &b97, &b5, &b145, &b137, &b181} + var b168 = sequenceBuilder{id: 168, commit: 72, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var b160 = choiceBuilder{id: 160, commit: 74} + var b42 = sequenceBuilder{id: 42, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var b35 = sequenceBuilder{id: 35, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b73 = charBuilder{} + var b117 = charBuilder{} + b35.items = []builder{&b73, &b117} + var b138 = sequenceBuilder{id: 138, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b132 = charBuilder{} + b138.items = []builder{&b132} + b42.items = []builder{&b35, &b138} + var b159 = sequenceBuilder{id: 159, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}} + var b166 = sequenceBuilder{id: 166, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b182 = charBuilder{} + var b113 = charBuilder{} + b166.items = []builder{&b182, &b113} + var b148 = choiceBuilder{id: 148, commit: 10} + var b54 = sequenceBuilder{id: 54, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b22 = sequenceBuilder{id: 22, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b146 = charBuilder{} + b22.items = []builder{&b146} + var b155 = sequenceBuilder{id: 155, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b147 = charBuilder{} + b155.items = []builder{&b147} + b54.items = []builder{&b22, &b155} + var b106 = sequenceBuilder{id: 106, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b34 = charBuilder{} + b106.items = []builder{&b34} + b148.options = []builder{&b54, &b106} + var b50 = sequenceBuilder{id: 50, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b114 = charBuilder{} + var b121 = charBuilder{} + b50.items = []builder{&b114, &b121} + b159.items = []builder{&b166, &b148, &b50} + b160.options = []builder{&b42, &b159} + var b123 = sequenceBuilder{id: 123, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} + var b79 = choiceBuilder{id: 79, commit: 74} + var b12 = sequenceBuilder{id: 12, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b167 = charBuilder{} + b12.items = []builder{&b167} + var b13 = sequenceBuilder{id: 13, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b6 = charBuilder{} + b13.items = []builder{&b6} + var b86 = sequenceBuilder{id: 86, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b172 = charBuilder{} + b86.items = []builder{&b172} + var b139 = sequenceBuilder{id: 139, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b122 = charBuilder{} + b139.items = []builder{&b122} + var b14 = sequenceBuilder{id: 14, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b183 = charBuilder{} + b14.items = []builder{&b183} + var b141 = sequenceBuilder{id: 141, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b43 = charBuilder{} + b141.items = []builder{&b43} + b79.options = []builder{&b12, &b13, &b86, &b139, &b14, &b141} + var b156 = sequenceBuilder{id: 156, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b64 = charBuilder{} + b156.items = []builder{&b64} + b123.items = []builder{&b79, &b156, &b79, &b160} + b168.items = []builder{&b160, &b123} + b185.options = []builder{&b125, &b168} b186.options = []builder{&b185} var b187 = sequenceBuilder{id: 187, commit: 66, ranges: [][]int{{0, 1}, {0, -1}, {0, 1}, {0, 1}}} - var b182 = sequenceBuilder{id: 182, commit: 2, ranges: [][]int{{1, 1}, {0, -1}}} - var b135 = sequenceBuilder{id: 135, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b155 = charBuilder{} - b135.items = []builder{&b155} - var b181 = sequenceBuilder{id: 181, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b181.items = []builder{&b186, &b135} - b182.items = []builder{&b135, &b181} - var b121 = sequenceBuilder{id: 121, commit: 66, ranges: [][]int{{1, 1}, {0, 1}}} - var b44 = sequenceBuilder{id: 44, commit: 64, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} - var b18 = sequenceBuilder{id: 18, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var b128 = sequenceBuilder{id: 128, commit: 72, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}} - var b39 = sequenceBuilder{id: 39, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b57 = charBuilder{} - b39.items = []builder{&b57} - b128.items = []builder{&b39} - var b178 = sequenceBuilder{id: 178, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b133 = sequenceBuilder{id: 133, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b43 = charBuilder{} - b133.items = []builder{&b43} - var b132 = choiceBuilder{id: 132, commit: 66} - var b93 = sequenceBuilder{id: 93, commit: 72, name: "alias", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b163 = charBuilder{} - var b27 = charBuilder{} - var b164 = charBuilder{} - var b158 = charBuilder{} - var b118 = charBuilder{} - b93.items = []builder{&b163, &b27, &b164, &b158, &b118} - var b131 = sequenceBuilder{id: 131, commit: 72, name: "ws", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b53 = charBuilder{} - var b5 = charBuilder{} - b131.items = []builder{&b53, &b5} - var b172 = sequenceBuilder{id: 172, commit: 72, name: "nows", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b109 = charBuilder{} - var b110 = charBuilder{} - var b60 = charBuilder{} - var b79 = charBuilder{} - b172.items = []builder{&b109, &b110, &b60, &b79} - var b25 = sequenceBuilder{id: 25, commit: 72, name: "failpass", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b45 = charBuilder{} - var b94 = charBuilder{} - var b89 = charBuilder{} - var b28 = charBuilder{} - var b42 = charBuilder{} - var b173 = charBuilder{} - var b149 = charBuilder{} - var b150 = charBuilder{} - b25.items = []builder{&b45, &b94, &b89, &b28, &b42, &b173, &b149, &b150} - var b144 = sequenceBuilder{id: 144, commit: 72, name: "root", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b159 = charBuilder{} - var b174 = charBuilder{} - var b76 = charBuilder{} - var b75 = charBuilder{} - b144.items = []builder{&b159, &b174, &b76, &b75} - b132.options = []builder{&b93, &b131, &b172, &b25, &b144} - b178.items = []builder{&b133, &b132} - b18.items = []builder{&b128, &b178} - var b111 = sequenceBuilder{id: 111, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b19 = charBuilder{} - b111.items = []builder{&b19} - var b52 = choiceBuilder{id: 52, commit: 66} - var b11 = choiceBuilder{id: 11, commit: 66} - var b37 = sequenceBuilder{id: 37, commit: 72, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b97 = charBuilder{} - b37.items = []builder{&b97} - var b49 = sequenceBuilder{id: 49, commit: 72, name: "char-class", ranges: [][]int{{1, 1}, {0, 1}, {0, -1}, {1, 1}, {1, 1}, {0, 1}, {0, -1}, {1, 1}}} - var b101 = sequenceBuilder{id: 101, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b67 = charBuilder{} - b101.items = []builder{&b67} - var b87 = sequenceBuilder{id: 87, commit: 72, name: "class-not", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b138 = charBuilder{} - b87.items = []builder{&b138} - var b83 = choiceBuilder{id: 83, commit: 10} - var b74 = choiceBuilder{id: 74, commit: 72, name: "class-char"} - var b56 = sequenceBuilder{id: 56, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b165 = charBuilder{} - b56.items = []builder{&b165} - var b31 = sequenceBuilder{id: 31, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b147 = sequenceBuilder{id: 147, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b91 = charBuilder{} - b147.items = []builder{&b91} - var b73 = sequenceBuilder{id: 73, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b72 = charBuilder{} - b73.items = []builder{&b72} - b31.items = []builder{&b147, &b73} - b74.options = []builder{&b56, &b31} - var b64 = sequenceBuilder{id: 64, commit: 72, name: "char-range", ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b167 = sequenceBuilder{id: 167, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b77 = charBuilder{} - b167.items = []builder{&b77} - b64.items = []builder{&b74, &b167, &b74} - b83.options = []builder{&b74, &b64} - var b65 = sequenceBuilder{id: 65, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b124 = charBuilder{} - b65.items = []builder{&b124} - b49.items = []builder{&b101, &b87, &b83, &b65} - var b140 = sequenceBuilder{id: 140, commit: 72, name: "char-sequence", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}} - var b38 = sequenceBuilder{id: 38, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b88 = charBuilder{} - b38.items = []builder{&b88} - var b22 = choiceBuilder{id: 22, commit: 72, name: "sequence-char"} - var b156 = sequenceBuilder{id: 156, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b102 = charBuilder{} - b156.items = []builder{&b102} - var b153 = sequenceBuilder{id: 153, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b139 = sequenceBuilder{id: 139, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b50 = charBuilder{} - b139.items = []builder{&b50} - var b78 = sequenceBuilder{id: 78, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b70 = sequenceBuilder{id: 70, commit: 2, ranges: [][]int{{1, 1}, {0, -1}}} + var b161 = sequenceBuilder{id: 161, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b25 = charBuilder{} + b161.items = []builder{&b25} + var b69 = sequenceBuilder{id: 69, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b69.items = []builder{&b186, &b161} + b70.items = []builder{&b161, &b69} + var b112 = sequenceBuilder{id: 112, commit: 66, ranges: [][]int{{1, 1}, {0, 1}}} + var b68 = sequenceBuilder{id: 68, commit: 64, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} + var b90 = sequenceBuilder{id: 90, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var b162 = sequenceBuilder{id: 162, commit: 72, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}} + var b29 = sequenceBuilder{id: 29, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b135 = charBuilder{} + b29.items = []builder{&b135} + b162.items = []builder{&b29} + var b136 = sequenceBuilder{id: 136, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b89 = sequenceBuilder{id: 89, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b59 = charBuilder{} + b89.items = []builder{&b59} + var b56 = choiceBuilder{id: 56, commit: 66} + var b32 = sequenceBuilder{id: 32, commit: 72, name: "alias", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b58 = charBuilder{} + var b11 = charBuilder{} var b116 = charBuilder{} - b78.items = []builder{&b116} - b153.items = []builder{&b139, &b78} - b22.options = []builder{&b156, &b153} - var b142 = sequenceBuilder{id: 142, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b14 = charBuilder{} - b142.items = []builder{&b14} - b140.items = []builder{&b38, &b22, &b142} - b11.options = []builder{&b37, &b49, &b140} - var b33 = sequenceBuilder{id: 33, commit: 66, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} - var b40 = sequenceBuilder{id: 40, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b166 = charBuilder{} - b40.items = []builder{&b166} - var b12 = sequenceBuilder{id: 12, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b98 = charBuilder{} - b12.items = []builder{&b98} - b33.items = []builder{&b40, &b186, &b52, &b186, &b12} - var b130 = sequenceBuilder{id: 130, commit: 64, name: "sequence", ranges: [][]int{{1, 1}, {0, -1}}} - var b143 = sequenceBuilder{id: 143, commit: 72, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}} - var b26 = choiceBuilder{id: 26, commit: 10} - b26.options = []builder{&b11, &b128, &b33} - var b176 = choiceBuilder{id: 176, commit: 66} - var b148 = sequenceBuilder{id: 148, commit: 64, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} - var b58 = sequenceBuilder{id: 58, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b6 = charBuilder{} - b58.items = []builder{&b6} - var b15 = sequenceBuilder{id: 15, commit: 64, name: "count", ranges: [][]int{{1, 1}}} - var b32 = sequenceBuilder{id: 32, commit: 74, ranges: [][]int{{1, -1}, {1, -1}}} - var b68 = sequenceBuilder{id: 68, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b34 = charBuilder{} - b68.items = []builder{&b34} - b32.items = []builder{&b68} - b15.items = []builder{&b32} - var b157 = sequenceBuilder{id: 157, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b103 = charBuilder{} - b157.items = []builder{&b103} - b148.items = []builder{&b58, &b186, &b15, &b186, &b157} - var b141 = sequenceBuilder{id: 141, commit: 64, name: "range-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} - var b85 = sequenceBuilder{id: 85, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b151 = charBuilder{} + var b1 = charBuilder{} + b32.items = []builder{&b58, &b11, &b116, &b151, &b1} + var b2 = sequenceBuilder{id: 2, commit: 72, name: "ws", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b40 = charBuilder{} + var b88 = charBuilder{} + b2.items = []builder{&b40, &b88} + var b104 = sequenceBuilder{id: 104, commit: 72, name: "nows", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b118 = charBuilder{} + var b67 = charBuilder{} + var b174 = charBuilder{} + var b52 = charBuilder{} + b104.items = []builder{&b118, &b67, &b174, &b52} + var b171 = sequenceBuilder{id: 171, commit: 72, name: "failpass", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} var b66 = charBuilder{} - b85.items = []builder{&b66} - var b125 = sequenceBuilder{id: 125, commit: 64, name: "range-from", ranges: [][]int{{1, 1}}} - b125.items = []builder{&b32} - var b168 = sequenceBuilder{id: 168, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b41 = charBuilder{} - b168.items = []builder{&b41} - var b84 = sequenceBuilder{id: 84, commit: 64, name: "range-to", ranges: [][]int{{1, 1}}} - b84.items = []builder{&b32} - var b16 = sequenceBuilder{id: 16, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b51 = charBuilder{} - b16.items = []builder{&b51} - b141.items = []builder{&b85, &b186, &b125, &b186, &b168, &b186, &b84, &b186, &b16} - var b4 = sequenceBuilder{id: 4, commit: 72, name: "one-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b23 = charBuilder{} - b4.items = []builder{&b23} - var b17 = sequenceBuilder{id: 17, commit: 72, name: "zero-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b134 = charBuilder{} - b17.items = []builder{&b134} - var b59 = sequenceBuilder{id: 59, commit: 72, name: "zero-or-one", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b117 = charBuilder{} - b59.items = []builder{&b117} - b176.options = []builder{&b148, &b141, &b4, &b17, &b59} - b143.items = []builder{&b26, &b176} - var b129 = sequenceBuilder{id: 129, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b129.items = []builder{&b186, &b143} - b130.items = []builder{&b143, &b129} - var b170 = sequenceBuilder{id: 170, commit: 64, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var b177 = choiceBuilder{id: 177, commit: 66} - b177.options = []builder{&b11, &b128, &b33, &b130} - var b92 = sequenceBuilder{id: 92, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}} + var b119 = charBuilder{} + var b124 = charBuilder{} + var b3 = charBuilder{} + var b53 = charBuilder{} + var b140 = charBuilder{} + var b170 = charBuilder{} + var b131 = charBuilder{} + b171.items = []builder{&b66, &b119, &b124, &b3, &b53, &b140, &b170, &b131} + var b27 = sequenceBuilder{id: 27, commit: 72, name: "root", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b109 = charBuilder{} + var b49 = charBuilder{} + var b120 = charBuilder{} + var b152 = charBuilder{} + b27.items = []builder{&b109, &b49, &b120, &b152} + b56.options = []builder{&b32, &b2, &b104, &b171, &b27} + b136.items = []builder{&b89, &b56} + b90.items = []builder{&b162, &b136} var b24 = sequenceBuilder{id: 24, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b154 = charBuilder{} - b24.items = []builder{&b154} - b92.items = []builder{&b24, &b186, &b177} - var b169 = sequenceBuilder{id: 169, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b169.items = []builder{&b186, &b92} - b170.items = []builder{&b177, &b186, &b92, &b169} - b52.options = []builder{&b11, &b128, &b33, &b130, &b170} - b44.items = []builder{&b18, &b186, &b111, &b186, &b52} - var b120 = sequenceBuilder{id: 120, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} - var b180 = sequenceBuilder{id: 180, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {0, -1}, {1, 1}}} - var b112 = sequenceBuilder{id: 112, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b104 = charBuilder{} - b112.items = []builder{&b104} - var b179 = sequenceBuilder{id: 179, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b179.items = []builder{&b186, &b112} - b180.items = []builder{&b112, &b179, &b186, &b44} - var b119 = sequenceBuilder{id: 119, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b119.items = []builder{&b186, &b180} - b120.items = []builder{&b186, &b180, &b119} - b121.items = []builder{&b44, &b120} - var b184 = sequenceBuilder{id: 184, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var b17 = charBuilder{} + b24.items = []builder{&b17} + var b165 = choiceBuilder{id: 165, commit: 66} + var b37 = choiceBuilder{id: 37, commit: 66} + var b87 = sequenceBuilder{id: 87, commit: 72, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b176 = charBuilder{} + b87.items = []builder{&b176} + var b99 = sequenceBuilder{id: 99, commit: 72, name: "char-class", ranges: [][]int{{1, 1}, {0, 1}, {0, -1}, {1, 1}, {1, 1}, {0, 1}, {0, -1}, {1, 1}}} + var b142 = sequenceBuilder{id: 142, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b51 = charBuilder{} + b142.items = []builder{&b51} + var b55 = sequenceBuilder{id: 55, commit: 72, name: "class-not", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b19 = charBuilder{} + b55.items = []builder{&b19} + var b158 = choiceBuilder{id: 158, commit: 10} + var b28 = choiceBuilder{id: 28, commit: 72, name: "class-char"} + var b65 = sequenceBuilder{id: 65, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b81 = charBuilder{} + b65.items = []builder{&b81} + var b178 = sequenceBuilder{id: 178, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b177 = sequenceBuilder{id: 177, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b157 = charBuilder{} + b177.items = []builder{&b157} + var b36 = sequenceBuilder{id: 36, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b82 = charBuilder{} + b36.items = []builder{&b82} + b178.items = []builder{&b177, &b36} + b28.options = []builder{&b65, &b178} + var b45 = sequenceBuilder{id: 45, commit: 72, name: "char-range", ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b133 = sequenceBuilder{id: 133, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b44 = charBuilder{} + b133.items = []builder{&b44} + b45.items = []builder{&b28, &b133, &b28} + b158.options = []builder{&b28, &b45} + var b61 = sequenceBuilder{id: 61, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b92 = charBuilder{} + b61.items = []builder{&b92} + b99.items = []builder{&b142, &b55, &b158, &b61} + var b80 = sequenceBuilder{id: 80, commit: 72, name: "char-sequence", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}} + var b107 = sequenceBuilder{id: 107, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b7 = charBuilder{} + b107.items = []builder{&b7} + var b46 = choiceBuilder{id: 46, commit: 72, name: "sequence-char"} + var b134 = sequenceBuilder{id: 134, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b20 = charBuilder{} + b134.items = []builder{&b20} + var b169 = sequenceBuilder{id: 169, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b100 = sequenceBuilder{id: 100, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b38 = charBuilder{} + b100.items = []builder{&b38} + var b173 = sequenceBuilder{id: 173, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b62 = charBuilder{} + b173.items = []builder{&b62} + b169.items = []builder{&b100, &b173} + b46.options = []builder{&b134, &b169} + var b143 = sequenceBuilder{id: 143, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b93 = charBuilder{} + b143.items = []builder{&b93} + b80.items = []builder{&b107, &b46, &b143} + b37.options = []builder{&b87, &b99, &b80} + var b31 = sequenceBuilder{id: 31, commit: 66, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} + var b184 = sequenceBuilder{id: 184, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b94 = charBuilder{} + b184.items = []builder{&b94} + var b95 = sequenceBuilder{id: 95, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b30 = charBuilder{} + b95.items = []builder{&b30} + b31.items = []builder{&b184, &b186, &b165, &b186, &b95} + var b48 = sequenceBuilder{id: 48, commit: 64, name: "sequence", ranges: [][]int{{1, 1}, {0, -1}}} + var b130 = sequenceBuilder{id: 130, commit: 72, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}} + var b83 = choiceBuilder{id: 83, commit: 10} + b83.options = []builder{&b37, &b162, &b31} + var b180 = choiceBuilder{id: 180, commit: 66} + var b149 = sequenceBuilder{id: 149, commit: 64, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} var b126 = sequenceBuilder{id: 126, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b46 = charBuilder{} - b126.items = []builder{&b46} - var b183 = sequenceBuilder{id: 183, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b183.items = []builder{&b186, &b126} - b184.items = []builder{&b186, &b126, &b183} - b187.items = []builder{&b182, &b186, &b121, &b184} + var b74 = charBuilder{} + b126.items = []builder{&b74} + var b163 = sequenceBuilder{id: 163, commit: 64, name: "count", ranges: [][]int{{1, 1}}} + var b108 = sequenceBuilder{id: 108, commit: 74, ranges: [][]int{{1, -1}, {1, -1}}} + var b15 = sequenceBuilder{id: 15, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b144 = charBuilder{} + b15.items = []builder{&b144} + b108.items = []builder{&b15} + b163.items = []builder{&b108} + var b8 = sequenceBuilder{id: 8, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b9 = charBuilder{} + b8.items = []builder{&b9} + b149.items = []builder{&b126, &b186, &b163, &b186, &b8} + var b23 = sequenceBuilder{id: 23, commit: 64, name: "range-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} + var b63 = sequenceBuilder{id: 63, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b150 = charBuilder{} + b63.items = []builder{&b150} + var b127 = sequenceBuilder{id: 127, commit: 64, name: "range-from", ranges: [][]int{{1, 1}}} + b127.items = []builder{&b108} + var b96 = sequenceBuilder{id: 96, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b39 = charBuilder{} + b96.items = []builder{&b39} + var b129 = sequenceBuilder{id: 129, commit: 64, name: "range-to", ranges: [][]int{{1, 1}}} + b129.items = []builder{&b108} + var b101 = sequenceBuilder{id: 101, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b21 = charBuilder{} + b101.items = []builder{&b21} + b23.items = []builder{&b63, &b186, &b127, &b186, &b96, &b186, &b129, &b186, &b101} + var b128 = sequenceBuilder{id: 128, commit: 72, name: "one-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b16 = charBuilder{} + b128.items = []builder{&b16} + var b57 = sequenceBuilder{id: 57, commit: 72, name: "zero-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b102 = charBuilder{} + b57.items = []builder{&b102} + var b179 = sequenceBuilder{id: 179, commit: 72, name: "zero-or-one", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b75 = charBuilder{} + b179.items = []builder{&b75} + b180.options = []builder{&b149, &b23, &b128, &b57, &b179} + b130.items = []builder{&b83, &b180} + var b47 = sequenceBuilder{id: 47, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b47.items = []builder{&b186, &b130} + b48.items = []builder{&b130, &b47} + var b77 = sequenceBuilder{id: 77, commit: 64, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var b103 = choiceBuilder{id: 103, commit: 66} + b103.options = []builder{&b37, &b162, &b31, &b48} + var b164 = sequenceBuilder{id: 164, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}} + var b115 = sequenceBuilder{id: 115, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b10 = charBuilder{} + b115.items = []builder{&b10} + b164.items = []builder{&b115, &b186, &b103} + var b76 = sequenceBuilder{id: 76, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b76.items = []builder{&b186, &b164} + b77.items = []builder{&b103, &b186, &b164, &b76} + b165.options = []builder{&b37, &b162, &b31, &b48, &b77} + b68.items = []builder{&b90, &b186, &b24, &b186, &b165} + var b111 = sequenceBuilder{id: 111, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var b154 = sequenceBuilder{id: 154, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {0, -1}, {1, 1}}} + var b60 = sequenceBuilder{id: 60, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b33 = charBuilder{} + b60.items = []builder{&b33} + var b153 = sequenceBuilder{id: 153, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b153.items = []builder{&b186, &b60} + b154.items = []builder{&b60, &b153, &b186, &b68} + var b110 = sequenceBuilder{id: 110, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b110.items = []builder{&b186, &b154} + b111.items = []builder{&b186, &b154, &b110} + b112.items = []builder{&b68, &b111} + var b72 = sequenceBuilder{id: 72, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var b91 = sequenceBuilder{id: 91, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b4 = charBuilder{} + b91.items = []builder{&b4} + var b71 = sequenceBuilder{id: 71, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b71.items = []builder{&b186, &b91} + b72.items = []builder{&b186, &b91, &b71} + b187.items = []builder{&b70, &b186, &b112, &b72} b188.items = []builder{&b186, &b187, &b186} return parse(r, &p188, &b188) diff --git a/syntax.go b/syntax.go index 21db0d0..2a2f0fa 100644 --- a/syntax.go +++ b/syntax.go @@ -71,84 +71,12 @@ func parserNotFound(name string) error { return fmt.Errorf("parser not found: %s", name) } -const symbolChars = "^\\\\ \\n\\t\\b\\f\\r\\v/.\\[\\]\\\"{}\\^+*?|():=;" - -func parseClass(class []rune) (not bool, chars []rune, ranges [][]rune, err error) { - if class[0] == '^' { - not = true - class = class[1:] - } - - for { - if len(class) == 0 { - return - } - - var c0 rune - c0, class = class[0], class[1:] - - /* - this doesn't happen: - switch c0 { - case '[', ']', '^', '-': - err = errInvalidDefinition - return - } - */ - - if c0 == '\\' { - /* - this doesn't happen: - if len(class) == 0 { - err = errInvalidDefinition - return - } - */ - - c0, class = unescapeChar(class[0]), class[1:] - } - - if len(class) < 2 || class[0] != '-' { - chars = append(chars, c0) - continue - } - - var c1 rune - c1, class = class[1], class[2:] - - /* - this doesn't happen: - switch c1 { - case '[', ']', '^', '-': - err = errInvalidDefinition - return - } - - if c1 == '\\' { - if len(class) == 0 { - err = errInvalidDefinition - return - } - - c1, class = unescapeChar(class[0]), class[1:] - } - */ - - ranges = append(ranges, []rune{c0, c1}) - } -} - -func parseSymbolChars(c []rune) []rune { - _, chars, _, _ := parseClass(c) - return chars -} - -var symbolCharRunes = parseSymbolChars([]rune(symbolChars)) +var symbolChars = []rune("\\ \n\t\b\f\r\v/.[]\"{}^+*?|():=;") func isValidSymbol(n string) bool { runes := []rune(n) for _, r := range runes { - if !matchChar(symbolCharRunes, nil, true, r) { + if !matchChar(symbolChars, nil, true, r) { return false } } diff --git a/syntax_test.go b/syntax_test.go index 90605b8..bee7b2d 100644 --- a/syntax_test.go +++ b/syntax_test.go @@ -339,8 +339,6 @@ func TestDefinition(t *testing.T) { } func TestReadSyntax(t *testing.T) { - t.Skip() - t.Run("already initialized", func(t *testing.T) { s := &Syntax{} if err := s.AnyChar("a", None); err != nil { @@ -358,38 +356,27 @@ func TestReadSyntax(t *testing.T) { } }) - t.Run("not implemented", func(t *testing.T) { + t.Run("read invalid syntax", func(t *testing.T) { s := &Syntax{} - if err := s.ReadSyntax(bytes.NewBuffer(nil)); err == nil { - t.Error(err) + if err := s.ReadSyntax(bytes.NewBufferString("foo")); err == nil { + t.Error("failed to fail") } }) } -func TestGenerateSyntax(t *testing.T) { - t.Skip() +func TestUserDefinedClassRange(t *testing.T) { + s := &Syntax{} + if err := s.Class("symbol-char", None, false, []rune{'_'}, [][]rune{{'a', 'z'}, {'A', 'Z'}}); err != nil { + t.Error(err) + return + } - t.Run("init fails", func(t *testing.T) { - s := &Syntax{} - if err := s.Choice("a", None, "b"); err != nil { - t.Error(err) - return - } + if err := s.Sequence("symbol", None, SequenceItem{Name: "symbol-char", Min: 1, Max: -1}); err != nil { + t.Error(err) + return + } - if err := s.Generate(GeneratorOptions{}, bytes.NewBuffer(nil)); err == nil { - t.Error(err) - } - }) - - t.Run("not implemented", func(t *testing.T) { - s := &Syntax{} - if err := s.AnyChar("a", None); err != nil { - t.Error(err) - return - } - - if err := s.Generate(GeneratorOptions{}, bytes.NewBuffer(nil)); err == nil { - t.Error(err) - } - }) + if _, err := s.Parse(bytes.NewBufferString("_abc")); err != nil { + t.Error(err) + } }