package toml import ( "fmt" "math" "sort" "strconv" ) const end_symbol rune = 4 /* The rule types inferred from the grammar are below. */ type pegRule uint8 const ( ruleUnknown pegRule = iota ruleTOML ruleExpression rulenewline rulews rulewsnl rulecomment rulekeyval rulekey rulebareKey rulequotedKey ruleval ruletable rulestdTable rulearrayTable ruleinlineTable ruleinlineTableKeyValues ruletableKey ruletableKeySep ruleinlineTableValSep ruleinteger ruleint rulefloat rulefrac ruleexp rulestring rulebasicString rulebasicChar ruleescaped rulebasicUnescaped ruleescape rulemlBasicString rulemlBasicBody ruleliteralString ruleliteralChar rulemlLiteralString rulemlLiteralBody rulemlLiteralChar rulehexdigit rulehexQuad ruleboolean ruledateFullYear ruledateMonth ruledateMDay ruletimeHour ruletimeMinute ruletimeSecond ruletimeSecfrac ruletimeNumoffset ruletimeOffset rulepartialTime rulefullDate rulefullTime ruledatetime ruledigit ruledigitDual ruledigitQuad rulearray rulearrayValues rulearraySep ruleAction0 rulePegText ruleAction1 ruleAction2 ruleAction3 ruleAction4 ruleAction5 ruleAction6 ruleAction7 ruleAction8 ruleAction9 ruleAction10 ruleAction11 ruleAction12 ruleAction13 ruleAction14 ruleAction15 ruleAction16 ruleAction17 ruleAction18 ruleAction19 ruleAction20 ruleAction21 ruleAction22 ruleAction23 rulePre_ rule_In_ rule_Suf ) var rul3s = [...]string{ "Unknown", "TOML", "Expression", "newline", "ws", "wsnl", "comment", "keyval", "key", "bareKey", "quotedKey", "val", "table", "stdTable", "arrayTable", "inlineTable", "inlineTableKeyValues", "tableKey", "tableKeySep", "inlineTableValSep", "integer", "int", "float", "frac", "exp", "string", "basicString", "basicChar", "escaped", "basicUnescaped", "escape", "mlBasicString", "mlBasicBody", "literalString", "literalChar", "mlLiteralString", "mlLiteralBody", "mlLiteralChar", "hexdigit", "hexQuad", "boolean", "dateFullYear", "dateMonth", "dateMDay", "timeHour", "timeMinute", "timeSecond", "timeSecfrac", "timeNumoffset", "timeOffset", "partialTime", "fullDate", "fullTime", "datetime", "digit", "digitDual", "digitQuad", "array", "arrayValues", "arraySep", "Action0", "PegText", "Action1", "Action2", "Action3", "Action4", "Action5", "Action6", "Action7", "Action8", "Action9", "Action10", "Action11", "Action12", "Action13", "Action14", "Action15", "Action16", "Action17", "Action18", "Action19", "Action20", "Action21", "Action22", "Action23", "Pre_", "_In_", "_Suf", } type tokenTree interface { Print() PrintSyntax() PrintSyntaxTree(buffer string) Add(rule pegRule, begin, end, next, depth int) Expand(index int) tokenTree Tokens() <-chan token32 AST() *node32 Error() []token32 trim(length int) } type node32 struct { token32 up, next *node32 } func (node *node32) print(depth int, buffer string) { for node != nil { for c := 0; c < depth; c++ { fmt.Printf(" ") } fmt.Printf("\x1B[34m%v\x1B[m %v\n", rul3s[node.pegRule], strconv.Quote(string(([]rune(buffer)[node.begin:node.end])))) if node.up != nil { node.up.print(depth+1, buffer) } node = node.next } } func (ast *node32) Print(buffer string) { ast.print(0, buffer) } type element struct { node *node32 down *element } /* ${@} bit structure for abstract syntax tree */ type token16 struct { pegRule begin, end, next int16 } func (t *token16) isZero() bool { return t.pegRule == ruleUnknown && t.begin == 0 && t.end == 0 && t.next == 0 } func (t *token16) isParentOf(u token16) bool { return t.begin <= u.begin && t.end >= u.end && t.next > u.next } func (t *token16) getToken32() token32 { return token32{pegRule: t.pegRule, begin: int32(t.begin), end: int32(t.end), next: int32(t.next)} } func (t *token16) String() string { return fmt.Sprintf("\x1B[34m%v\x1B[m %v %v %v", rul3s[t.pegRule], t.begin, t.end, t.next) } type tokens16 struct { tree []token16 ordered [][]token16 } func (t *tokens16) trim(length int) { t.tree = t.tree[0:length] } func (t *tokens16) Print() { for _, token := range t.tree { fmt.Println(token.String()) } } func (t *tokens16) Order() [][]token16 { if t.ordered != nil { return t.ordered } depths := make([]int16, 1, math.MaxInt16) for i, token := range t.tree { if token.pegRule == ruleUnknown { t.tree = t.tree[:i] break } depth := int(token.next) if length := len(depths); depth >= length { depths = depths[:depth+1] } depths[depth]++ } depths = append(depths, 0) ordered, pool := make([][]token16, len(depths)), make([]token16, len(t.tree)+len(depths)) for i, depth := range depths { depth++ ordered[i], pool, depths[i] = pool[:depth], pool[depth:], 0 } for i, token := range t.tree { depth := token.next token.next = int16(i) ordered[depth][depths[depth]] = token depths[depth]++ } t.ordered = ordered return ordered } type state16 struct { token16 depths []int16 leaf bool } func (t *tokens16) AST() *node32 { tokens := t.Tokens() stack := &element{node: &node32{token32: <-tokens}} for token := range tokens { if token.begin == token.end { continue } node := &node32{token32: token} for stack != nil && stack.node.begin >= token.begin && stack.node.end <= token.end { stack.node.next = node.up node.up = stack.node stack = stack.down } stack = &element{node: node, down: stack} } return stack.node } func (t *tokens16) PreOrder() (<-chan state16, [][]token16) { s, ordered := make(chan state16, 6), t.Order() go func() { var states [8]state16 for i, _ := range states { states[i].depths = make([]int16, len(ordered)) } depths, state, depth := make([]int16, len(ordered)), 0, 1 write := func(t token16, leaf bool) { S := states[state] state, S.pegRule, S.begin, S.end, S.next, S.leaf = (state+1)%8, t.pegRule, t.begin, t.end, int16(depth), leaf copy(S.depths, depths) s <- S } states[state].token16 = ordered[0][0] depths[0]++ state++ a, b := ordered[depth-1][depths[depth-1]-1], ordered[depth][depths[depth]] depthFirstSearch: for { for { if i := depths[depth]; i > 0 { if c, j := ordered[depth][i-1], depths[depth-1]; a.isParentOf(c) && (j < 2 || !ordered[depth-1][j-2].isParentOf(c)) { if c.end != b.begin { write(token16{pegRule: rule_In_, begin: c.end, end: b.begin}, true) } break } } if a.begin < b.begin { write(token16{pegRule: rulePre_, begin: a.begin, end: b.begin}, true) } break } next := depth + 1 if c := ordered[next][depths[next]]; c.pegRule != ruleUnknown && b.isParentOf(c) { write(b, false) depths[depth]++ depth, a, b = next, b, c continue } write(b, true) depths[depth]++ c, parent := ordered[depth][depths[depth]], true for { if c.pegRule != ruleUnknown && a.isParentOf(c) { b = c continue depthFirstSearch } else if parent && b.end != a.end { write(token16{pegRule: rule_Suf, begin: b.end, end: a.end}, true) } depth-- if depth > 0 { a, b, c = ordered[depth-1][depths[depth-1]-1], a, ordered[depth][depths[depth]] parent = a.isParentOf(b) continue } break depthFirstSearch } } close(s) }() return s, ordered } func (t *tokens16) PrintSyntax() { tokens, ordered := t.PreOrder() max := -1 for token := range tokens { if !token.leaf { fmt.Printf("%v", token.begin) for i, leaf, depths := 0, int(token.next), token.depths; i < leaf; i++ { fmt.Printf(" \x1B[36m%v\x1B[m", rul3s[ordered[i][depths[i]-1].pegRule]) } fmt.Printf(" \x1B[36m%v\x1B[m\n", rul3s[token.pegRule]) } else if token.begin == token.end { fmt.Printf("%v", token.begin) for i, leaf, depths := 0, int(token.next), token.depths; i < leaf; i++ { fmt.Printf(" \x1B[31m%v\x1B[m", rul3s[ordered[i][depths[i]-1].pegRule]) } fmt.Printf(" \x1B[31m%v\x1B[m\n", rul3s[token.pegRule]) } else { for c, end := token.begin, token.end; c < end; c++ { if i := int(c); max+1 < i { for j := max; j < i; j++ { fmt.Printf("skip %v %v\n", j, token.String()) } max = i } else if i := int(c); i <= max { for j := i; j <= max; j++ { fmt.Printf("dupe %v %v\n", j, token.String()) } } else { max = int(c) } fmt.Printf("%v", c) for i, leaf, depths := 0, int(token.next), token.depths; i < leaf; i++ { fmt.Printf(" \x1B[34m%v\x1B[m", rul3s[ordered[i][depths[i]-1].pegRule]) } fmt.Printf(" \x1B[34m%v\x1B[m\n", rul3s[token.pegRule]) } fmt.Printf("\n") } } } func (t *tokens16) PrintSyntaxTree(buffer string) { tokens, _ := t.PreOrder() for token := range tokens { for c := 0; c < int(token.next); c++ { fmt.Printf(" ") } fmt.Printf("\x1B[34m%v\x1B[m %v\n", rul3s[token.pegRule], strconv.Quote(string(([]rune(buffer)[token.begin:token.end])))) } } func (t *tokens16) Add(rule pegRule, begin, end, depth, index int) { t.tree[index] = token16{pegRule: rule, begin: int16(begin), end: int16(end), next: int16(depth)} } func (t *tokens16) Tokens() <-chan token32 { s := make(chan token32, 16) go func() { for _, v := range t.tree { s <- v.getToken32() } close(s) }() return s } func (t *tokens16) Error() []token32 { ordered := t.Order() length := len(ordered) tokens, length := make([]token32, length), length-1 for i, _ := range tokens { o := ordered[length-i] if len(o) > 1 { tokens[i] = o[len(o)-2].getToken32() } } return tokens } /* ${@} bit structure for abstract syntax tree */ type token32 struct { pegRule begin, end, next int32 } func (t *token32) isZero() bool { return t.pegRule == ruleUnknown && t.begin == 0 && t.end == 0 && t.next == 0 } func (t *token32) isParentOf(u token32) bool { return t.begin <= u.begin && t.end >= u.end && t.next > u.next } func (t *token32) getToken32() token32 { return token32{pegRule: t.pegRule, begin: int32(t.begin), end: int32(t.end), next: int32(t.next)} } func (t *token32) String() string { return fmt.Sprintf("\x1B[34m%v\x1B[m %v %v %v", rul3s[t.pegRule], t.begin, t.end, t.next) } type tokens32 struct { tree []token32 ordered [][]token32 } func (t *tokens32) trim(length int) { t.tree = t.tree[0:length] } func (t *tokens32) Print() { for _, token := range t.tree { fmt.Println(token.String()) } } func (t *tokens32) Order() [][]token32 { if t.ordered != nil { return t.ordered } depths := make([]int32, 1, math.MaxInt16) for i, token := range t.tree { if token.pegRule == ruleUnknown { t.tree = t.tree[:i] break } depth := int(token.next) if length := len(depths); depth >= length { depths = depths[:depth+1] } depths[depth]++ } depths = append(depths, 0) ordered, pool := make([][]token32, len(depths)), make([]token32, len(t.tree)+len(depths)) for i, depth := range depths { depth++ ordered[i], pool, depths[i] = pool[:depth], pool[depth:], 0 } for i, token := range t.tree { depth := token.next token.next = int32(i) ordered[depth][depths[depth]] = token depths[depth]++ } t.ordered = ordered return ordered } type state32 struct { token32 depths []int32 leaf bool } func (t *tokens32) AST() *node32 { tokens := t.Tokens() stack := &element{node: &node32{token32: <-tokens}} for token := range tokens { if token.begin == token.end { continue } node := &node32{token32: token} for stack != nil && stack.node.begin >= token.begin && stack.node.end <= token.end { stack.node.next = node.up node.up = stack.node stack = stack.down } stack = &element{node: node, down: stack} } return stack.node } func (t *tokens32) PreOrder() (<-chan state32, [][]token32) { s, ordered := make(chan state32, 6), t.Order() go func() { var states [8]state32 for i, _ := range states { states[i].depths = make([]int32, len(ordered)) } depths, state, depth := make([]int32, len(ordered)), 0, 1 write := func(t token32, leaf bool) { S := states[state] state, S.pegRule, S.begin, S.end, S.next, S.leaf = (state+1)%8, t.pegRule, t.begin, t.end, int32(depth), leaf copy(S.depths, depths) s <- S } states[state].token32 = ordered[0][0] depths[0]++ state++ a, b := ordered[depth-1][depths[depth-1]-1], ordered[depth][depths[depth]] depthFirstSearch: for { for { if i := depths[depth]; i > 0 { if c, j := ordered[depth][i-1], depths[depth-1]; a.isParentOf(c) && (j < 2 || !ordered[depth-1][j-2].isParentOf(c)) { if c.end != b.begin { write(token32{pegRule: rule_In_, begin: c.end, end: b.begin}, true) } break } } if a.begin < b.begin { write(token32{pegRule: rulePre_, begin: a.begin, end: b.begin}, true) } break } next := depth + 1 if c := ordered[next][depths[next]]; c.pegRule != ruleUnknown && b.isParentOf(c) { write(b, false) depths[depth]++ depth, a, b = next, b, c continue } write(b, true) depths[depth]++ c, parent := ordered[depth][depths[depth]], true for { if c.pegRule != ruleUnknown && a.isParentOf(c) { b = c continue depthFirstSearch } else if parent && b.end != a.end { write(token32{pegRule: rule_Suf, begin: b.end, end: a.end}, true) } depth-- if depth > 0 { a, b, c = ordered[depth-1][depths[depth-1]-1], a, ordered[depth][depths[depth]] parent = a.isParentOf(b) continue } break depthFirstSearch } } close(s) }() return s, ordered } func (t *tokens32) PrintSyntax() { tokens, ordered := t.PreOrder() max := -1 for token := range tokens { if !token.leaf { fmt.Printf("%v", token.begin) for i, leaf, depths := 0, int(token.next), token.depths; i < leaf; i++ { fmt.Printf(" \x1B[36m%v\x1B[m", rul3s[ordered[i][depths[i]-1].pegRule]) } fmt.Printf(" \x1B[36m%v\x1B[m\n", rul3s[token.pegRule]) } else if token.begin == token.end { fmt.Printf("%v", token.begin) for i, leaf, depths := 0, int(token.next), token.depths; i < leaf; i++ { fmt.Printf(" \x1B[31m%v\x1B[m", rul3s[ordered[i][depths[i]-1].pegRule]) } fmt.Printf(" \x1B[31m%v\x1B[m\n", rul3s[token.pegRule]) } else { for c, end := token.begin, token.end; c < end; c++ { if i := int(c); max+1 < i { for j := max; j < i; j++ { fmt.Printf("skip %v %v\n", j, token.String()) } max = i } else if i := int(c); i <= max { for j := i; j <= max; j++ { fmt.Printf("dupe %v %v\n", j, token.String()) } } else { max = int(c) } fmt.Printf("%v", c) for i, leaf, depths := 0, int(token.next), token.depths; i < leaf; i++ { fmt.Printf(" \x1B[34m%v\x1B[m", rul3s[ordered[i][depths[i]-1].pegRule]) } fmt.Printf(" \x1B[34m%v\x1B[m\n", rul3s[token.pegRule]) } fmt.Printf("\n") } } } func (t *tokens32) PrintSyntaxTree(buffer string) { tokens, _ := t.PreOrder() for token := range tokens { for c := 0; c < int(token.next); c++ { fmt.Printf(" ") } fmt.Printf("\x1B[34m%v\x1B[m %v\n", rul3s[token.pegRule], strconv.Quote(string(([]rune(buffer)[token.begin:token.end])))) } } func (t *tokens32) Add(rule pegRule, begin, end, depth, index int) { t.tree[index] = token32{pegRule: rule, begin: int32(begin), end: int32(end), next: int32(depth)} } func (t *tokens32) Tokens() <-chan token32 { s := make(chan token32, 16) go func() { for _, v := range t.tree { s <- v.getToken32() } close(s) }() return s } func (t *tokens32) Error() []token32 { ordered := t.Order() length := len(ordered) tokens, length := make([]token32, length), length-1 for i, _ := range tokens { o := ordered[length-i] if len(o) > 1 { tokens[i] = o[len(o)-2].getToken32() } } return tokens } func (t *tokens16) Expand(index int) tokenTree { tree := t.tree if index >= len(tree) { expanded := make([]token32, 2*len(tree)) for i, v := range tree { expanded[i] = v.getToken32() } return &tokens32{tree: expanded} } return nil } func (t *tokens32) Expand(index int) tokenTree { tree := t.tree if index >= len(tree) { expanded := make([]token32, 2*len(tree)) copy(expanded, tree) t.tree = expanded } return nil } type tomlParser struct { toml Buffer string buffer []rune rules [85]func() bool Parse func(rule ...int) error Reset func() tokenTree } type textPosition struct { line, symbol int } type textPositionMap map[int]textPosition func translatePositions(buffer string, positions []int) textPositionMap { length, translations, j, line, symbol := len(positions), make(textPositionMap, len(positions)), 0, 1, 0 sort.Ints(positions) search: for i, c := range buffer[0:] { if c == '\n' { line, symbol = line+1, 0 } else { symbol++ } if i == positions[j] { translations[positions[j]] = textPosition{line, symbol} for j++; j < length; j++ { if i != positions[j] { continue search } } break search } } return translations } type parseError struct { p *tomlParser } func (e *parseError) Error() string { tokens, error := e.p.tokenTree.Error(), "\n" positions, p := make([]int, 2*len(tokens)), 0 for _, token := range tokens { positions[p], p = int(token.begin), p+1 positions[p], p = int(token.end), p+1 } translations := translatePositions(e.p.Buffer, positions) for _, token := range tokens { begin, end := int(token.begin), int(token.end) error += fmt.Sprintf("parse error near \x1B[34m%v\x1B[m (line %v symbol %v - line %v symbol %v):\n%v\n", rul3s[token.pegRule], translations[begin].line, translations[begin].symbol, translations[end].line, translations[end].symbol, /*strconv.Quote(*/ e.p.Buffer[begin:end] /*)*/) } return error } func (p *tomlParser) PrintSyntaxTree() { p.tokenTree.PrintSyntaxTree(p.Buffer) } func (p *tomlParser) Highlighter() { p.tokenTree.PrintSyntax() } func (p *tomlParser) Execute() { buffer, begin, end := p.Buffer, 0, 0 for token := range p.tokenTree.Tokens() { switch token.pegRule { case rulePegText: begin, end = int(token.begin), int(token.end) case ruleAction0: _ = buffer case ruleAction1: p.SetTableString(begin, end) case ruleAction2: p.AddLineCount(end - begin) case ruleAction3: p.AddLineCount(end - begin) case ruleAction4: p.AddKeyValue() case ruleAction5: p.SetKey(p.buffer, begin, end) case ruleAction6: p.SetKey(p.buffer, begin, end) case ruleAction7: p.SetTime(begin, end) case ruleAction8: p.SetFloat64(begin, end) case ruleAction9: p.SetInt64(begin, end) case ruleAction10: p.SetString(begin, end) case ruleAction11: p.SetBool(begin, end) case ruleAction12: p.SetArray(begin, end) case ruleAction13: p.SetTable(p.buffer, begin, end) case ruleAction14: p.SetArrayTable(p.buffer, begin, end) case ruleAction15: p.StartInlineTable() case ruleAction16: p.EndInlineTable() case ruleAction17: p.SetBasicString(p.buffer, begin, end) case ruleAction18: p.SetMultilineString() case ruleAction19: p.AddMultilineBasicBody(p.buffer, begin, end) case ruleAction20: p.SetLiteralString(p.buffer, begin, end) case ruleAction21: p.SetMultilineLiteralString(p.buffer, begin, end) case ruleAction22: p.StartArray() case ruleAction23: p.AddArrayVal() } } _, _, _ = buffer, begin, end } func (p *tomlParser) Init() { p.buffer = []rune(p.Buffer) if len(p.buffer) == 0 || p.buffer[len(p.buffer)-1] != end_symbol { p.buffer = append(p.buffer, end_symbol) } var tree tokenTree = &tokens16{tree: make([]token16, math.MaxInt16)} position, depth, tokenIndex, buffer, _rules := 0, 0, 0, p.buffer, p.rules p.Parse = func(rule ...int) error { r := 1 if len(rule) > 0 { r = rule[0] } matches := p.rules[r]() p.tokenTree = tree if matches { p.tokenTree.trim(tokenIndex) return nil } return &parseError{p} } p.Reset = func() { position, tokenIndex, depth = 0, 0, 0 } add := func(rule pegRule, begin int) { if t := tree.Expand(tokenIndex); t != nil { tree = t } tree.Add(rule, begin, position, depth, tokenIndex) tokenIndex++ } matchDot := func() bool { if buffer[position] != end_symbol { position++ return true } return false } /*matchChar := func(c byte) bool { if buffer[position] == c { position++ return true } return false }*/ /*matchRange := func(lower byte, upper byte) bool { if c := buffer[position]; c >= lower && c <= upper { position++ return true } return false }*/ _rules = [...]func() bool{ nil, /* 0 TOML <- <(Expression (newline Expression)* newline? !. Action0)> */ func() bool { position0, tokenIndex0, depth0 := position, tokenIndex, depth { position1 := position depth++ if !_rules[ruleExpression]() { goto l0 } l2: { position3, tokenIndex3, depth3 := position, tokenIndex, depth if !_rules[rulenewline]() { goto l3 } if !_rules[ruleExpression]() { goto l3 } goto l2 l3: position, tokenIndex, depth = position3, tokenIndex3, depth3 } { position4, tokenIndex4, depth4 := position, tokenIndex, depth if !_rules[rulenewline]() { goto l4 } goto l5 l4: position, tokenIndex, depth = position4, tokenIndex4, depth4 } l5: { position6, tokenIndex6, depth6 := position, tokenIndex, depth if !matchDot() { goto l6 } goto l0 l6: position, tokenIndex, depth = position6, tokenIndex6, depth6 } { add(ruleAction0, position) } depth-- add(ruleTOML, position1) } return true l0: position, tokenIndex, depth = position0, tokenIndex0, depth0 return false }, /* 1 Expression <- <((<(ws table ws comment? (wsnl keyval ws comment?)*)> Action1) / (ws keyval ws comment?) / (ws comment?) / ws)> */ func() bool { position8, tokenIndex8, depth8 := position, tokenIndex, depth { position9 := position depth++ { position10, tokenIndex10, depth10 := position, tokenIndex, depth { position12 := position depth++ if !_rules[rulews]() { goto l11 } { position13 := position depth++ { position14, tokenIndex14, depth14 := position, tokenIndex, depth { position16 := position depth++ if buffer[position] != rune('[') { goto l15 } position++ if !_rules[rulews]() { goto l15 } { position17 := position depth++ if !_rules[ruletableKey]() { goto l15 } depth-- add(rulePegText, position17) } if !_rules[rulews]() { goto l15 } if buffer[position] != rune(']') { goto l15 } position++ { add(ruleAction13, position) } depth-- add(rulestdTable, position16) } goto l14 l15: position, tokenIndex, depth = position14, tokenIndex14, depth14 { position19 := position depth++ if buffer[position] != rune('[') { goto l11 } position++ if buffer[position] != rune('[') { goto l11 } position++ if !_rules[rulews]() { goto l11 } { position20 := position depth++ if !_rules[ruletableKey]() { goto l11 } depth-- add(rulePegText, position20) } if !_rules[rulews]() { goto l11 } if buffer[position] != rune(']') { goto l11 } position++ if buffer[position] != rune(']') { goto l11 } position++ { add(ruleAction14, position) } depth-- add(rulearrayTable, position19) } } l14: depth-- add(ruletable, position13) } if !_rules[rulews]() { goto l11 } { position22, tokenIndex22, depth22 := position, tokenIndex, depth if !_rules[rulecomment]() { goto l22 } goto l23 l22: position, tokenIndex, depth = position22, tokenIndex22, depth22 } l23: l24: { position25, tokenIndex25, depth25 := position, tokenIndex, depth if !_rules[rulewsnl]() { goto l25 } if !_rules[rulekeyval]() { goto l25 } if !_rules[rulews]() { goto l25 } { position26, tokenIndex26, depth26 := position, tokenIndex, depth if !_rules[rulecomment]() { goto l26 } goto l27 l26: position, tokenIndex, depth = position26, tokenIndex26, depth26 } l27: goto l24 l25: position, tokenIndex, depth = position25, tokenIndex25, depth25 } depth-- add(rulePegText, position12) } { add(ruleAction1, position) } goto l10 l11: position, tokenIndex, depth = position10, tokenIndex10, depth10 if !_rules[rulews]() { goto l29 } if !_rules[rulekeyval]() { goto l29 } if !_rules[rulews]() { goto l29 } { position30, tokenIndex30, depth30 := position, tokenIndex, depth if !_rules[rulecomment]() { goto l30 } goto l31 l30: position, tokenIndex, depth = position30, tokenIndex30, depth30 } l31: goto l10 l29: position, tokenIndex, depth = position10, tokenIndex10, depth10 if !_rules[rulews]() { goto l32 } { position33, tokenIndex33, depth33 := position, tokenIndex, depth if !_rules[rulecomment]() { goto l33 } goto l34 l33: position, tokenIndex, depth = position33, tokenIndex33, depth33 } l34: goto l10 l32: position, tokenIndex, depth = position10, tokenIndex10, depth10 if !_rules[rulews]() { goto l8 } } l10: depth-- add(ruleExpression, position9) } return true l8: position, tokenIndex, depth = position8, tokenIndex8, depth8 return false }, /* 2 newline <- <(<('\r' / '\n')+> Action2)> */ func() bool { position35, tokenIndex35, depth35 := position, tokenIndex, depth { position36 := position depth++ { position37 := position depth++ { position40, tokenIndex40, depth40 := position, tokenIndex, depth if buffer[position] != rune('\r') { goto l41 } position++ goto l40 l41: position, tokenIndex, depth = position40, tokenIndex40, depth40 if buffer[position] != rune('\n') { goto l35 } position++ } l40: l38: { position39, tokenIndex39, depth39 := position, tokenIndex, depth { position42, tokenIndex42, depth42 := position, tokenIndex, depth if buffer[position] != rune('\r') { goto l43 } position++ goto l42 l43: position, tokenIndex, depth = position42, tokenIndex42, depth42 if buffer[position] != rune('\n') { goto l39 } position++ } l42: goto l38 l39: position, tokenIndex, depth = position39, tokenIndex39, depth39 } depth-- add(rulePegText, position37) } { add(ruleAction2, position) } depth-- add(rulenewline, position36) } return true l35: position, tokenIndex, depth = position35, tokenIndex35, depth35 return false }, /* 3 ws <- <(' ' / '\t')*> */ func() bool { { position46 := position depth++ l47: { position48, tokenIndex48, depth48 := position, tokenIndex, depth { position49, tokenIndex49, depth49 := position, tokenIndex, depth if buffer[position] != rune(' ') { goto l50 } position++ goto l49 l50: position, tokenIndex, depth = position49, tokenIndex49, depth49 if buffer[position] != rune('\t') { goto l48 } position++ } l49: goto l47 l48: position, tokenIndex, depth = position48, tokenIndex48, depth48 } depth-- add(rulews, position46) } return true }, /* 4 wsnl <- <((&('\t') '\t') | (&(' ') ' ') | (&('\n' | '\r') (<('\r' / '\n')> Action3)))*> */ func() bool { { position52 := position depth++ l53: { position54, tokenIndex54, depth54 := position, tokenIndex, depth { switch buffer[position] { case '\t': if buffer[position] != rune('\t') { goto l54 } position++ break case ' ': if buffer[position] != rune(' ') { goto l54 } position++ break default: { position56 := position depth++ { position57, tokenIndex57, depth57 := position, tokenIndex, depth if buffer[position] != rune('\r') { goto l58 } position++ goto l57 l58: position, tokenIndex, depth = position57, tokenIndex57, depth57 if buffer[position] != rune('\n') { goto l54 } position++ } l57: depth-- add(rulePegText, position56) } { add(ruleAction3, position) } break } } goto l53 l54: position, tokenIndex, depth = position54, tokenIndex54, depth54 } depth-- add(rulewsnl, position52) } return true }, /* 5 comment <- <('#' <('\t' / [ -􏿿])*>)> */ func() bool { position60, tokenIndex60, depth60 := position, tokenIndex, depth { position61 := position depth++ if buffer[position] != rune('#') { goto l60 } position++ { position62 := position depth++ l63: { position64, tokenIndex64, depth64 := position, tokenIndex, depth { position65, tokenIndex65, depth65 := position, tokenIndex, depth if buffer[position] != rune('\t') { goto l66 } position++ goto l65 l66: position, tokenIndex, depth = position65, tokenIndex65, depth65 if c := buffer[position]; c < rune(' ') || c > rune('\U0010ffff') { goto l64 } position++ } l65: goto l63 l64: position, tokenIndex, depth = position64, tokenIndex64, depth64 } depth-- add(rulePegText, position62) } depth-- add(rulecomment, position61) } return true l60: position, tokenIndex, depth = position60, tokenIndex60, depth60 return false }, /* 6 keyval <- <(key ws '=' ws val Action4)> */ func() bool { position67, tokenIndex67, depth67 := position, tokenIndex, depth { position68 := position depth++ if !_rules[rulekey]() { goto l67 } if !_rules[rulews]() { goto l67 } if buffer[position] != rune('=') { goto l67 } position++ if !_rules[rulews]() { goto l67 } if !_rules[ruleval]() { goto l67 } { add(ruleAction4, position) } depth-- add(rulekeyval, position68) } return true l67: position, tokenIndex, depth = position67, tokenIndex67, depth67 return false }, /* 7 key <- <(bareKey / quotedKey)> */ func() bool { position70, tokenIndex70, depth70 := position, tokenIndex, depth { position71 := position depth++ { position72, tokenIndex72, depth72 := position, tokenIndex, depth { position74 := position depth++ { position75 := position depth++ { switch buffer[position] { case '_': if buffer[position] != rune('_') { goto l73 } position++ break case '-': if buffer[position] != rune('-') { goto l73 } position++ break case 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z': if c := buffer[position]; c < rune('a') || c > rune('z') { goto l73 } position++ break case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': if c := buffer[position]; c < rune('0') || c > rune('9') { goto l73 } position++ break default: if c := buffer[position]; c < rune('A') || c > rune('Z') { goto l73 } position++ break } } l76: { position77, tokenIndex77, depth77 := position, tokenIndex, depth { switch buffer[position] { case '_': if buffer[position] != rune('_') { goto l77 } position++ break case '-': if buffer[position] != rune('-') { goto l77 } position++ break case 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z': if c := buffer[position]; c < rune('a') || c > rune('z') { goto l77 } position++ break case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': if c := buffer[position]; c < rune('0') || c > rune('9') { goto l77 } position++ break default: if c := buffer[position]; c < rune('A') || c > rune('Z') { goto l77 } position++ break } } goto l76 l77: position, tokenIndex, depth = position77, tokenIndex77, depth77 } depth-- add(rulePegText, position75) } { add(ruleAction5, position) } depth-- add(rulebareKey, position74) } goto l72 l73: position, tokenIndex, depth = position72, tokenIndex72, depth72 { position81 := position depth++ if buffer[position] != rune('"') { goto l70 } position++ { position82 := position depth++ if !_rules[rulebasicChar]() { goto l70 } l83: { position84, tokenIndex84, depth84 := position, tokenIndex, depth if !_rules[rulebasicChar]() { goto l84 } goto l83 l84: position, tokenIndex, depth = position84, tokenIndex84, depth84 } depth-- add(rulePegText, position82) } if buffer[position] != rune('"') { goto l70 } position++ { add(ruleAction6, position) } depth-- add(rulequotedKey, position81) } } l72: depth-- add(rulekey, position71) } return true l70: position, tokenIndex, depth = position70, tokenIndex70, depth70 return false }, /* 8 bareKey <- <(<((&('_') '_') | (&('-') '-') | (&('a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z') [a-z]) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') [0-9]) | (&('A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z') [A-Z]))+> Action5)> */ nil, /* 9 quotedKey <- <('"' '"' Action6)> */ nil, /* 10 val <- <(( Action7) / ( Action8) / ((&('{') inlineTable) | (&('[') ( Action12)) | (&('f' | 't') ( Action11)) | (&('"' | '\'') ( Action10)) | (&('+' | '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') ( Action9))))> */ func() bool { position88, tokenIndex88, depth88 := position, tokenIndex, depth { position89 := position depth++ { position90, tokenIndex90, depth90 := position, tokenIndex, depth { position92 := position depth++ { position93 := position depth++ { position94 := position depth++ { position95 := position depth++ { position96 := position depth++ if !_rules[ruledigitDual]() { goto l91 } if !_rules[ruledigitDual]() { goto l91 } depth-- add(ruledigitQuad, position96) } depth-- add(ruledateFullYear, position95) } if buffer[position] != rune('-') { goto l91 } position++ { position97 := position depth++ if !_rules[ruledigitDual]() { goto l91 } depth-- add(ruledateMonth, position97) } if buffer[position] != rune('-') { goto l91 } position++ { position98 := position depth++ if !_rules[ruledigitDual]() { goto l91 } depth-- add(ruledateMDay, position98) } depth-- add(rulefullDate, position94) } if buffer[position] != rune('T') { goto l91 } position++ { position99 := position depth++ { position100 := position depth++ if !_rules[ruletimeHour]() { goto l91 } if buffer[position] != rune(':') { goto l91 } position++ if !_rules[ruletimeMinute]() { goto l91 } if buffer[position] != rune(':') { goto l91 } position++ { position101 := position depth++ if !_rules[ruledigitDual]() { goto l91 } depth-- add(ruletimeSecond, position101) } { position102, tokenIndex102, depth102 := position, tokenIndex, depth { position104 := position depth++ if buffer[position] != rune('.') { goto l102 } position++ if !_rules[ruledigit]() { goto l102 } l105: { position106, tokenIndex106, depth106 := position, tokenIndex, depth if !_rules[ruledigit]() { goto l106 } goto l105 l106: position, tokenIndex, depth = position106, tokenIndex106, depth106 } depth-- add(ruletimeSecfrac, position104) } goto l103 l102: position, tokenIndex, depth = position102, tokenIndex102, depth102 } l103: depth-- add(rulepartialTime, position100) } { position107 := position depth++ { position108, tokenIndex108, depth108 := position, tokenIndex, depth if buffer[position] != rune('Z') { goto l109 } position++ goto l108 l109: position, tokenIndex, depth = position108, tokenIndex108, depth108 { position110 := position depth++ { position111, tokenIndex111, depth111 := position, tokenIndex, depth if buffer[position] != rune('-') { goto l112 } position++ goto l111 l112: position, tokenIndex, depth = position111, tokenIndex111, depth111 if buffer[position] != rune('+') { goto l91 } position++ } l111: if !_rules[ruletimeHour]() { goto l91 } if buffer[position] != rune(':') { goto l91 } position++ if !_rules[ruletimeMinute]() { goto l91 } depth-- add(ruletimeNumoffset, position110) } } l108: depth-- add(ruletimeOffset, position107) } depth-- add(rulefullTime, position99) } depth-- add(ruledatetime, position93) } depth-- add(rulePegText, position92) } { add(ruleAction7, position) } goto l90 l91: position, tokenIndex, depth = position90, tokenIndex90, depth90 { position115 := position depth++ { position116 := position depth++ if !_rules[ruleinteger]() { goto l114 } { position117, tokenIndex117, depth117 := position, tokenIndex, depth if !_rules[rulefrac]() { goto l118 } { position119, tokenIndex119, depth119 := position, tokenIndex, depth if !_rules[ruleexp]() { goto l119 } goto l120 l119: position, tokenIndex, depth = position119, tokenIndex119, depth119 } l120: goto l117 l118: position, tokenIndex, depth = position117, tokenIndex117, depth117 { position121, tokenIndex121, depth121 := position, tokenIndex, depth if !_rules[rulefrac]() { goto l121 } goto l122 l121: position, tokenIndex, depth = position121, tokenIndex121, depth121 } l122: if !_rules[ruleexp]() { goto l114 } } l117: depth-- add(rulefloat, position116) } depth-- add(rulePegText, position115) } { add(ruleAction8, position) } goto l90 l114: position, tokenIndex, depth = position90, tokenIndex90, depth90 { switch buffer[position] { case '{': { position125 := position depth++ if buffer[position] != rune('{') { goto l88 } position++ { add(ruleAction15, position) } if !_rules[rulews]() { goto l88 } { position127 := position depth++ l128: { position129, tokenIndex129, depth129 := position, tokenIndex, depth if !_rules[rulekeyval]() { goto l129 } { position130, tokenIndex130, depth130 := position, tokenIndex, depth { position132 := position depth++ if !_rules[rulews]() { goto l130 } if buffer[position] != rune(',') { goto l130 } position++ if !_rules[rulews]() { goto l130 } depth-- add(ruleinlineTableValSep, position132) } goto l131 l130: position, tokenIndex, depth = position130, tokenIndex130, depth130 } l131: goto l128 l129: position, tokenIndex, depth = position129, tokenIndex129, depth129 } depth-- add(ruleinlineTableKeyValues, position127) } if !_rules[rulews]() { goto l88 } if buffer[position] != rune('}') { goto l88 } position++ { add(ruleAction16, position) } depth-- add(ruleinlineTable, position125) } break case '[': { position134 := position depth++ { position135 := position depth++ if buffer[position] != rune('[') { goto l88 } position++ { add(ruleAction22, position) } if !_rules[rulewsnl]() { goto l88 } { position137 := position depth++ l138: { position139, tokenIndex139, depth139 := position, tokenIndex, depth if !_rules[ruleval]() { goto l139 } { add(ruleAction23, position) } { position141, tokenIndex141, depth141 := position, tokenIndex, depth { position143 := position depth++ if !_rules[rulews]() { goto l141 } if buffer[position] != rune(',') { goto l141 } position++ if !_rules[rulewsnl]() { goto l141 } depth-- add(rulearraySep, position143) } goto l142 l141: position, tokenIndex, depth = position141, tokenIndex141, depth141 } l142: { position144, tokenIndex144, depth144 := position, tokenIndex, depth { position146, tokenIndex146, depth146 := position, tokenIndex, depth if !_rules[rulecomment]() { goto l146 } goto l147 l146: position, tokenIndex, depth = position146, tokenIndex146, depth146 } l147: if !_rules[rulenewline]() { goto l144 } goto l145 l144: position, tokenIndex, depth = position144, tokenIndex144, depth144 } l145: goto l138 l139: position, tokenIndex, depth = position139, tokenIndex139, depth139 } depth-- add(rulearrayValues, position137) } if !_rules[rulewsnl]() { goto l88 } if buffer[position] != rune(']') { goto l88 } position++ depth-- add(rulearray, position135) } depth-- add(rulePegText, position134) } { add(ruleAction12, position) } break case 'f', 't': { position149 := position depth++ { position150 := position depth++ { position151, tokenIndex151, depth151 := position, tokenIndex, depth if buffer[position] != rune('t') { goto l152 } position++ if buffer[position] != rune('r') { goto l152 } position++ if buffer[position] != rune('u') { goto l152 } position++ if buffer[position] != rune('e') { goto l152 } position++ goto l151 l152: position, tokenIndex, depth = position151, tokenIndex151, depth151 if buffer[position] != rune('f') { goto l88 } position++ if buffer[position] != rune('a') { goto l88 } position++ if buffer[position] != rune('l') { goto l88 } position++ if buffer[position] != rune('s') { goto l88 } position++ if buffer[position] != rune('e') { goto l88 } position++ } l151: depth-- add(ruleboolean, position150) } depth-- add(rulePegText, position149) } { add(ruleAction11, position) } break case '"', '\'': { position154 := position depth++ { position155 := position depth++ { position156, tokenIndex156, depth156 := position, tokenIndex, depth { position158 := position depth++ if buffer[position] != rune('\'') { goto l157 } position++ if buffer[position] != rune('\'') { goto l157 } position++ if buffer[position] != rune('\'') { goto l157 } position++ { position159 := position depth++ { position160 := position depth++ l161: { position162, tokenIndex162, depth162 := position, tokenIndex, depth { position163, tokenIndex163, depth163 := position, tokenIndex, depth if buffer[position] != rune('\'') { goto l163 } position++ if buffer[position] != rune('\'') { goto l163 } position++ if buffer[position] != rune('\'') { goto l163 } position++ goto l162 l163: position, tokenIndex, depth = position163, tokenIndex163, depth163 } { position164, tokenIndex164, depth164 := position, tokenIndex, depth { position166 := position depth++ { position167, tokenIndex167, depth167 := position, tokenIndex, depth if buffer[position] != rune('\t') { goto l168 } position++ goto l167 l168: position, tokenIndex, depth = position167, tokenIndex167, depth167 if c := buffer[position]; c < rune(' ') || c > rune('\U0010ffff') { goto l165 } position++ } l167: depth-- add(rulemlLiteralChar, position166) } goto l164 l165: position, tokenIndex, depth = position164, tokenIndex164, depth164 if !_rules[rulenewline]() { goto l162 } } l164: goto l161 l162: position, tokenIndex, depth = position162, tokenIndex162, depth162 } depth-- add(rulemlLiteralBody, position160) } depth-- add(rulePegText, position159) } if buffer[position] != rune('\'') { goto l157 } position++ if buffer[position] != rune('\'') { goto l157 } position++ if buffer[position] != rune('\'') { goto l157 } position++ { add(ruleAction21, position) } depth-- add(rulemlLiteralString, position158) } goto l156 l157: position, tokenIndex, depth = position156, tokenIndex156, depth156 { position171 := position depth++ if buffer[position] != rune('\'') { goto l170 } position++ { position172 := position depth++ l173: { position174, tokenIndex174, depth174 := position, tokenIndex, depth { position175 := position depth++ { switch buffer[position] { case '\t': if buffer[position] != rune('\t') { goto l174 } position++ break case ' ', '!', '"', '#', '$', '%', '&': if c := buffer[position]; c < rune(' ') || c > rune('&') { goto l174 } position++ break default: if c := buffer[position]; c < rune('(') || c > rune('\U0010ffff') { goto l174 } position++ break } } depth-- add(ruleliteralChar, position175) } goto l173 l174: position, tokenIndex, depth = position174, tokenIndex174, depth174 } depth-- add(rulePegText, position172) } if buffer[position] != rune('\'') { goto l170 } position++ { add(ruleAction20, position) } depth-- add(ruleliteralString, position171) } goto l156 l170: position, tokenIndex, depth = position156, tokenIndex156, depth156 { position179 := position depth++ if buffer[position] != rune('"') { goto l178 } position++ if buffer[position] != rune('"') { goto l178 } position++ if buffer[position] != rune('"') { goto l178 } position++ { position180 := position depth++ l181: { position182, tokenIndex182, depth182 := position, tokenIndex, depth { position183, tokenIndex183, depth183 := position, tokenIndex, depth { position185 := position depth++ { position186, tokenIndex186, depth186 := position, tokenIndex, depth if !_rules[rulebasicChar]() { goto l187 } goto l186 l187: position, tokenIndex, depth = position186, tokenIndex186, depth186 if !_rules[rulenewline]() { goto l184 } } l186: depth-- add(rulePegText, position185) } { add(ruleAction19, position) } goto l183 l184: position, tokenIndex, depth = position183, tokenIndex183, depth183 if !_rules[ruleescape]() { goto l182 } if !_rules[rulenewline]() { goto l182 } if !_rules[rulewsnl]() { goto l182 } } l183: goto l181 l182: position, tokenIndex, depth = position182, tokenIndex182, depth182 } depth-- add(rulemlBasicBody, position180) } if buffer[position] != rune('"') { goto l178 } position++ if buffer[position] != rune('"') { goto l178 } position++ if buffer[position] != rune('"') { goto l178 } position++ { add(ruleAction18, position) } depth-- add(rulemlBasicString, position179) } goto l156 l178: position, tokenIndex, depth = position156, tokenIndex156, depth156 { position190 := position depth++ { position191 := position depth++ if buffer[position] != rune('"') { goto l88 } position++ l192: { position193, tokenIndex193, depth193 := position, tokenIndex, depth if !_rules[rulebasicChar]() { goto l193 } goto l192 l193: position, tokenIndex, depth = position193, tokenIndex193, depth193 } if buffer[position] != rune('"') { goto l88 } position++ depth-- add(rulePegText, position191) } { add(ruleAction17, position) } depth-- add(rulebasicString, position190) } } l156: depth-- add(rulestring, position155) } depth-- add(rulePegText, position154) } { add(ruleAction10, position) } break default: { position196 := position depth++ if !_rules[ruleinteger]() { goto l88 } depth-- add(rulePegText, position196) } { add(ruleAction9, position) } break } } } l90: depth-- add(ruleval, position89) } return true l88: position, tokenIndex, depth = position88, tokenIndex88, depth88 return false }, /* 11 table <- <(stdTable / arrayTable)> */ nil, /* 12 stdTable <- <('[' ws ws ']' Action13)> */ nil, /* 13 arrayTable <- <('[' '[' ws ws (']' ']') Action14)> */ nil, /* 14 inlineTable <- <('{' Action15 ws inlineTableKeyValues ws '}' Action16)> */ nil, /* 15 inlineTableKeyValues <- <(keyval inlineTableValSep?)*> */ nil, /* 16 tableKey <- <(key (tableKeySep key)*)> */ func() bool { position203, tokenIndex203, depth203 := position, tokenIndex, depth { position204 := position depth++ if !_rules[rulekey]() { goto l203 } l205: { position206, tokenIndex206, depth206 := position, tokenIndex, depth { position207 := position depth++ if !_rules[rulews]() { goto l206 } if buffer[position] != rune('.') { goto l206 } position++ if !_rules[rulews]() { goto l206 } depth-- add(ruletableKeySep, position207) } if !_rules[rulekey]() { goto l206 } goto l205 l206: position, tokenIndex, depth = position206, tokenIndex206, depth206 } depth-- add(ruletableKey, position204) } return true l203: position, tokenIndex, depth = position203, tokenIndex203, depth203 return false }, /* 17 tableKeySep <- <(ws '.' ws)> */ nil, /* 18 inlineTableValSep <- <(ws ',' ws)> */ nil, /* 19 integer <- <(('-' / '+')? int)> */ func() bool { position210, tokenIndex210, depth210 := position, tokenIndex, depth { position211 := position depth++ { position212, tokenIndex212, depth212 := position, tokenIndex, depth { position214, tokenIndex214, depth214 := position, tokenIndex, depth if buffer[position] != rune('-') { goto l215 } position++ goto l214 l215: position, tokenIndex, depth = position214, tokenIndex214, depth214 if buffer[position] != rune('+') { goto l212 } position++ } l214: goto l213 l212: position, tokenIndex, depth = position212, tokenIndex212, depth212 } l213: { position216 := position depth++ { position217, tokenIndex217, depth217 := position, tokenIndex, depth if c := buffer[position]; c < rune('1') || c > rune('9') { goto l218 } position++ { position221, tokenIndex221, depth221 := position, tokenIndex, depth if !_rules[ruledigit]() { goto l222 } goto l221 l222: position, tokenIndex, depth = position221, tokenIndex221, depth221 if buffer[position] != rune('_') { goto l218 } position++ if !_rules[ruledigit]() { goto l218 } } l221: l219: { position220, tokenIndex220, depth220 := position, tokenIndex, depth { position223, tokenIndex223, depth223 := position, tokenIndex, depth if !_rules[ruledigit]() { goto l224 } goto l223 l224: position, tokenIndex, depth = position223, tokenIndex223, depth223 if buffer[position] != rune('_') { goto l220 } position++ if !_rules[ruledigit]() { goto l220 } } l223: goto l219 l220: position, tokenIndex, depth = position220, tokenIndex220, depth220 } goto l217 l218: position, tokenIndex, depth = position217, tokenIndex217, depth217 if !_rules[ruledigit]() { goto l210 } } l217: depth-- add(ruleint, position216) } depth-- add(ruleinteger, position211) } return true l210: position, tokenIndex, depth = position210, tokenIndex210, depth210 return false }, /* 20 int <- <(([1-9] (digit / ('_' digit))+) / digit)> */ nil, /* 21 float <- <(integer ((frac exp?) / (frac? exp)))> */ nil, /* 22 frac <- <('.' digit (digit / ('_' digit))*)> */ func() bool { position227, tokenIndex227, depth227 := position, tokenIndex, depth { position228 := position depth++ if buffer[position] != rune('.') { goto l227 } position++ if !_rules[ruledigit]() { goto l227 } l229: { position230, tokenIndex230, depth230 := position, tokenIndex, depth { position231, tokenIndex231, depth231 := position, tokenIndex, depth if !_rules[ruledigit]() { goto l232 } goto l231 l232: position, tokenIndex, depth = position231, tokenIndex231, depth231 if buffer[position] != rune('_') { goto l230 } position++ if !_rules[ruledigit]() { goto l230 } } l231: goto l229 l230: position, tokenIndex, depth = position230, tokenIndex230, depth230 } depth-- add(rulefrac, position228) } return true l227: position, tokenIndex, depth = position227, tokenIndex227, depth227 return false }, /* 23 exp <- <(('e' / 'E') ('-' / '+')? digit (digit / ('_' digit))*)> */ func() bool { position233, tokenIndex233, depth233 := position, tokenIndex, depth { position234 := position depth++ { position235, tokenIndex235, depth235 := position, tokenIndex, depth if buffer[position] != rune('e') { goto l236 } position++ goto l235 l236: position, tokenIndex, depth = position235, tokenIndex235, depth235 if buffer[position] != rune('E') { goto l233 } position++ } l235: { position237, tokenIndex237, depth237 := position, tokenIndex, depth { position239, tokenIndex239, depth239 := position, tokenIndex, depth if buffer[position] != rune('-') { goto l240 } position++ goto l239 l240: position, tokenIndex, depth = position239, tokenIndex239, depth239 if buffer[position] != rune('+') { goto l237 } position++ } l239: goto l238 l237: position, tokenIndex, depth = position237, tokenIndex237, depth237 } l238: if !_rules[ruledigit]() { goto l233 } l241: { position242, tokenIndex242, depth242 := position, tokenIndex, depth { position243, tokenIndex243, depth243 := position, tokenIndex, depth if !_rules[ruledigit]() { goto l244 } goto l243 l244: position, tokenIndex, depth = position243, tokenIndex243, depth243 if buffer[position] != rune('_') { goto l242 } position++ if !_rules[ruledigit]() { goto l242 } } l243: goto l241 l242: position, tokenIndex, depth = position242, tokenIndex242, depth242 } depth-- add(ruleexp, position234) } return true l233: position, tokenIndex, depth = position233, tokenIndex233, depth233 return false }, /* 24 string <- <(mlLiteralString / literalString / mlBasicString / basicString)> */ nil, /* 25 basicString <- <(<('"' basicChar* '"')> Action17)> */ nil, /* 26 basicChar <- <(basicUnescaped / escaped)> */ func() bool { position247, tokenIndex247, depth247 := position, tokenIndex, depth { position248 := position depth++ { position249, tokenIndex249, depth249 := position, tokenIndex, depth { position251 := position depth++ { switch buffer[position] { case ' ', '!': if c := buffer[position]; c < rune(' ') || c > rune('!') { goto l250 } position++ break case '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[': if c := buffer[position]; c < rune('#') || c > rune('[') { goto l250 } position++ break default: if c := buffer[position]; c < rune(']') || c > rune('\U0010ffff') { goto l250 } position++ break } } depth-- add(rulebasicUnescaped, position251) } goto l249 l250: position, tokenIndex, depth = position249, tokenIndex249, depth249 { position253 := position depth++ if !_rules[ruleescape]() { goto l247 } { switch buffer[position] { case 'U': if buffer[position] != rune('U') { goto l247 } position++ if !_rules[rulehexQuad]() { goto l247 } if !_rules[rulehexQuad]() { goto l247 } break case 'u': if buffer[position] != rune('u') { goto l247 } position++ if !_rules[rulehexQuad]() { goto l247 } break case '\\': if buffer[position] != rune('\\') { goto l247 } position++ break case '/': if buffer[position] != rune('/') { goto l247 } position++ break case '"': if buffer[position] != rune('"') { goto l247 } position++ break case 'r': if buffer[position] != rune('r') { goto l247 } position++ break case 'f': if buffer[position] != rune('f') { goto l247 } position++ break case 'n': if buffer[position] != rune('n') { goto l247 } position++ break case 't': if buffer[position] != rune('t') { goto l247 } position++ break default: if buffer[position] != rune('b') { goto l247 } position++ break } } depth-- add(ruleescaped, position253) } } l249: depth-- add(rulebasicChar, position248) } return true l247: position, tokenIndex, depth = position247, tokenIndex247, depth247 return false }, /* 27 escaped <- <(escape ((&('U') ('U' hexQuad hexQuad)) | (&('u') ('u' hexQuad)) | (&('\\') '\\') | (&('/') '/') | (&('"') '"') | (&('r') 'r') | (&('f') 'f') | (&('n') 'n') | (&('t') 't') | (&('b') 'b')))> */ nil, /* 28 basicUnescaped <- <((&(' ' | '!') [ -!]) | (&('#' | '$' | '%' | '&' | '\'' | '(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z' | '[') [#-[]) | (&(']' | '^' | '_' | '`' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | '{' | '|' | '}' | '~' | '\u007f' | '\u0080' | '\u0081' | '\u0082' | '\u0083' | '\u0084' | '\u0085' | '\u0086' | '\u0087' | '\u0088' | '\u0089' | '\u008a' | '\u008b' | '\u008c' | '\u008d' | '\u008e' | '\u008f' | '\u0090' | '\u0091' | '\u0092' | '\u0093' | '\u0094' | '\u0095' | '\u0096' | '\u0097' | '\u0098' | '\u0099' | '\u009a' | '\u009b' | '\u009c' | '\u009d' | '\u009e' | '\u009f' | '\u00a0' | '¡' | '¢' | '£' | '¤' | '¥' | '¦' | '§' | '¨' | '©' | 'ª' | '«' | '¬' | '\u00ad' | '®' | '¯' | '°' | '±' | '²' | '³' | '´' | 'µ' | '¶' | '·' | '¸' | '¹' | 'º' | '»' | '¼' | '½' | '¾' | '¿' | 'À' | 'Á' | 'Â' | 'Ã' | 'Ä' | 'Å' | 'Æ' | 'Ç' | 'È' | 'É' | 'Ê' | 'Ë' | 'Ì' | 'Í' | 'Î' | 'Ï' | 'Ð' | 'Ñ' | 'Ò' | 'Ó' | 'Ô' | 'Õ' | 'Ö' | '×' | 'Ø' | 'Ù' | 'Ú' | 'Û' | 'Ü' | 'Ý' | 'Þ' | 'ß' | 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' | 'æ' | 'ç' | 'è' | 'é' | 'ê' | 'ë' | 'ì' | 'í' | 'î' | 'ï' | 'ð' | 'ñ' | 'ò' | 'ó' | 'ô') []-􏿿]))> */ nil, /* 29 escape <- <'\\'> */ func() bool { position257, tokenIndex257, depth257 := position, tokenIndex, depth { position258 := position depth++ if buffer[position] != rune('\\') { goto l257 } position++ depth-- add(ruleescape, position258) } return true l257: position, tokenIndex, depth = position257, tokenIndex257, depth257 return false }, /* 30 mlBasicString <- <('"' '"' '"' mlBasicBody ('"' '"' '"') Action18)> */ nil, /* 31 mlBasicBody <- <((<(basicChar / newline)> Action19) / (escape newline wsnl))*> */ nil, /* 32 literalString <- <('\'' '\'' Action20)> */ nil, /* 33 literalChar <- <((&('\t') '\t') | (&(' ' | '!' | '"' | '#' | '$' | '%' | '&') [ -&]) | (&('(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z' | '[' | '\\' | ']' | '^' | '_' | '`' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | '{' | '|' | '}' | '~' | '\u007f' | '\u0080' | '\u0081' | '\u0082' | '\u0083' | '\u0084' | '\u0085' | '\u0086' | '\u0087' | '\u0088' | '\u0089' | '\u008a' | '\u008b' | '\u008c' | '\u008d' | '\u008e' | '\u008f' | '\u0090' | '\u0091' | '\u0092' | '\u0093' | '\u0094' | '\u0095' | '\u0096' | '\u0097' | '\u0098' | '\u0099' | '\u009a' | '\u009b' | '\u009c' | '\u009d' | '\u009e' | '\u009f' | '\u00a0' | '¡' | '¢' | '£' | '¤' | '¥' | '¦' | '§' | '¨' | '©' | 'ª' | '«' | '¬' | '\u00ad' | '®' | '¯' | '°' | '±' | '²' | '³' | '´' | 'µ' | '¶' | '·' | '¸' | '¹' | 'º' | '»' | '¼' | '½' | '¾' | '¿' | 'À' | 'Á' | 'Â' | 'Ã' | 'Ä' | 'Å' | 'Æ' | 'Ç' | 'È' | 'É' | 'Ê' | 'Ë' | 'Ì' | 'Í' | 'Î' | 'Ï' | 'Ð' | 'Ñ' | 'Ò' | 'Ó' | 'Ô' | 'Õ' | 'Ö' | '×' | 'Ø' | 'Ù' | 'Ú' | 'Û' | 'Ü' | 'Ý' | 'Þ' | 'ß' | 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' | 'æ' | 'ç' | 'è' | 'é' | 'ê' | 'ë' | 'ì' | 'í' | 'î' | 'ï' | 'ð' | 'ñ' | 'ò' | 'ó' | 'ô') [(-􏿿]))> */ nil, /* 34 mlLiteralString <- <('\'' '\'' '\'' ('\'' '\'' '\'') Action21)> */ nil, /* 35 mlLiteralBody <- <(!('\'' '\'' '\'') (mlLiteralChar / newline))*> */ nil, /* 36 mlLiteralChar <- <('\t' / [ -􏿿])> */ nil, /* 37 hexdigit <- <((&('a' | 'b' | 'c' | 'd' | 'e' | 'f') [a-f]) | (&('A' | 'B' | 'C' | 'D' | 'E' | 'F') [A-F]) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') [0-9]))> */ func() bool { position266, tokenIndex266, depth266 := position, tokenIndex, depth { position267 := position depth++ { switch buffer[position] { case 'a', 'b', 'c', 'd', 'e', 'f': if c := buffer[position]; c < rune('a') || c > rune('f') { goto l266 } position++ break case 'A', 'B', 'C', 'D', 'E', 'F': if c := buffer[position]; c < rune('A') || c > rune('F') { goto l266 } position++ break default: if c := buffer[position]; c < rune('0') || c > rune('9') { goto l266 } position++ break } } depth-- add(rulehexdigit, position267) } return true l266: position, tokenIndex, depth = position266, tokenIndex266, depth266 return false }, /* 38 hexQuad <- <(hexdigit hexdigit hexdigit hexdigit)> */ func() bool { position269, tokenIndex269, depth269 := position, tokenIndex, depth { position270 := position depth++ if !_rules[rulehexdigit]() { goto l269 } if !_rules[rulehexdigit]() { goto l269 } if !_rules[rulehexdigit]() { goto l269 } if !_rules[rulehexdigit]() { goto l269 } depth-- add(rulehexQuad, position270) } return true l269: position, tokenIndex, depth = position269, tokenIndex269, depth269 return false }, /* 39 boolean <- <(('t' 'r' 'u' 'e') / ('f' 'a' 'l' 's' 'e'))> */ nil, /* 40 dateFullYear <- */ nil, /* 41 dateMonth <- */ nil, /* 42 dateMDay <- */ nil, /* 43 timeHour <- */ func() bool { position275, tokenIndex275, depth275 := position, tokenIndex, depth { position276 := position depth++ if !_rules[ruledigitDual]() { goto l275 } depth-- add(ruletimeHour, position276) } return true l275: position, tokenIndex, depth = position275, tokenIndex275, depth275 return false }, /* 44 timeMinute <- */ func() bool { position277, tokenIndex277, depth277 := position, tokenIndex, depth { position278 := position depth++ if !_rules[ruledigitDual]() { goto l277 } depth-- add(ruletimeMinute, position278) } return true l277: position, tokenIndex, depth = position277, tokenIndex277, depth277 return false }, /* 45 timeSecond <- */ nil, /* 46 timeSecfrac <- <('.' digit+)> */ nil, /* 47 timeNumoffset <- <(('-' / '+') timeHour ':' timeMinute)> */ nil, /* 48 timeOffset <- <('Z' / timeNumoffset)> */ nil, /* 49 partialTime <- <(timeHour ':' timeMinute ':' timeSecond timeSecfrac?)> */ nil, /* 50 fullDate <- <(dateFullYear '-' dateMonth '-' dateMDay)> */ nil, /* 51 fullTime <- <(partialTime timeOffset)> */ nil, /* 52 datetime <- <(fullDate 'T' fullTime)> */ nil, /* 53 digit <- <[0-9]> */ func() bool { position287, tokenIndex287, depth287 := position, tokenIndex, depth { position288 := position depth++ if c := buffer[position]; c < rune('0') || c > rune('9') { goto l287 } position++ depth-- add(ruledigit, position288) } return true l287: position, tokenIndex, depth = position287, tokenIndex287, depth287 return false }, /* 54 digitDual <- <(digit digit)> */ func() bool { position289, tokenIndex289, depth289 := position, tokenIndex, depth { position290 := position depth++ if !_rules[ruledigit]() { goto l289 } if !_rules[ruledigit]() { goto l289 } depth-- add(ruledigitDual, position290) } return true l289: position, tokenIndex, depth = position289, tokenIndex289, depth289 return false }, /* 55 digitQuad <- <(digitDual digitDual)> */ nil, /* 56 array <- <('[' Action22 wsnl arrayValues wsnl ']')> */ nil, /* 57 arrayValues <- <(val Action23 arraySep? (comment? newline)?)*> */ nil, /* 58 arraySep <- <(ws ',' wsnl)> */ nil, /* 60 Action0 <- <{ _ = buffer }> */ nil, nil, /* 62 Action1 <- <{ p.SetTableString(begin, end) }> */ nil, /* 63 Action2 <- <{ p.AddLineCount(end - begin) }> */ nil, /* 64 Action3 <- <{ p.AddLineCount(end - begin) }> */ nil, /* 65 Action4 <- <{ p.AddKeyValue() }> */ nil, /* 66 Action5 <- <{ p.SetKey(p.buffer, begin, end) }> */ nil, /* 67 Action6 <- <{ p.SetKey(p.buffer, begin, end) }> */ nil, /* 68 Action7 <- <{ p.SetTime(begin, end) }> */ nil, /* 69 Action8 <- <{ p.SetFloat64(begin, end) }> */ nil, /* 70 Action9 <- <{ p.SetInt64(begin, end) }> */ nil, /* 71 Action10 <- <{ p.SetString(begin, end) }> */ nil, /* 72 Action11 <- <{ p.SetBool(begin, end) }> */ nil, /* 73 Action12 <- <{ p.SetArray(begin, end) }> */ nil, /* 74 Action13 <- <{ p.SetTable(p.buffer, begin, end) }> */ nil, /* 75 Action14 <- <{ p.SetArrayTable(p.buffer, begin, end) }> */ nil, /* 76 Action15 <- <{ p.StartInlineTable() }> */ nil, /* 77 Action16 <- <{ p.EndInlineTable() }> */ nil, /* 78 Action17 <- <{ p.SetBasicString(p.buffer, begin, end) }> */ nil, /* 79 Action18 <- <{ p.SetMultilineString() }> */ nil, /* 80 Action19 <- <{ p.AddMultilineBasicBody(p.buffer, begin, end) }> */ nil, /* 81 Action20 <- <{ p.SetLiteralString(p.buffer, begin, end) }> */ nil, /* 82 Action21 <- <{ p.SetMultilineLiteralString(p.buffer, begin, end) }> */ nil, /* 83 Action22 <- <{ p.StartArray() }> */ nil, /* 84 Action23 <- <{ p.AddArrayVal() }> */ nil, } p.rules = _rules }