diff --git a/.gitignore b/.gitignore index e6d1274..809bcee 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.out .coverprofile codecov +cmd/treerack/treerack diff --git a/Makefile b/Makefile index b63e09d..2a498d2 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,10 @@ imports: $(SOURCES) build: $(SOURCES) go build + go build -o cmd/treerack/treerack ./cmd/treerack + +install: $(SOURCES) + go install ./cmd/treerack head: $(SOURCES) go run scripts/createhead.go -- \ @@ -26,15 +30,15 @@ head: $(SOURCES) syntaxhead.go \ > head.go -generate: $(SOURCES) $(PARSERS) head - go run scripts/boot.go < syntax.treerack > self/self.go.next +generate: $(SOURCES) $(PARSERS) head install + treerack generate -export -package-name self < syntax.treerack > self/self.go.next @mv self/self.go{.next,} @gofmt -s -w self/self.go -regenerate: $(SOURCES) $(PARSERS) head - go run scripts/boot.go < syntax.treerack > self/self.go.next +regenerate: $(SOURCES) $(PARSERS) head install + treerack generate -export -package-name self < syntax.treerack > self/self.go.next @mv self/self.go{.next,} - go run scripts/boot.go < syntax.treerack > self/self.go.next + treerack generate -export -package-name self < syntax.treerack > self/self.go.next @mv self/self.go{.next,} @gofmt -s -w self/self.go diff --git a/cmd/treerack/doc.go b/cmd/treerack/doc.go new file mode 100644 index 0000000..f8005c6 --- /dev/null +++ b/cmd/treerack/doc.go @@ -0,0 +1,25 @@ +package main + +const summary = `treerack - parser generator - https://github.com/aryszka/treerack` + +const commandsHelp = `Available commands: +generate generates a parser from a syntax definition +help prints the current help + +See more details about a particular command by calling: +treerack -help` + +const docRef = "See more documentation about the definition syntax and the parser output at https://github.com/aryszka/treerack." + +const syntaxFileUsage = "path to the syntax file in treerack format" + +const syntaxStringUsage = "inline syntax in treerack format" + +const packageNameUsage = `package name of the generated code` + +const exportUsage = `when the export flag is set, the generated code will have exported symbols to allow using it as a separate package` + +const generateUsage = `treerack generate takes a syntax description from the standard input, or a file, or inline string, and generates code implementing a parser. It prints the parser code to the standard output.` + +const generateExample = `Example: +treerack generate < syntax.treerack > parser.go` diff --git a/cmd/treerack/generate.go b/cmd/treerack/generate.go new file mode 100644 index 0000000..31a3f0d --- /dev/null +++ b/cmd/treerack/generate.go @@ -0,0 +1,125 @@ +package main + +import ( + "bytes" + "flag" + "io" + "os" + + "github.com/aryszka/treerack" + + "golang.org/x/crypto/ssh/terminal" +) + +type generateOptions struct { + syntax string + syntaxFile string + packageName string + export bool +} + +var isTest bool + +func flagSet(o *generateOptions, output io.Writer) *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.Usage = func() {} + fs.SetOutput(output) + fs.StringVar(&o.syntax, "syntax-string", "", syntaxStringUsage) + fs.StringVar(&o.syntaxFile, "syntax", "", syntaxFileUsage) + fs.StringVar(&o.packageName, "package-name", "", packageNameUsage) + fs.BoolVar(&o.export, "export", false, exportUsage) + return fs +} + +func helpGenerate() { + stdout(generateUsage) + stdout() + stdout("Options:") + fs := flagSet(&generateOptions{}, os.Stdout) + fs.PrintDefaults() + stdout() + stdout(generateExample) +} + +func flagError(fs *flag.FlagSet) { + stderr() + stderr("Options:") + fs.PrintDefaults() +} + +func multipleInputsError(fs *flag.FlagSet) { + stderr("only one of syntax file or syntax string is allowed") + stderr() + stderr("Options:") + fs.PrintDefaults() +} + +func noInputError(fs *flag.FlagSet) { + stderr("missing syntax input") + stderr() + stderr("Options:") + fs.PrintDefaults() +} + +func generate(args []string) int { + if len(args) > 0 && args[0] == "-help" { + helpGenerate() + return 0 + } + + var options generateOptions + fs := flagSet(&options, os.Stderr) + if err := fs.Parse(args); err != nil { + flagError(fs) + return -1 + } + + if options.syntaxFile != "" && options.syntax != "" { + multipleInputsError(fs) + return -1 + } + + var hasInput bool + if options.syntaxFile == "" && options.syntax == "" { + fdint := int(os.Stdin.Fd()) + hasInput = !isTest && !terminal.IsTerminal(fdint) + } + + if !hasInput && options.syntaxFile == "" && options.syntax == "" { + noInputError(fs) + return -1 + } + + var input io.Reader + if hasInput { + input = os.Stdin + } else if options.syntaxFile != "" { + f, err := os.Open(options.syntaxFile) + if err != nil { + stderr(err) + return -1 + } + + defer f.Close() + input = f + } else if options.syntax != "" { + input = bytes.NewBufferString(options.syntax) + } + + s := &treerack.Syntax{} + if err := s.ReadSyntax(input); err != nil { + stderr(err) + return -1 + } + + var goptions treerack.GeneratorOptions + goptions.PackageName = options.packageName + goptions.Export = options.export + + if err := s.Generate(goptions, os.Stdout); err != nil { + stderr(err) + return -1 + } + + return 0 +} diff --git a/cmd/treerack/main.go b/cmd/treerack/main.go new file mode 100644 index 0000000..9157b6f --- /dev/null +++ b/cmd/treerack/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "os" +) + +func mainHelp() { + stdout(summary) + stdout() + stdout(commandsHelp) + stdout() + stdout(docRef) +} + +func main() { + if len(os.Args) == 1 { + stderr("missing command") + stderr() + stderr(commandsHelp) + stdout() + stdout(docRef) + os.Exit(-1) + } + + switch os.Args[1] { + case "generate": + exit := generate(os.Args[2:]) + os.Exit(exit) + case "help", "-help": + mainHelp() + default: + stderr("invalid command") + stderr() + stderr(commandsHelp) + os.Exit(-1) + } +} diff --git a/cmd/treerack/out.go b/cmd/treerack/out.go new file mode 100644 index 0000000..a885a59 --- /dev/null +++ b/cmd/treerack/out.go @@ -0,0 +1,14 @@ +package main + +import ( + "fmt" + "os" +) + +func stderr(a ...interface{}) { + fmt.Fprintln(os.Stderr, a...) +} + +func stdout(a ...interface{}) { + fmt.Fprintln(os.Stderr, a...) +} diff --git a/head.go b/head.go index b15f52f..0e2b038 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\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 parseInput(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/scripts/boot.go b/scripts/boot.go deleted file mode 100644 index 83e20d6..0000000 --- a/scripts/boot.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - "log" - "os" - - "github.com/aryszka/treerack" -) - -func main() { - s := &treerack.Syntax{} - - if err := s.ReadSyntax(os.Stdin); err != nil { - log.Fatalln(err) - } - - if err := s.Generate(treerack.GeneratorOptions{PackageName: "self"}, os.Stdout); err != nil { - log.Fatalln(err) - } -} diff --git a/self/self.go b/self/self.go index 1594db9..67bd0a6 100644 --- a/self/self.go +++ b/self/self.go @@ -719,7 +719,7 @@ var ErrInvalidUnicodeCharacter = errors.New("invalid unicode character") func (pe *ParseError) Error() string { return fmt.Sprintf("%s:%d:%d:parse failed, parsing: %s", pe.Input, pe.Line+1, pe.Column+1, pe.Definition) } -func parse(r io.Reader, p parser, b builder) (*Node, error) { +func parseInput(r io.Reader, p parser, b builder) (*Node, error) { c := newContext(bufio.NewReader(r)) p.parse(c) if c.readErr != nil { @@ -741,599 +741,599 @@ 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 p124 = choiceParser{id: 124, commit: 66, name: "wschar", generalizations: []int{185, 186}} - var p38 = sequenceParser{id: 38, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{124, 185, 186}} - var p160 = charParser{id: 160, chars: []rune{32}} - p38.items = []parser{&p160} - var p181 = sequenceParser{id: 181, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{124, 185, 186}} - var p32 = charParser{id: 32, chars: []rune{9}} - p181.items = []parser{&p32} - var p75 = sequenceParser{id: 75, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{124, 185, 186}} - var p92 = charParser{id: 92, chars: []rune{10}} - p75.items = []parser{&p92} - var p83 = sequenceParser{id: 83, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{124, 185, 186}} - var p61 = charParser{id: 61, chars: []rune{8}} - p83.items = []parser{&p61} - var p131 = sequenceParser{id: 131, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{124, 185, 186}} - var p139 = charParser{id: 139, chars: []rune{12}} - p131.items = []parser{&p139} - var p182 = sequenceParser{id: 182, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{124, 185, 186}} - var p12 = charParser{id: 12, chars: []rune{13}} - p182.items = []parser{&p12} - var p165 = sequenceParser{id: 165, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{124, 185, 186}} - var p118 = charParser{id: 118, chars: []rune{11}} - p165.items = []parser{&p118} - p124.options = []parser{&p38, &p181, &p75, &p83, &p131, &p182, &p165} - var p78 = sequenceParser{id: 78, commit: 72, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{185, 186}} - var p62 = choiceParser{id: 62, commit: 74, name: "comment-segment"} - var p33 = sequenceParser{id: 33, commit: 74, name: "line-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{62}} - var p113 = sequenceParser{id: 113, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var p112 = charParser{id: 112, chars: []rune{47}} - var p70 = charParser{id: 70, chars: []rune{47}} - p113.items = []parser{&p112, &p70} - var p47 = sequenceParser{id: 47, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p76 = charParser{id: 76, not: true, chars: []rune{10}} - p47.items = []parser{&p76} - p33.items = []parser{&p113, &p47} - var p101 = sequenceParser{id: 101, commit: 74, name: "block-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{62}} - var p151 = sequenceParser{id: 151, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var p84 = charParser{id: 84, chars: []rune{47}} - var p68 = charParser{id: 68, chars: []rune{42}} - p151.items = []parser{&p84, &p68} - var p171 = choiceParser{id: 171, commit: 10} - var p100 = sequenceParser{id: 100, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{171}} - var p111 = sequenceParser{id: 111, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p93 = charParser{id: 93, chars: []rune{42}} - p111.items = []parser{&p93} - var p143 = sequenceParser{id: 143, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p99 = charParser{id: 99, not: true, chars: []rune{47}} - p143.items = []parser{&p99} - p100.items = []parser{&p111, &p143} - var p148 = sequenceParser{id: 148, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{171}} - var p166 = charParser{id: 166, not: true, chars: []rune{42}} - p148.items = []parser{&p166} - p171.options = []parser{&p100, &p148} - var p46 = sequenceParser{id: 46, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var p19 = charParser{id: 19, chars: []rune{42}} - var p69 = charParser{id: 69, chars: []rune{47}} - p46.items = []parser{&p19, &p69} - p101.items = []parser{&p151, &p171, &p46} - p62.options = []parser{&p33, &p101} - var p13 = sequenceParser{id: 13, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} - var p125 = choiceParser{id: 125, commit: 74, name: "ws-no-nl"} - var p26 = sequenceParser{id: 26, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125}} - var p77 = charParser{id: 77, chars: []rune{32}} - p26.items = []parser{&p77} - var p172 = sequenceParser{id: 172, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125}} - var p94 = charParser{id: 94, chars: []rune{9}} - p172.items = []parser{&p94} - var p152 = sequenceParser{id: 152, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125}} - var p102 = charParser{id: 102, chars: []rune{8}} - p152.items = []parser{&p102} - var p85 = sequenceParser{id: 85, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125}} - var p63 = charParser{id: 63, chars: []rune{12}} - p85.items = []parser{&p63} - var p167 = sequenceParser{id: 167, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125}} - var p149 = charParser{id: 149, chars: []rune{13}} - p167.items = []parser{&p149} - var p144 = sequenceParser{id: 144, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{125}} - var p168 = charParser{id: 168, chars: []rune{11}} - p144.items = []parser{&p168} - p125.options = []parser{&p26, &p172, &p152, &p85, &p167, &p144} - var p27 = sequenceParser{id: 27, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p95 = charParser{id: 95, chars: []rune{10}} - p27.items = []parser{&p95} - p13.items = []parser{&p125, &p27, &p125, &p62} - p78.items = []parser{&p62, &p13} - p185.options = []parser{&p124, &p78} + var p5 = choiceParser{id: 5, commit: 66, name: "wschar", generalizations: []int{185, 186}} + var p112 = sequenceParser{id: 112, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{5, 185, 186}} + var p125 = charParser{id: 125, chars: []rune{32}} + p112.items = []parser{&p125} + var p173 = sequenceParser{id: 173, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{5, 185, 186}} + var p102 = charParser{id: 102, chars: []rune{9}} + p173.items = []parser{&p102} + var p51 = sequenceParser{id: 51, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{5, 185, 186}} + var p153 = charParser{id: 153, chars: []rune{10}} + p51.items = []parser{&p153} + var p126 = sequenceParser{id: 126, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{5, 185, 186}} + var p141 = charParser{id: 141, chars: []rune{8}} + p126.items = []parser{&p141} + var p40 = sequenceParser{id: 40, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{5, 185, 186}} + var p113 = charParser{id: 113, chars: []rune{12}} + p40.items = []parser{&p113} + var p142 = sequenceParser{id: 142, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{5, 185, 186}} + var p60 = charParser{id: 60, chars: []rune{13}} + p142.items = []parser{&p60} + var p41 = sequenceParser{id: 41, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{5, 185, 186}} + var p103 = charParser{id: 103, chars: []rune{11}} + p41.items = []parser{&p103} + p5.options = []parser{&p112, &p173, &p51, &p126, &p40, &p142, &p41} + var p73 = sequenceParser{id: 73, commit: 72, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{185, 186}} + var p97 = choiceParser{id: 97, commit: 74, name: "comment-segment"} + var p104 = sequenceParser{id: 104, commit: 74, name: "line-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{97}} + var p149 = sequenceParser{id: 149, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var p42 = charParser{id: 42, chars: []rune{47}} + var p17 = charParser{id: 17, chars: []rune{47}} + p149.items = []parser{&p42, &p17} + var p146 = sequenceParser{id: 146, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p32 = charParser{id: 32, not: true, chars: []rune{10}} + p146.items = []parser{&p32} + p104.items = []parser{&p149, &p146} + var p62 = sequenceParser{id: 62, commit: 74, name: "block-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{97}} + var p92 = sequenceParser{id: 92, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var p171 = charParser{id: 171, chars: []rune{47}} + var p52 = charParser{id: 52, chars: []rune{42}} + p92.items = []parser{&p171, &p52} + var p8 = choiceParser{id: 8, commit: 10} + var p154 = sequenceParser{id: 154, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{8}} + var p118 = sequenceParser{id: 118, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p127 = charParser{id: 127, chars: []rune{42}} + p118.items = []parser{&p127} + var p61 = sequenceParser{id: 61, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p121 = charParser{id: 121, not: true, chars: []rune{47}} + p61.items = []parser{&p121} + p154.items = []parser{&p118, &p61} + var p22 = sequenceParser{id: 22, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{8}} + var p155 = charParser{id: 155, not: true, chars: []rune{42}} + p22.items = []parser{&p155} + p8.options = []parser{&p154, &p22} + var p53 = sequenceParser{id: 53, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var p79 = charParser{id: 79, chars: []rune{42}} + var p158 = charParser{id: 158, chars: []rune{47}} + p53.items = []parser{&p79, &p158} + p62.items = []parser{&p92, &p8, &p53} + p97.options = []parser{&p104, &p62} + var p80 = sequenceParser{id: 80, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} + var p135 = choiceParser{id: 135, commit: 74, name: "ws-no-nl"} + var p86 = sequenceParser{id: 86, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{135}} + var p105 = charParser{id: 105, chars: []rune{32}} + p86.items = []parser{&p105} + var p25 = sequenceParser{id: 25, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{135}} + var p35 = charParser{id: 35, chars: []rune{9}} + p25.items = []parser{&p35} + var p165 = sequenceParser{id: 165, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{135}} + var p93 = charParser{id: 93, chars: []rune{8}} + p165.items = []parser{&p93} + var p9 = sequenceParser{id: 9, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{135}} + var p98 = charParser{id: 98, chars: []rune{12}} + p9.items = []parser{&p98} + var p134 = sequenceParser{id: 134, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{135}} + var p147 = charParser{id: 147, chars: []rune{13}} + p134.items = []parser{&p147} + var p119 = sequenceParser{id: 119, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{135}} + var p87 = charParser{id: 87, chars: []rune{11}} + p119.items = []parser{&p87} + p135.options = []parser{&p86, &p25, &p165, &p9, &p134, &p119} + var p136 = sequenceParser{id: 136, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p122 = charParser{id: 122, chars: []rune{10}} + p136.items = []parser{&p122} + p80.items = []parser{&p135, &p136, &p135, &p97} + p73.items = []parser{&p97, &p80} + p185.options = []parser{&p5, &p73} 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 p8 = sequenceParser{id: 8, commit: 2, ranges: [][]int{{1, 1}, {0, -1}}} - var p11 = sequenceParser{id: 11, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p31 = charParser{id: 31, chars: []rune{59}} - p11.items = []parser{&p31} - var p7 = sequenceParser{id: 7, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p7.items = []parser{&p186, &p11} - p8.items = []parser{&p11, &p7} - var p45 = sequenceParser{id: 45, commit: 66, name: "definitions", ranges: [][]int{{1, 1}, {0, 1}}} - var p42 = sequenceParser{id: 42, commit: 64, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} - var p87 = sequenceParser{id: 87, commit: 74, name: "definition-name", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var p88 = sequenceParser{id: 88, commit: 72, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}, generalizations: []int{64, 72, 155}} - var p57 = sequenceParser{id: 57, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p14 = charParser{id: 14, 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}} - p57.items = []parser{&p14} - p88.items = []parser{&p57} - var p158 = sequenceParser{id: 158, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var p82 = sequenceParser{id: 82, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p146 = charParser{id: 146, chars: []rune{58}} - p82.items = []parser{&p146} - var p4 = choiceParser{id: 4, commit: 66, name: "flag"} - var p97 = sequenceParser{id: 97, 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{4}} - var p128 = charParser{id: 128, chars: []rune{97}} - var p163 = charParser{id: 163, chars: []rune{108}} - var p150 = charParser{id: 150, chars: []rune{105}} - var p106 = charParser{id: 106, chars: []rune{97}} - var p138 = charParser{id: 138, chars: []rune{115}} - p97.items = []parser{&p128, &p163, &p150, &p106, &p138} - var p54 = sequenceParser{id: 54, commit: 72, name: "ws", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{4}} - var p67 = charParser{id: 67, chars: []rune{119}} - var p41 = charParser{id: 41, chars: []rune{115}} - p54.items = []parser{&p67, &p41} - var p129 = sequenceParser{id: 129, 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{4}} - var p30 = charParser{id: 30, chars: []rune{110}} - var p24 = charParser{id: 24, chars: []rune{111}} - var p65 = charParser{id: 65, chars: []rune{119}} - var p16 = charParser{id: 16, chars: []rune{115}} - p129.items = []parser{&p30, &p24, &p65, &p16} - var p110 = sequenceParser{id: 110, 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{4}} - var p179 = charParser{id: 179, chars: []rune{102}} - var p121 = charParser{id: 121, chars: []rune{97}} - var p73 = charParser{id: 73, chars: []rune{105}} - var p130 = charParser{id: 130, chars: []rune{108}} - var p17 = charParser{id: 17, chars: []rune{112}} - var p180 = charParser{id: 180, chars: []rune{97}} - var p74 = charParser{id: 74, chars: []rune{115}} - var p184 = charParser{id: 184, chars: []rune{115}} - p110.items = []parser{&p179, &p121, &p73, &p130, &p17, &p180, &p74, &p184} - var p18 = sequenceParser{id: 18, 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{4}} - var p107 = charParser{id: 107, chars: []rune{114}} - var p50 = charParser{id: 50, chars: []rune{111}} - var p122 = charParser{id: 122, chars: []rune{111}} - var p123 = charParser{id: 123, chars: []rune{116}} - p18.items = []parser{&p107, &p50, &p122, &p123} - p4.options = []parser{&p97, &p54, &p129, &p110, &p18} - p158.items = []parser{&p82, &p4} - p87.items = []parser{&p88, &p158} - var p5 = sequenceParser{id: 5, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p159 = charParser{id: 159, chars: []rune{61}} - p5.items = []parser{&p159} - var p64 = choiceParser{id: 64, commit: 66, name: "expression"} - var p104 = choiceParser{id: 104, commit: 66, name: "terminal", generalizations: []int{64, 72, 155}} - var p103 = sequenceParser{id: 103, commit: 72, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{104, 64, 72, 155}} - var p114 = charParser{id: 114, chars: []rune{46}} - p103.items = []parser{&p114} - var p51 = sequenceParser{id: 51, 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{104, 64, 72, 155}} - var p153 = sequenceParser{id: 153, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p115 = charParser{id: 115, chars: []rune{91}} - p153.items = []parser{&p115} - var p71 = sequenceParser{id: 71, commit: 72, name: "class-not", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p132 = charParser{id: 132, chars: []rune{94}} - p71.items = []parser{&p132} - var p116 = choiceParser{id: 116, commit: 10} - var p48 = choiceParser{id: 48, commit: 72, name: "class-char", generalizations: []int{116}} - var p156 = sequenceParser{id: 156, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{48, 116}} - var p173 = charParser{id: 173, not: true, chars: []rune{92, 91, 93, 94, 45}} - p156.items = []parser{&p173} - var p1 = sequenceParser{id: 1, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{48, 116}} + var p29 = sequenceParser{id: 29, commit: 2, ranges: [][]int{{1, 1}, {0, -1}}} + var p184 = sequenceParser{id: 184, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p140 = charParser{id: 140, chars: []rune{59}} + p184.items = []parser{&p140} + var p28 = sequenceParser{id: 28, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p28.items = []parser{&p186, &p184} + p29.items = []parser{&p184, &p28} + var p59 = sequenceParser{id: 59, commit: 66, name: "definitions", ranges: [][]int{{1, 1}, {0, 1}}} + var p172 = sequenceParser{id: 172, commit: 64, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} + var p91 = sequenceParser{id: 91, commit: 74, name: "definition-name", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var p10 = sequenceParser{id: 10, commit: 72, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}, generalizations: []int{116, 63, 77}} + var p69 = sequenceParser{id: 69, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p100 = charParser{id: 100, 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}} + p69.items = []parser{&p100} + p10.items = []parser{&p69} + var p4 = sequenceParser{id: 4, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var p66 = sequenceParser{id: 66, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p133 = charParser{id: 133, chars: []rune{58}} + p66.items = []parser{&p133} + var p20 = choiceParser{id: 20, commit: 66, name: "flag"} + var p170 = sequenceParser{id: 170, 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{20}} + var p169 = charParser{id: 169, chars: []rune{97}} + var p64 = charParser{id: 64, chars: []rune{108}} + var p45 = charParser{id: 45, chars: []rune{105}} + var p111 = charParser{id: 111, chars: []rune{97}} + var p95 = charParser{id: 95, chars: []rune{115}} + p170.items = []parser{&p169, &p64, &p45, &p111, &p95} + var p23 = sequenceParser{id: 23, commit: 72, name: "ws", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{20}} + var p101 = charParser{id: 101, chars: []rune{119}} + var p15 = charParser{id: 15, chars: []rune{115}} + p23.items = []parser{&p101, &p15} + var p178 = sequenceParser{id: 178, 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{20}} + var p48 = charParser{id: 48, chars: []rune{110}} + var p137 = charParser{id: 137, chars: []rune{111}} + var p144 = charParser{id: 144, chars: []rune{119}} + var p65 = charParser{id: 65, chars: []rune{115}} + p178.items = []parser{&p48, &p137, &p144, &p65} + var p14 = sequenceParser{id: 14, 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{20}} + var p117 = charParser{id: 117, chars: []rune{102}} + var p124 = charParser{id: 124, chars: []rune{97}} + var p49 = charParser{id: 49, chars: []rune{105}} + var p179 = charParser{id: 179, chars: []rune{108}} + var p56 = charParser{id: 56, chars: []rune{112}} + var p34 = charParser{id: 34, chars: []rune{97}} + var p24 = charParser{id: 24, chars: []rune{115}} + var p96 = charParser{id: 96, chars: []rune{115}} + p14.items = []parser{&p117, &p124, &p49, &p179, &p56, &p34, &p24, &p96} + var p50 = sequenceParser{id: 50, 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{20}} + var p152 = charParser{id: 152, chars: []rune{114}} + var p85 = charParser{id: 85, chars: []rune{111}} + var p72 = charParser{id: 72, chars: []rune{111}} + var p78 = charParser{id: 78, chars: []rune{116}} + p50.items = []parser{&p152, &p85, &p72, &p78} + p20.options = []parser{&p170, &p23, &p178, &p14, &p50} + p4.items = []parser{&p66, &p20} + p91.items = []parser{&p10, &p4} + var p180 = sequenceParser{id: 180, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p145 = charParser{id: 145, chars: []rune{61}} + p180.items = []parser{&p145} + var p116 = choiceParser{id: 116, commit: 66, name: "expression"} + var p174 = choiceParser{id: 174, commit: 66, name: "terminal", generalizations: []int{116, 63, 77}} + var p130 = sequenceParser{id: 130, commit: 72, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{174, 116, 63, 77}} + var p166 = charParser{id: 166, chars: []rune{46}} + p130.items = []parser{&p166} + var p129 = sequenceParser{id: 129, 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{174, 116, 63, 77}} + var p114 = sequenceParser{id: 114, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p82 = charParser{id: 82, chars: []rune{91}} + p114.items = []parser{&p82} + var p18 = sequenceParser{id: 18, commit: 72, name: "class-not", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p88 = charParser{id: 88, chars: []rune{94}} + p18.items = []parser{&p88} + var p182 = choiceParser{id: 182, commit: 10} + var p55 = choiceParser{id: 55, commit: 72, name: "class-char", generalizations: []int{182}} + var p36 = sequenceParser{id: 36, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{55, 182}} + var p181 = charParser{id: 181, not: true, chars: []rune{92, 91, 93, 94, 45}} + p36.items = []parser{&p181} + var p6 = sequenceParser{id: 6, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{55, 182}} + var p74 = sequenceParser{id: 74, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p37 = charParser{id: 37, chars: []rune{92}} + p74.items = []parser{&p37} + var p94 = sequenceParser{id: 94, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p167 = charParser{id: 167, not: true} + p94.items = []parser{&p167} + p6.items = []parser{&p74, &p94} + p55.options = []parser{&p36, &p6} + var p12 = sequenceParser{id: 12, commit: 72, name: "char-range", ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{182}} + var p75 = sequenceParser{id: 75, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p68 = charParser{id: 68, chars: []rune{45}} + p75.items = []parser{&p68} + p12.items = []parser{&p55, &p75, &p55} + p182.options = []parser{&p55, &p12} + var p128 = sequenceParser{id: 128, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p160 = charParser{id: 160, chars: []rune{93}} + p128.items = []parser{&p160} + p129.items = []parser{&p114, &p18, &p182, &p128} + var p156 = sequenceParser{id: 156, commit: 72, name: "char-sequence", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{174, 116, 63, 77}} + var p164 = sequenceParser{id: 164, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p163 = charParser{id: 163, chars: []rune{34}} + p164.items = []parser{&p163} + var p162 = choiceParser{id: 162, commit: 72, name: "sequence-char"} + var p131 = sequenceParser{id: 131, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{162}} + var p159 = charParser{id: 159, not: true, chars: []rune{92, 34}} + p131.items = []parser{&p159} + var p26 = sequenceParser{id: 26, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{162}} + var p7 = sequenceParser{id: 7, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p33 = charParser{id: 33, chars: []rune{92}} + p7.items = []parser{&p33} var p161 = sequenceParser{id: 161, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p55 = charParser{id: 55, chars: []rune{92}} - p161.items = []parser{&p55} - var p34 = sequenceParser{id: 34, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p133 = charParser{id: 133, not: true} - p34.items = []parser{&p133} - p1.items = []parser{&p161, &p34} - p48.options = []parser{&p156, &p1} - var p86 = sequenceParser{id: 86, commit: 72, name: "char-range", ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{116}} - var p140 = sequenceParser{id: 140, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p39 = charParser{id: 39, chars: []rune{45}} - p140.items = []parser{&p39} - p86.items = []parser{&p48, &p140, &p48} - p116.options = []parser{&p48, &p86} - var p28 = sequenceParser{id: 28, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p169 = charParser{id: 169, chars: []rune{93}} - p28.items = []parser{&p169} - p51.items = []parser{&p153, &p71, &p116, &p28} - var p36 = sequenceParser{id: 36, commit: 72, name: "char-sequence", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{104, 64, 72, 155}} - var p35 = sequenceParser{id: 35, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p80 = charParser{id: 80, chars: []rune{34}} - p35.items = []parser{&p80} - var p141 = choiceParser{id: 141, commit: 72, name: "sequence-char"} - var p170 = sequenceParser{id: 170, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{141}} - var p20 = charParser{id: 20, not: true, chars: []rune{92, 34}} - p170.items = []parser{&p20} - var p174 = sequenceParser{id: 174, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{141}} - var p29 = sequenceParser{id: 29, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p79 = charParser{id: 79, chars: []rune{92}} - p29.items = []parser{&p79} - var p134 = sequenceParser{id: 134, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p56 = charParser{id: 56, not: true} - p134.items = []parser{&p56} - p174.items = []parser{&p29, &p134} - p141.options = []parser{&p170, &p174} - var p157 = sequenceParser{id: 157, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p2 = charParser{id: 2, chars: []rune{34}} - p157.items = []parser{&p2} - p36.items = []parser{&p35, &p141, &p157} - p104.options = []parser{&p103, &p51, &p36} - var p58 = sequenceParser{id: 58, commit: 66, name: "group", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{64, 72, 155}} - var p49 = sequenceParser{id: 49, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p105 = charParser{id: 105, chars: []rune{40}} - p49.items = []parser{&p105} + var p1 = charParser{id: 1, not: true} + p161.items = []parser{&p1} + p26.items = []parser{&p7, &p161} + p162.options = []parser{&p131, &p26} var p89 = sequenceParser{id: 89, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p3 = charParser{id: 3, chars: []rune{41}} - p89.items = []parser{&p3} - p58.items = []parser{&p49, &p186, &p64, &p186, &p89} - var p23 = sequenceParser{id: 23, commit: 64, name: "sequence", ranges: [][]int{{1, 1}, {0, -1}}, generalizations: []int{64, 155}} - var p135 = sequenceParser{id: 135, commit: 72, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}} - var p72 = choiceParser{id: 72, commit: 10} - p72.options = []parser{&p104, &p88, &p58} - var p60 = choiceParser{id: 60, commit: 66, name: "quantity"} - var p117 = sequenceParser{id: 117, commit: 64, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{60}} - var p162 = sequenceParser{id: 162, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p81 = charParser{id: 81, chars: []rune{123}} - p162.items = []parser{&p81} - var p175 = sequenceParser{id: 175, commit: 64, name: "count", ranges: [][]int{{1, 1}}} - var p52 = sequenceParser{id: 52, commit: 74, name: "number", ranges: [][]int{{1, -1}, {1, -1}}} - var p119 = sequenceParser{id: 119, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p126 = charParser{id: 126, ranges: [][]rune{{48, 57}}} - p119.items = []parser{&p126} - p52.items = []parser{&p119} - p175.items = []parser{&p52} - var p176 = sequenceParser{id: 176, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p142 = charParser{id: 142, chars: []rune{125}} - p176.items = []parser{&p142} - p117.items = []parser{&p162, &p186, &p175, &p186, &p176} - var p154 = sequenceParser{id: 154, 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{60}} - var p53 = sequenceParser{id: 53, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p127 = charParser{id: 127, chars: []rune{123}} - p53.items = []parser{&p127} - var p183 = sequenceParser{id: 183, commit: 64, name: "range-from", ranges: [][]int{{1, 1}}} - p183.items = []parser{&p52} - var p21 = sequenceParser{id: 21, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p25 = charParser{id: 25, chars: []rune{44}} - p21.items = []parser{&p25} - var p59 = sequenceParser{id: 59, commit: 64, name: "range-to", ranges: [][]int{{1, 1}}} - p59.items = []parser{&p52} - var p145 = sequenceParser{id: 145, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p40 = charParser{id: 40, chars: []rune{125}} - p145.items = []parser{&p40} - p154.items = []parser{&p53, &p186, &p183, &p186, &p21, &p186, &p59, &p186, &p145} - var p66 = sequenceParser{id: 66, commit: 72, name: "one-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{60}} - var p177 = charParser{id: 177, chars: []rune{43}} - p66.items = []parser{&p177} - var p37 = sequenceParser{id: 37, commit: 72, name: "zero-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{60}} - var p96 = charParser{id: 96, chars: []rune{42}} - p37.items = []parser{&p96} - var p98 = sequenceParser{id: 98, commit: 72, name: "zero-or-one", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{60}} - var p90 = charParser{id: 90, chars: []rune{63}} - p98.items = []parser{&p90} - p60.options = []parser{&p117, &p154, &p66, &p37, &p98} - p135.items = []parser{&p72, &p60} - var p22 = sequenceParser{id: 22, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p22.items = []parser{&p186, &p135} - p23.items = []parser{&p135, &p22} - var p137 = sequenceParser{id: 137, commit: 64, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{64}} - var p155 = choiceParser{id: 155, commit: 66, name: "option"} - p155.options = []parser{&p104, &p88, &p58, &p23} - var p120 = sequenceParser{id: 120, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}} - var p15 = sequenceParser{id: 15, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p178 = charParser{id: 178, chars: []rune{124}} - p15.items = []parser{&p178} - p120.items = []parser{&p15, &p186, &p155} - var p136 = sequenceParser{id: 136, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p136.items = []parser{&p186, &p120} - p137.items = []parser{&p155, &p186, &p120, &p136} - p64.options = []parser{&p104, &p88, &p58, &p23, &p137} - p42.items = []parser{&p87, &p186, &p5, &p186, &p64} - var p44 = sequenceParser{id: 44, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} - var p109 = sequenceParser{id: 109, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {0, -1}, {1, 1}}} - var p91 = sequenceParser{id: 91, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p6 = charParser{id: 6, chars: []rune{59}} - p91.items = []parser{&p6} - var p108 = sequenceParser{id: 108, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p108.items = []parser{&p186, &p91} - p109.items = []parser{&p91, &p108, &p186, &p42} + var p99 = charParser{id: 99, chars: []rune{34}} + p89.items = []parser{&p99} + p156.items = []parser{&p164, &p162, &p89} + p174.options = []parser{&p130, &p129, &p156} + var p90 = sequenceParser{id: 90, commit: 66, name: "group", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{116, 63, 77}} + var p183 = sequenceParser{id: 183, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p2 = charParser{id: 2, chars: []rune{40}} + p183.items = []parser{&p2} + var p175 = sequenceParser{id: 175, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p70 = charParser{id: 70, chars: []rune{41}} + p175.items = []parser{&p70} + p90.items = []parser{&p183, &p186, &p116, &p186, &p175} + var p44 = sequenceParser{id: 44, commit: 64, name: "sequence", ranges: [][]int{{1, 1}, {0, -1}}, generalizations: []int{116, 77}} + var p39 = sequenceParser{id: 39, commit: 72, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}} + var p63 = choiceParser{id: 63, commit: 10} + p63.options = []parser{&p174, &p10, &p90} + var p76 = choiceParser{id: 76, commit: 66, name: "quantity"} + var p143 = sequenceParser{id: 143, commit: 64, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{76}} + var p13 = sequenceParser{id: 13, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p83 = charParser{id: 83, chars: []rune{123}} + p13.items = []parser{&p83} + var p106 = sequenceParser{id: 106, commit: 64, name: "count", ranges: [][]int{{1, 1}}} + var p120 = sequenceParser{id: 120, commit: 74, name: "number", ranges: [][]int{{1, -1}, {1, -1}}} + var p150 = sequenceParser{id: 150, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p38 = charParser{id: 38, ranges: [][]rune{{48, 57}}} + p150.items = []parser{&p38} + p120.items = []parser{&p150} + p106.items = []parser{&p120} + var p84 = sequenceParser{id: 84, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p71 = charParser{id: 71, chars: []rune{125}} + p84.items = []parser{&p71} + p143.items = []parser{&p13, &p186, &p106, &p186, &p84} + var p132 = sequenceParser{id: 132, 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{76}} + var p81 = sequenceParser{id: 81, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p176 = charParser{id: 176, chars: []rune{123}} + p81.items = []parser{&p176} + var p148 = sequenceParser{id: 148, commit: 64, name: "range-from", ranges: [][]int{{1, 1}}} + p148.items = []parser{&p120} + var p46 = sequenceParser{id: 46, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p168 = charParser{id: 168, chars: []rune{44}} + p46.items = []parser{&p168} + var p19 = sequenceParser{id: 19, commit: 64, name: "range-to", ranges: [][]int{{1, 1}}} + p19.items = []parser{&p120} + var p27 = sequenceParser{id: 27, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p123 = charParser{id: 123, chars: []rune{125}} + p27.items = []parser{&p123} + p132.items = []parser{&p81, &p186, &p148, &p186, &p46, &p186, &p19, &p186, &p27} + var p47 = sequenceParser{id: 47, commit: 72, name: "one-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{76}} + var p107 = charParser{id: 107, chars: []rune{43}} + p47.items = []parser{&p107} + var p157 = sequenceParser{id: 157, commit: 72, name: "zero-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{76}} + var p151 = charParser{id: 151, chars: []rune{42}} + p157.items = []parser{&p151} + var p3 = sequenceParser{id: 3, commit: 72, name: "zero-or-one", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{76}} + var p108 = charParser{id: 108, chars: []rune{63}} + p3.items = []parser{&p108} + p76.options = []parser{&p143, &p132, &p47, &p157, &p3} + p39.items = []parser{&p63, &p76} var p43 = sequenceParser{id: 43, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p43.items = []parser{&p186, &p109} - p44.items = []parser{&p186, &p109, &p43} - p45.items = []parser{&p42, &p44} - var p10 = sequenceParser{id: 10, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} - var p147 = sequenceParser{id: 147, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var p164 = charParser{id: 164, chars: []rune{59}} - p147.items = []parser{&p164} - var p9 = sequenceParser{id: 9, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - p9.items = []parser{&p186, &p147} - p10.items = []parser{&p186, &p147, &p9} - p187.items = []parser{&p8, &p186, &p45, &p10} + p43.items = []parser{&p186, &p39} + p44.items = []parser{&p39, &p43} + var p110 = sequenceParser{id: 110, commit: 64, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{116}} + var p77 = choiceParser{id: 77, commit: 66, name: "option"} + p77.options = []parser{&p174, &p10, &p90, &p44} + var p115 = sequenceParser{id: 115, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}} + var p177 = sequenceParser{id: 177, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p11 = charParser{id: 11, chars: []rune{124}} + p177.items = []parser{&p11} + p115.items = []parser{&p177, &p186, &p77} + var p109 = sequenceParser{id: 109, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p109.items = []parser{&p186, &p115} + p110.items = []parser{&p77, &p186, &p115, &p109} + p116.options = []parser{&p174, &p10, &p90, &p44, &p110} + p172.items = []parser{&p91, &p186, &p180, &p186, &p116} + var p58 = sequenceParser{id: 58, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var p139 = sequenceParser{id: 139, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {0, -1}, {1, 1}}} + var p21 = sequenceParser{id: 21, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p16 = charParser{id: 16, chars: []rune{59}} + p21.items = []parser{&p16} + var p138 = sequenceParser{id: 138, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p138.items = []parser{&p186, &p21} + p139.items = []parser{&p21, &p138, &p186, &p172} + var p57 = sequenceParser{id: 57, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p57.items = []parser{&p186, &p139} + p58.items = []parser{&p186, &p139, &p57} + p59.items = []parser{&p172, &p58} + var p31 = sequenceParser{id: 31, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var p54 = sequenceParser{id: 54, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var p67 = charParser{id: 67, chars: []rune{59}} + p54.items = []parser{&p67} + var p30 = sequenceParser{id: 30, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + p30.items = []parser{&p186, &p54} + p31.items = []parser{&p186, &p54, &p30} + p187.items = []parser{&p29, &p186, &p59, &p31} 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 b124 = choiceBuilder{id: 124, commit: 66} - var b38 = sequenceBuilder{id: 38, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b160 = charBuilder{} - b38.items = []builder{&b160} - var b181 = sequenceBuilder{id: 181, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b32 = charBuilder{} - b181.items = []builder{&b32} - var b75 = sequenceBuilder{id: 75, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b92 = charBuilder{} - b75.items = []builder{&b92} - var b83 = sequenceBuilder{id: 83, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b61 = charBuilder{} - b83.items = []builder{&b61} - var b131 = sequenceBuilder{id: 131, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b139 = charBuilder{} - b131.items = []builder{&b139} - var b182 = sequenceBuilder{id: 182, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b12 = charBuilder{} - b182.items = []builder{&b12} - var b165 = sequenceBuilder{id: 165, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b118 = charBuilder{} - b165.items = []builder{&b118} - b124.options = []builder{&b38, &b181, &b75, &b83, &b131, &b182, &b165} - var b78 = sequenceBuilder{id: 78, commit: 72, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var b62 = choiceBuilder{id: 62, commit: 74} - var b33 = sequenceBuilder{id: 33, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var b113 = sequenceBuilder{id: 113, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b112 = charBuilder{} - var b70 = charBuilder{} - b113.items = []builder{&b112, &b70} - var b47 = sequenceBuilder{id: 47, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b76 = charBuilder{} - b47.items = []builder{&b76} - b33.items = []builder{&b113, &b47} - var b101 = sequenceBuilder{id: 101, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}} - var b151 = sequenceBuilder{id: 151, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b84 = charBuilder{} - var b68 = charBuilder{} - b151.items = []builder{&b84, &b68} - var b171 = choiceBuilder{id: 171, commit: 10} - var b100 = sequenceBuilder{id: 100, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b111 = sequenceBuilder{id: 111, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b93 = charBuilder{} - b111.items = []builder{&b93} - var b143 = sequenceBuilder{id: 143, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b99 = charBuilder{} - b143.items = []builder{&b99} - b100.items = []builder{&b111, &b143} - var b148 = sequenceBuilder{id: 148, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b166 = charBuilder{} - b148.items = []builder{&b166} - b171.options = []builder{&b100, &b148} - var b46 = sequenceBuilder{id: 46, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b19 = charBuilder{} - var b69 = charBuilder{} - b46.items = []builder{&b19, &b69} - b101.items = []builder{&b151, &b171, &b46} - b62.options = []builder{&b33, &b101} - var b13 = sequenceBuilder{id: 13, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} - var b125 = choiceBuilder{id: 125, commit: 74} - var b26 = sequenceBuilder{id: 26, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b77 = charBuilder{} - b26.items = []builder{&b77} - var b172 = sequenceBuilder{id: 172, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b94 = charBuilder{} - b172.items = []builder{&b94} - var b152 = sequenceBuilder{id: 152, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b5 = choiceBuilder{id: 5, commit: 66} + var b112 = sequenceBuilder{id: 112, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b125 = charBuilder{} + b112.items = []builder{&b125} + var b173 = sequenceBuilder{id: 173, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} var b102 = charBuilder{} - b152.items = []builder{&b102} - var b85 = sequenceBuilder{id: 85, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b63 = charBuilder{} - b85.items = []builder{&b63} - var b167 = sequenceBuilder{id: 167, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b149 = charBuilder{} - b167.items = []builder{&b149} - var b144 = sequenceBuilder{id: 144, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b168 = charBuilder{} - b144.items = []builder{&b168} - b125.options = []builder{&b26, &b172, &b152, &b85, &b167, &b144} - var b27 = sequenceBuilder{id: 27, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b95 = charBuilder{} - b27.items = []builder{&b95} - b13.items = []builder{&b125, &b27, &b125, &b62} - b78.items = []builder{&b62, &b13} - b185.options = []builder{&b124, &b78} + b173.items = []builder{&b102} + var b51 = sequenceBuilder{id: 51, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b153 = charBuilder{} + b51.items = []builder{&b153} + var b126 = sequenceBuilder{id: 126, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b141 = charBuilder{} + b126.items = []builder{&b141} + var b40 = sequenceBuilder{id: 40, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b113 = charBuilder{} + b40.items = []builder{&b113} + var b142 = sequenceBuilder{id: 142, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b60 = charBuilder{} + b142.items = []builder{&b60} + var b41 = sequenceBuilder{id: 41, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b103 = charBuilder{} + b41.items = []builder{&b103} + b5.options = []builder{&b112, &b173, &b51, &b126, &b40, &b142, &b41} + var b73 = sequenceBuilder{id: 73, commit: 72, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var b97 = choiceBuilder{id: 97, commit: 74} + var b104 = sequenceBuilder{id: 104, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var b149 = sequenceBuilder{id: 149, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b42 = charBuilder{} + var b17 = charBuilder{} + b149.items = []builder{&b42, &b17} + var b146 = sequenceBuilder{id: 146, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b32 = charBuilder{} + b146.items = []builder{&b32} + b104.items = []builder{&b149, &b146} + var b62 = sequenceBuilder{id: 62, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}} + var b92 = sequenceBuilder{id: 92, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b171 = charBuilder{} + var b52 = charBuilder{} + b92.items = []builder{&b171, &b52} + var b8 = choiceBuilder{id: 8, commit: 10} + var b154 = sequenceBuilder{id: 154, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b118 = sequenceBuilder{id: 118, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b127 = charBuilder{} + b118.items = []builder{&b127} + var b61 = sequenceBuilder{id: 61, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b121 = charBuilder{} + b61.items = []builder{&b121} + b154.items = []builder{&b118, &b61} + var b22 = sequenceBuilder{id: 22, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b155 = charBuilder{} + b22.items = []builder{&b155} + b8.options = []builder{&b154, &b22} + var b53 = sequenceBuilder{id: 53, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b79 = charBuilder{} + var b158 = charBuilder{} + b53.items = []builder{&b79, &b158} + b62.items = []builder{&b92, &b8, &b53} + b97.options = []builder{&b104, &b62} + var b80 = sequenceBuilder{id: 80, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}} + var b135 = choiceBuilder{id: 135, commit: 74} + var b86 = sequenceBuilder{id: 86, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b105 = charBuilder{} + b86.items = []builder{&b105} + var b25 = sequenceBuilder{id: 25, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b35 = charBuilder{} + b25.items = []builder{&b35} + var b165 = sequenceBuilder{id: 165, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b93 = charBuilder{} + b165.items = []builder{&b93} + var b9 = sequenceBuilder{id: 9, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b98 = charBuilder{} + b9.items = []builder{&b98} + var b134 = sequenceBuilder{id: 134, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b147 = charBuilder{} + b134.items = []builder{&b147} + var b119 = sequenceBuilder{id: 119, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b87 = charBuilder{} + b119.items = []builder{&b87} + b135.options = []builder{&b86, &b25, &b165, &b9, &b134, &b119} + var b136 = sequenceBuilder{id: 136, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b122 = charBuilder{} + b136.items = []builder{&b122} + b80.items = []builder{&b135, &b136, &b135, &b97} + b73.items = []builder{&b97, &b80} + b185.options = []builder{&b5, &b73} b186.options = []builder{&b185} var b187 = sequenceBuilder{id: 187, commit: 66, ranges: [][]int{{0, 1}, {0, -1}, {0, 1}, {0, 1}}} - var b8 = sequenceBuilder{id: 8, commit: 2, ranges: [][]int{{1, 1}, {0, -1}}} - var b11 = sequenceBuilder{id: 11, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b31 = charBuilder{} - b11.items = []builder{&b31} - var b7 = sequenceBuilder{id: 7, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b7.items = []builder{&b186, &b11} - b8.items = []builder{&b11, &b7} - var b45 = sequenceBuilder{id: 45, commit: 66, ranges: [][]int{{1, 1}, {0, 1}}} - var b42 = sequenceBuilder{id: 42, commit: 64, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} - var b87 = sequenceBuilder{id: 87, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var b88 = sequenceBuilder{id: 88, commit: 72, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}} - var b57 = sequenceBuilder{id: 57, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b14 = charBuilder{} - b57.items = []builder{&b14} - b88.items = []builder{&b57} - var b158 = sequenceBuilder{id: 158, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b82 = sequenceBuilder{id: 82, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b146 = charBuilder{} - b82.items = []builder{&b146} - var b4 = choiceBuilder{id: 4, commit: 66} - var b97 = sequenceBuilder{id: 97, 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 b128 = charBuilder{} - var b163 = charBuilder{} - var b150 = charBuilder{} - var b106 = charBuilder{} - var b138 = charBuilder{} - b97.items = []builder{&b128, &b163, &b150, &b106, &b138} - var b54 = sequenceBuilder{id: 54, commit: 72, name: "ws", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b67 = charBuilder{} - var b41 = charBuilder{} - b54.items = []builder{&b67, &b41} - var b129 = sequenceBuilder{id: 129, 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 b30 = charBuilder{} - var b24 = charBuilder{} - var b65 = charBuilder{} - var b16 = charBuilder{} - b129.items = []builder{&b30, &b24, &b65, &b16} - var b110 = sequenceBuilder{id: 110, 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 b179 = charBuilder{} - var b121 = charBuilder{} - var b73 = charBuilder{} - var b130 = charBuilder{} - var b17 = charBuilder{} - var b180 = charBuilder{} - var b74 = charBuilder{} - var b184 = charBuilder{} - b110.items = []builder{&b179, &b121, &b73, &b130, &b17, &b180, &b74, &b184} - var b18 = sequenceBuilder{id: 18, 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 b107 = charBuilder{} - var b50 = charBuilder{} - var b122 = charBuilder{} - var b123 = charBuilder{} - b18.items = []builder{&b107, &b50, &b122, &b123} - b4.options = []builder{&b97, &b54, &b129, &b110, &b18} - b158.items = []builder{&b82, &b4} - b87.items = []builder{&b88, &b158} - var b5 = sequenceBuilder{id: 5, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b159 = charBuilder{} - b5.items = []builder{&b159} - var b64 = choiceBuilder{id: 64, commit: 66} - var b104 = choiceBuilder{id: 104, commit: 66} - var b103 = sequenceBuilder{id: 103, commit: 72, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b114 = charBuilder{} - b103.items = []builder{&b114} - var b51 = sequenceBuilder{id: 51, commit: 72, name: "char-class", ranges: [][]int{{1, 1}, {0, 1}, {0, -1}, {1, 1}, {1, 1}, {0, 1}, {0, -1}, {1, 1}}} - var b153 = sequenceBuilder{id: 153, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b115 = charBuilder{} - b153.items = []builder{&b115} - var b71 = sequenceBuilder{id: 71, commit: 72, name: "class-not", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b132 = charBuilder{} - b71.items = []builder{&b132} - var b116 = choiceBuilder{id: 116, commit: 10} - var b48 = choiceBuilder{id: 48, commit: 72, name: "class-char"} - var b156 = sequenceBuilder{id: 156, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b173 = charBuilder{} - b156.items = []builder{&b173} - var b1 = sequenceBuilder{id: 1, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b161 = sequenceBuilder{id: 161, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b55 = charBuilder{} - b161.items = []builder{&b55} - var b34 = sequenceBuilder{id: 34, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b29 = sequenceBuilder{id: 29, commit: 2, ranges: [][]int{{1, 1}, {0, -1}}} + var b184 = sequenceBuilder{id: 184, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b140 = charBuilder{} + b184.items = []builder{&b140} + var b28 = sequenceBuilder{id: 28, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b28.items = []builder{&b186, &b184} + b29.items = []builder{&b184, &b28} + var b59 = sequenceBuilder{id: 59, commit: 66, ranges: [][]int{{1, 1}, {0, 1}}} + var b172 = sequenceBuilder{id: 172, commit: 64, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} + var b91 = sequenceBuilder{id: 91, commit: 74, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var b10 = sequenceBuilder{id: 10, commit: 72, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}} + var b69 = sequenceBuilder{id: 69, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b100 = charBuilder{} + b69.items = []builder{&b100} + b10.items = []builder{&b69} + var b4 = sequenceBuilder{id: 4, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b66 = sequenceBuilder{id: 66, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} var b133 = charBuilder{} - b34.items = []builder{&b133} - b1.items = []builder{&b161, &b34} - b48.options = []builder{&b156, &b1} - var b86 = sequenceBuilder{id: 86, commit: 72, name: "char-range", ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b140 = sequenceBuilder{id: 140, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b39 = charBuilder{} - b140.items = []builder{&b39} - b86.items = []builder{&b48, &b140, &b48} - b116.options = []builder{&b48, &b86} - var b28 = sequenceBuilder{id: 28, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + b66.items = []builder{&b133} + var b20 = choiceBuilder{id: 20, commit: 66} + var b170 = sequenceBuilder{id: 170, 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 b169 = charBuilder{} - b28.items = []builder{&b169} - b51.items = []builder{&b153, &b71, &b116, &b28} - var b36 = sequenceBuilder{id: 36, commit: 72, name: "char-sequence", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}} - var b35 = sequenceBuilder{id: 35, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b80 = charBuilder{} - b35.items = []builder{&b80} - var b141 = choiceBuilder{id: 141, commit: 72, name: "sequence-char"} - var b170 = sequenceBuilder{id: 170, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b20 = charBuilder{} - b170.items = []builder{&b20} - var b174 = sequenceBuilder{id: 174, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} - var b29 = sequenceBuilder{id: 29, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b79 = charBuilder{} - b29.items = []builder{&b79} - var b134 = sequenceBuilder{id: 134, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b64 = charBuilder{} + var b45 = charBuilder{} + var b111 = charBuilder{} + var b95 = charBuilder{} + b170.items = []builder{&b169, &b64, &b45, &b111, &b95} + var b23 = sequenceBuilder{id: 23, commit: 72, name: "ws", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b101 = charBuilder{} + var b15 = charBuilder{} + b23.items = []builder{&b101, &b15} + var b178 = sequenceBuilder{id: 178, 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 b48 = charBuilder{} + var b137 = charBuilder{} + var b144 = charBuilder{} + var b65 = charBuilder{} + b178.items = []builder{&b48, &b137, &b144, &b65} + var b14 = sequenceBuilder{id: 14, 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 b117 = charBuilder{} + var b124 = charBuilder{} + var b49 = charBuilder{} + var b179 = charBuilder{} var b56 = charBuilder{} - b134.items = []builder{&b56} - b174.items = []builder{&b29, &b134} - b141.options = []builder{&b170, &b174} - var b157 = sequenceBuilder{id: 157, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b2 = charBuilder{} - b157.items = []builder{&b2} - b36.items = []builder{&b35, &b141, &b157} - b104.options = []builder{&b103, &b51, &b36} - var b58 = sequenceBuilder{id: 58, commit: 66, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} - var b49 = sequenceBuilder{id: 49, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b105 = charBuilder{} - b49.items = []builder{&b105} - var b89 = sequenceBuilder{id: 89, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b3 = charBuilder{} - b89.items = []builder{&b3} - b58.items = []builder{&b49, &b186, &b64, &b186, &b89} - var b23 = sequenceBuilder{id: 23, commit: 64, name: "sequence", ranges: [][]int{{1, 1}, {0, -1}}} - var b135 = sequenceBuilder{id: 135, commit: 72, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}} - var b72 = choiceBuilder{id: 72, commit: 10} - b72.options = []builder{&b104, &b88, &b58} - var b60 = choiceBuilder{id: 60, commit: 66} - var b117 = sequenceBuilder{id: 117, commit: 64, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} - var b162 = sequenceBuilder{id: 162, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b81 = charBuilder{} - b162.items = []builder{&b81} - var b175 = sequenceBuilder{id: 175, commit: 64, name: "count", ranges: [][]int{{1, 1}}} - var b52 = sequenceBuilder{id: 52, commit: 74, ranges: [][]int{{1, -1}, {1, -1}}} - var b119 = sequenceBuilder{id: 119, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b126 = charBuilder{} - b119.items = []builder{&b126} - b52.items = []builder{&b119} - b175.items = []builder{&b52} - var b176 = sequenceBuilder{id: 176, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b142 = charBuilder{} - b176.items = []builder{&b142} - b117.items = []builder{&b162, &b186, &b175, &b186, &b176} - var b154 = sequenceBuilder{id: 154, 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 b53 = sequenceBuilder{id: 53, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b127 = charBuilder{} - b53.items = []builder{&b127} - var b183 = sequenceBuilder{id: 183, commit: 64, name: "range-from", ranges: [][]int{{1, 1}}} - b183.items = []builder{&b52} - var b21 = sequenceBuilder{id: 21, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b25 = charBuilder{} - b21.items = []builder{&b25} - var b59 = sequenceBuilder{id: 59, commit: 64, name: "range-to", ranges: [][]int{{1, 1}}} - b59.items = []builder{&b52} - var b145 = sequenceBuilder{id: 145, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b40 = charBuilder{} - b145.items = []builder{&b40} - b154.items = []builder{&b53, &b186, &b183, &b186, &b21, &b186, &b59, &b186, &b145} - var b66 = sequenceBuilder{id: 66, commit: 72, name: "one-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b177 = charBuilder{} - b66.items = []builder{&b177} - var b37 = sequenceBuilder{id: 37, commit: 72, name: "zero-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b34 = charBuilder{} + var b24 = charBuilder{} var b96 = charBuilder{} - b37.items = []builder{&b96} - var b98 = sequenceBuilder{id: 98, commit: 72, name: "zero-or-one", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b90 = charBuilder{} - b98.items = []builder{&b90} - b60.options = []builder{&b117, &b154, &b66, &b37, &b98} - b135.items = []builder{&b72, &b60} - var b22 = sequenceBuilder{id: 22, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b22.items = []builder{&b186, &b135} - b23.items = []builder{&b135, &b22} - var b137 = sequenceBuilder{id: 137, commit: 64, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} - var b155 = choiceBuilder{id: 155, commit: 66} - b155.options = []builder{&b104, &b88, &b58, &b23} - var b120 = sequenceBuilder{id: 120, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}} - var b15 = sequenceBuilder{id: 15, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b178 = charBuilder{} - b15.items = []builder{&b178} - b120.items = []builder{&b15, &b186, &b155} - var b136 = sequenceBuilder{id: 136, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b136.items = []builder{&b186, &b120} - b137.items = []builder{&b155, &b186, &b120, &b136} - b64.options = []builder{&b104, &b88, &b58, &b23, &b137} - b42.items = []builder{&b87, &b186, &b5, &b186, &b64} - var b44 = sequenceBuilder{id: 44, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} - var b109 = sequenceBuilder{id: 109, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {0, -1}, {1, 1}}} - var b91 = sequenceBuilder{id: 91, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b6 = charBuilder{} - b91.items = []builder{&b6} - var b108 = sequenceBuilder{id: 108, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b108.items = []builder{&b186, &b91} - b109.items = []builder{&b91, &b108, &b186, &b42} + b14.items = []builder{&b117, &b124, &b49, &b179, &b56, &b34, &b24, &b96} + var b50 = sequenceBuilder{id: 50, 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 b152 = charBuilder{} + var b85 = charBuilder{} + var b72 = charBuilder{} + var b78 = charBuilder{} + b50.items = []builder{&b152, &b85, &b72, &b78} + b20.options = []builder{&b170, &b23, &b178, &b14, &b50} + b4.items = []builder{&b66, &b20} + b91.items = []builder{&b10, &b4} + var b180 = sequenceBuilder{id: 180, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b145 = charBuilder{} + b180.items = []builder{&b145} + var b116 = choiceBuilder{id: 116, commit: 66} + var b174 = choiceBuilder{id: 174, commit: 66} + var b130 = sequenceBuilder{id: 130, commit: 72, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b166 = charBuilder{} + b130.items = []builder{&b166} + var b129 = sequenceBuilder{id: 129, commit: 72, name: "char-class", ranges: [][]int{{1, 1}, {0, 1}, {0, -1}, {1, 1}, {1, 1}, {0, 1}, {0, -1}, {1, 1}}} + var b114 = sequenceBuilder{id: 114, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b82 = charBuilder{} + b114.items = []builder{&b82} + var b18 = sequenceBuilder{id: 18, commit: 72, name: "class-not", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b88 = charBuilder{} + b18.items = []builder{&b88} + var b182 = choiceBuilder{id: 182, commit: 10} + var b55 = choiceBuilder{id: 55, commit: 72, name: "class-char"} + var b36 = sequenceBuilder{id: 36, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b181 = charBuilder{} + b36.items = []builder{&b181} + var b6 = sequenceBuilder{id: 6, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b74 = sequenceBuilder{id: 74, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b37 = charBuilder{} + b74.items = []builder{&b37} + var b94 = sequenceBuilder{id: 94, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b167 = charBuilder{} + b94.items = []builder{&b167} + b6.items = []builder{&b74, &b94} + b55.options = []builder{&b36, &b6} + var b12 = sequenceBuilder{id: 12, commit: 72, name: "char-range", ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b75 = sequenceBuilder{id: 75, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b68 = charBuilder{} + b75.items = []builder{&b68} + b12.items = []builder{&b55, &b75, &b55} + b182.options = []builder{&b55, &b12} + var b128 = sequenceBuilder{id: 128, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b160 = charBuilder{} + b128.items = []builder{&b160} + b129.items = []builder{&b114, &b18, &b182, &b128} + var b156 = sequenceBuilder{id: 156, commit: 72, name: "char-sequence", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}} + var b164 = sequenceBuilder{id: 164, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b163 = charBuilder{} + b164.items = []builder{&b163} + var b162 = choiceBuilder{id: 162, commit: 72, name: "sequence-char"} + var b131 = sequenceBuilder{id: 131, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b159 = charBuilder{} + b131.items = []builder{&b159} + var b26 = sequenceBuilder{id: 26, commit: 10, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}} + var b7 = sequenceBuilder{id: 7, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b33 = charBuilder{} + b7.items = []builder{&b33} + var b161 = sequenceBuilder{id: 161, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b1 = charBuilder{} + b161.items = []builder{&b1} + b26.items = []builder{&b7, &b161} + b162.options = []builder{&b131, &b26} + var b89 = sequenceBuilder{id: 89, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b99 = charBuilder{} + b89.items = []builder{&b99} + b156.items = []builder{&b164, &b162, &b89} + b174.options = []builder{&b130, &b129, &b156} + var b90 = sequenceBuilder{id: 90, commit: 66, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} + var b183 = sequenceBuilder{id: 183, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b2 = charBuilder{} + b183.items = []builder{&b2} + var b175 = sequenceBuilder{id: 175, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b70 = charBuilder{} + b175.items = []builder{&b70} + b90.items = []builder{&b183, &b186, &b116, &b186, &b175} + var b44 = sequenceBuilder{id: 44, commit: 64, name: "sequence", ranges: [][]int{{1, 1}, {0, -1}}} + var b39 = sequenceBuilder{id: 39, commit: 72, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}} + var b63 = choiceBuilder{id: 63, commit: 10} + b63.options = []builder{&b174, &b10, &b90} + var b76 = choiceBuilder{id: 76, commit: 66} + var b143 = sequenceBuilder{id: 143, commit: 64, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}} + var b13 = sequenceBuilder{id: 13, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b83 = charBuilder{} + b13.items = []builder{&b83} + var b106 = sequenceBuilder{id: 106, commit: 64, name: "count", ranges: [][]int{{1, 1}}} + var b120 = sequenceBuilder{id: 120, commit: 74, ranges: [][]int{{1, -1}, {1, -1}}} + var b150 = sequenceBuilder{id: 150, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b38 = charBuilder{} + b150.items = []builder{&b38} + b120.items = []builder{&b150} + b106.items = []builder{&b120} + var b84 = sequenceBuilder{id: 84, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b71 = charBuilder{} + b84.items = []builder{&b71} + b143.items = []builder{&b13, &b186, &b106, &b186, &b84} + var b132 = sequenceBuilder{id: 132, 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 b81 = sequenceBuilder{id: 81, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b176 = charBuilder{} + b81.items = []builder{&b176} + var b148 = sequenceBuilder{id: 148, commit: 64, name: "range-from", ranges: [][]int{{1, 1}}} + b148.items = []builder{&b120} + var b46 = sequenceBuilder{id: 46, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b168 = charBuilder{} + b46.items = []builder{&b168} + var b19 = sequenceBuilder{id: 19, commit: 64, name: "range-to", ranges: [][]int{{1, 1}}} + b19.items = []builder{&b120} + var b27 = sequenceBuilder{id: 27, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b123 = charBuilder{} + b27.items = []builder{&b123} + b132.items = []builder{&b81, &b186, &b148, &b186, &b46, &b186, &b19, &b186, &b27} + var b47 = sequenceBuilder{id: 47, commit: 72, name: "one-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b107 = charBuilder{} + b47.items = []builder{&b107} + var b157 = sequenceBuilder{id: 157, commit: 72, name: "zero-or-more", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b151 = charBuilder{} + b157.items = []builder{&b151} + var b3 = sequenceBuilder{id: 3, commit: 72, name: "zero-or-one", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b108 = charBuilder{} + b3.items = []builder{&b108} + b76.options = []builder{&b143, &b132, &b47, &b157, &b3} + b39.items = []builder{&b63, &b76} var b43 = sequenceBuilder{id: 43, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b43.items = []builder{&b186, &b109} - b44.items = []builder{&b186, &b109, &b43} - b45.items = []builder{&b42, &b44} - var b10 = sequenceBuilder{id: 10, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} - var b147 = sequenceBuilder{id: 147, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} - var b164 = charBuilder{} - b147.items = []builder{&b164} - var b9 = sequenceBuilder{id: 9, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} - b9.items = []builder{&b186, &b147} - b10.items = []builder{&b186, &b147, &b9} - b187.items = []builder{&b8, &b186, &b45, &b10} + b43.items = []builder{&b186, &b39} + b44.items = []builder{&b39, &b43} + var b110 = sequenceBuilder{id: 110, commit: 64, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}} + var b77 = choiceBuilder{id: 77, commit: 66} + b77.options = []builder{&b174, &b10, &b90, &b44} + var b115 = sequenceBuilder{id: 115, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}} + var b177 = sequenceBuilder{id: 177, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b11 = charBuilder{} + b177.items = []builder{&b11} + b115.items = []builder{&b177, &b186, &b77} + var b109 = sequenceBuilder{id: 109, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b109.items = []builder{&b186, &b115} + b110.items = []builder{&b77, &b186, &b115, &b109} + b116.options = []builder{&b174, &b10, &b90, &b44, &b110} + b172.items = []builder{&b91, &b186, &b180, &b186, &b116} + var b58 = sequenceBuilder{id: 58, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var b139 = sequenceBuilder{id: 139, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {0, -1}, {1, 1}}} + var b21 = sequenceBuilder{id: 21, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b16 = charBuilder{} + b21.items = []builder{&b16} + var b138 = sequenceBuilder{id: 138, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b138.items = []builder{&b186, &b21} + b139.items = []builder{&b21, &b138, &b186, &b172} + var b57 = sequenceBuilder{id: 57, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b57.items = []builder{&b186, &b139} + b58.items = []builder{&b186, &b139, &b57} + b59.items = []builder{&b172, &b58} + var b31 = sequenceBuilder{id: 31, commit: 2, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}} + var b54 = sequenceBuilder{id: 54, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}} + var b67 = charBuilder{} + b54.items = []builder{&b67} + var b30 = sequenceBuilder{id: 30, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}} + b30.items = []builder{&b186, &b54} + b31.items = []builder{&b186, &b54, &b30} + b187.items = []builder{&b29, &b186, &b59, &b31} b188.items = []builder{&b186, &b187, &b186} - return parse(r, &p188, &b188) + return parseInput(r, &p188, &b188) } diff --git a/syntax.go b/syntax.go index 2a2f0fa..754d44d 100644 --- a/syntax.go +++ b/syntax.go @@ -28,6 +28,7 @@ type Syntax struct { type GeneratorOptions struct { PackageName string + Export bool } // applied in a non-type-checked way @@ -329,7 +330,12 @@ func (s *Syntax) Generate(o GeneratorOptions, w io.Writer) error { fprintln() fprintln() - fprint(`func Parse(r io.Reader) (*Node, error) {`) + if o.Export { + fprint(`func Parse(r io.Reader) (*Node, error) {`) + } else { + fprint(`func parse(r io.Reader) (*Node, error) {`) + } + fprintln() done := make(map[string]bool) @@ -344,7 +350,7 @@ func (s *Syntax) Generate(o GeneratorOptions, w io.Writer) error { fprintln() fprintln() - fprintf(`return parse(r, &p%d, &b%d)`, s.parser.nodeID(), s.builder.nodeID()) + fprintf(`return parseInput(r, &p%d, &b%d)`, s.parser.nodeID(), s.builder.nodeID()) fprintln() fprint(`}`) fprintln() @@ -357,5 +363,5 @@ func (s *Syntax) Parse(r io.Reader) (*Node, error) { return nil, err } - return parse(r, s.parser, s.builder) + return parseInput(r, s.parser, s.builder) } diff --git a/syntaxhead.go b/syntaxhead.go index c79def7..b89ffce 100644 --- a/syntaxhead.go +++ b/syntaxhead.go @@ -80,7 +80,7 @@ func (pe *ParseError) Error() string { ) } -func parse(r io.Reader, p parser, b builder) (*Node, error) { +func parseInput(r io.Reader, p parser, b builder) (*Node, error) { c := newContext(bufio.NewReader(r)) p.parse(c) if c.readErr != nil {