blob: c80a7dcab225e7f44deef6eceb48675414afa0a7 [file] [log] [blame]
package main
import (
"fmt"
"math"
"sort"
"strconv"
)
const endSymbol rune = 1114112
/* The rule types inferred from the grammar are below. */
type pegRule uint8
const (
ruleUnknown pegRule = iota
ruleStatement
ruleAssignment
ruleVariable
ruleExpression
ruleStringLiteral
ruleQuotedText
ruleEscapedChar
ruleIndexing
ruleIndex
ruleSearch
ruleAction
ruleCommand
ruleFunction
ruleArgs
ruleQuery
ruleConjunctions
ruleConjunction
ruleField
ruleRelation
ruleWS
)
var rul3s = [...]string{
"Unknown",
"Statement",
"Assignment",
"Variable",
"Expression",
"StringLiteral",
"QuotedText",
"EscapedChar",
"Indexing",
"Index",
"Search",
"Action",
"Command",
"Function",
"Args",
"Query",
"Conjunctions",
"Conjunction",
"Field",
"Relation",
"WS",
}
type token32 struct {
pegRule
begin, end uint32
}
func (t *token32) String() string {
return fmt.Sprintf("\x1B[34m%v\x1B[m %v %v", rul3s[t.pegRule], t.begin, t.end)
}
type node32 struct {
token32
up, next *node32
}
func (node *node32) print(pretty bool, buffer string) {
var print func(node *node32, depth int)
print = func(node *node32, depth int) {
for node != nil {
for c := 0; c < depth; c++ {
fmt.Printf(" ")
}
rule := rul3s[node.pegRule]
quote := strconv.Quote(string(([]rune(buffer)[node.begin:node.end])))
if !pretty {
fmt.Printf("%v %v\n", rule, quote)
} else {
fmt.Printf("\x1B[34m%v\x1B[m %v\n", rule, quote)
}
if node.up != nil {
print(node.up, depth+1)
}
node = node.next
}
}
print(node, 0)
}
func (node *node32) Print(buffer string) {
node.print(false, buffer)
}
func (node *node32) PrettyPrint(buffer string) {
node.print(true, buffer)
}
type tokens32 struct {
tree []token32
}
func (t *tokens32) Trim(length uint32) {
t.tree = t.tree[:length]
}
func (t *tokens32) Print() {
for _, token := range t.tree {
fmt.Println(token.String())
}
}
func (t *tokens32) AST() *node32 {
type element struct {
node *node32
down *element
}
tokens := t.Tokens()
var stack *element
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}
}
if stack != nil {
return stack.node
}
return nil
}
func (t *tokens32) PrintSyntaxTree(buffer string) {
t.AST().Print(buffer)
}
func (t *tokens32) PrettyPrintSyntaxTree(buffer string) {
t.AST().PrettyPrint(buffer)
}
func (t *tokens32) Add(rule pegRule, begin, end, index uint32) {
if tree := t.tree; int(index) >= len(tree) {
expanded := make([]token32, 2*len(tree))
copy(expanded, tree)
t.tree = expanded
}
t.tree[index] = token32{
pegRule: rule,
begin: begin,
end: end,
}
}
func (t *tokens32) Tokens() []token32 {
return t.tree
}
type Statement struct {
Buffer string
buffer []rune
rules [21]func() bool
parse func(rule ...int) error
reset func()
Pretty bool
tokens32
}
func (p *Statement) Parse(rule ...int) error {
return p.parse(rule...)
}
func (p *Statement) Reset() {
p.reset()
}
type textPosition struct {
line, symbol int
}
type textPositionMap map[int]textPosition
func translatePositions(buffer []rune, 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 {
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 *Statement
max token32
}
func (e *parseError) Error() string {
tokens, error := []token32{e.max}, "\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)
format := "parse error near %v (line %v symbol %v - line %v symbol %v):\n%v\n"
if e.p.Pretty {
format = "parse error near \x1B[34m%v\x1B[m (line %v symbol %v - line %v symbol %v):\n%v\n"
}
for _, token := range tokens {
begin, end := int(token.begin), int(token.end)
error += fmt.Sprintf(format,
rul3s[token.pegRule],
translations[begin].line, translations[begin].symbol,
translations[end].line, translations[end].symbol,
strconv.Quote(string(e.p.buffer[begin:end])))
}
return error
}
func (p *Statement) PrintSyntaxTree() {
if p.Pretty {
p.tokens32.PrettyPrintSyntaxTree(p.Buffer)
} else {
p.tokens32.PrintSyntaxTree(p.Buffer)
}
}
func (p *Statement) Init() {
var (
max token32
position, tokenIndex uint32
buffer []rune
)
p.reset = func() {
max = token32{}
position, tokenIndex = 0, 0
p.buffer = []rune(p.Buffer)
if len(p.buffer) == 0 || p.buffer[len(p.buffer)-1] != endSymbol {
p.buffer = append(p.buffer, endSymbol)
}
buffer = p.buffer
}
p.reset()
_rules := p.rules
tree := tokens32{tree: make([]token32, math.MaxInt16)}
p.parse = func(rule ...int) error {
r := 1
if len(rule) > 0 {
r = rule[0]
}
matches := p.rules[r]()
p.tokens32 = tree
if matches {
p.Trim(tokenIndex)
return nil
}
return &parseError{p, max}
}
add := func(rule pegRule, begin uint32) {
tree.Add(rule, begin, position, tokenIndex)
tokenIndex++
if begin != position && position > max.end {
max = token32{rule, begin, position}
}
}
matchDot := func() bool {
if buffer[position] != endSymbol {
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 Statement <- <(WS? (Assignment / Action / Expression) WS? !.)> */
func() bool {
position0, tokenIndex0 := position, tokenIndex
{
position1 := position
{
position2, tokenIndex2 := position, tokenIndex
if !_rules[ruleWS]() {
goto l2
}
goto l3
l2:
position, tokenIndex = position2, tokenIndex2
}
l3:
{
position4, tokenIndex4 := position, tokenIndex
if !_rules[ruleAssignment]() {
goto l5
}
goto l4
l5:
position, tokenIndex = position4, tokenIndex4
if !_rules[ruleAction]() {
goto l6
}
goto l4
l6:
position, tokenIndex = position4, tokenIndex4
if !_rules[ruleExpression]() {
goto l0
}
}
l4:
{
position7, tokenIndex7 := position, tokenIndex
if !_rules[ruleWS]() {
goto l7
}
goto l8
l7:
position, tokenIndex = position7, tokenIndex7
}
l8:
{
position9, tokenIndex9 := position, tokenIndex
if !matchDot() {
goto l9
}
goto l0
l9:
position, tokenIndex = position9, tokenIndex9
}
add(ruleStatement, position1)
}
return true
l0:
position, tokenIndex = position0, tokenIndex0
return false
},
/* 1 Assignment <- <(Variable WS? '=' WS? Expression)> */
func() bool {
position10, tokenIndex10 := position, tokenIndex
{
position11 := position
if !_rules[ruleVariable]() {
goto l10
}
{
position12, tokenIndex12 := position, tokenIndex
if !_rules[ruleWS]() {
goto l12
}
goto l13
l12:
position, tokenIndex = position12, tokenIndex12
}
l13:
if buffer[position] != rune('=') {
goto l10
}
position++
{
position14, tokenIndex14 := position, tokenIndex
if !_rules[ruleWS]() {
goto l14
}
goto l15
l14:
position, tokenIndex = position14, tokenIndex14
}
l15:
if !_rules[ruleExpression]() {
goto l10
}
add(ruleAssignment, position11)
}
return true
l10:
position, tokenIndex = position10, tokenIndex10
return false
},
/* 2 Variable <- <(([a-z] / [A-Z] / '_') ([a-z] / [A-Z] / [0-9] / '_')*)> */
func() bool {
position16, tokenIndex16 := position, tokenIndex
{
position17 := position
{
position18, tokenIndex18 := position, tokenIndex
if c := buffer[position]; c < rune('a') || c > rune('z') {
goto l19
}
position++
goto l18
l19:
position, tokenIndex = position18, tokenIndex18
if c := buffer[position]; c < rune('A') || c > rune('Z') {
goto l20
}
position++
goto l18
l20:
position, tokenIndex = position18, tokenIndex18
if buffer[position] != rune('_') {
goto l16
}
position++
}
l18:
l21:
{
position22, tokenIndex22 := position, tokenIndex
{
position23, tokenIndex23 := position, tokenIndex
if c := buffer[position]; c < rune('a') || c > rune('z') {
goto l24
}
position++
goto l23
l24:
position, tokenIndex = position23, tokenIndex23
if c := buffer[position]; c < rune('A') || c > rune('Z') {
goto l25
}
position++
goto l23
l25:
position, tokenIndex = position23, tokenIndex23
if c := buffer[position]; c < rune('0') || c > rune('9') {
goto l26
}
position++
goto l23
l26:
position, tokenIndex = position23, tokenIndex23
if buffer[position] != rune('_') {
goto l22
}
position++
}
l23:
goto l21
l22:
position, tokenIndex = position22, tokenIndex22
}
add(ruleVariable, position17)
}
return true
l16:
position, tokenIndex = position16, tokenIndex16
return false
},
/* 3 Expression <- <(StringLiteral / Indexing / Search / Variable)> */
func() bool {
position27, tokenIndex27 := position, tokenIndex
{
position28 := position
{
position29, tokenIndex29 := position, tokenIndex
if !_rules[ruleStringLiteral]() {
goto l30
}
goto l29
l30:
position, tokenIndex = position29, tokenIndex29
if !_rules[ruleIndexing]() {
goto l31
}
goto l29
l31:
position, tokenIndex = position29, tokenIndex29
if !_rules[ruleSearch]() {
goto l32
}
goto l29
l32:
position, tokenIndex = position29, tokenIndex29
if !_rules[ruleVariable]() {
goto l27
}
}
l29:
add(ruleExpression, position28)
}
return true
l27:
position, tokenIndex = position27, tokenIndex27
return false
},
/* 4 StringLiteral <- <('"' QuotedText '"')> */
func() bool {
position33, tokenIndex33 := position, tokenIndex
{
position34 := position
if buffer[position] != rune('"') {
goto l33
}
position++
if !_rules[ruleQuotedText]() {
goto l33
}
if buffer[position] != rune('"') {
goto l33
}
position++
add(ruleStringLiteral, position34)
}
return true
l33:
position, tokenIndex = position33, tokenIndex33
return false
},
/* 5 QuotedText <- <(EscapedChar / (!('\\' / '"') .))*> */
func() bool {
{
position36 := position
l37:
{
position38, tokenIndex38 := position, tokenIndex
{
position39, tokenIndex39 := position, tokenIndex
if !_rules[ruleEscapedChar]() {
goto l40
}
goto l39
l40:
position, tokenIndex = position39, tokenIndex39
{
position41, tokenIndex41 := position, tokenIndex
{
position42, tokenIndex42 := position, tokenIndex
if buffer[position] != rune('\\') {
goto l43
}
position++
goto l42
l43:
position, tokenIndex = position42, tokenIndex42
if buffer[position] != rune('"') {
goto l41
}
position++
}
l42:
goto l38
l41:
position, tokenIndex = position41, tokenIndex41
}
if !matchDot() {
goto l38
}
}
l39:
goto l37
l38:
position, tokenIndex = position38, tokenIndex38
}
add(ruleQuotedText, position36)
}
return true
},
/* 6 EscapedChar <- <('\\' ('\\' / 'n' / '"'))> */
func() bool {
position44, tokenIndex44 := position, tokenIndex
{
position45 := position
if buffer[position] != rune('\\') {
goto l44
}
position++
{
position46, tokenIndex46 := position, tokenIndex
if buffer[position] != rune('\\') {
goto l47
}
position++
goto l46
l47:
position, tokenIndex = position46, tokenIndex46
if buffer[position] != rune('n') {
goto l48
}
position++
goto l46
l48:
position, tokenIndex = position46, tokenIndex46
if buffer[position] != rune('"') {
goto l44
}
position++
}
l46:
add(ruleEscapedChar, position45)
}
return true
l44:
position, tokenIndex = position44, tokenIndex44
return false
},
/* 7 Indexing <- <(Variable ('[' Index ']')+)> */
func() bool {
position49, tokenIndex49 := position, tokenIndex
{
position50 := position
if !_rules[ruleVariable]() {
goto l49
}
if buffer[position] != rune('[') {
goto l49
}
position++
if !_rules[ruleIndex]() {
goto l49
}
if buffer[position] != rune(']') {
goto l49
}
position++
l51:
{
position52, tokenIndex52 := position, tokenIndex
if buffer[position] != rune('[') {
goto l52
}
position++
if !_rules[ruleIndex]() {
goto l52
}
if buffer[position] != rune(']') {
goto l52
}
position++
goto l51
l52:
position, tokenIndex = position52, tokenIndex52
}
add(ruleIndexing, position50)
}
return true
l49:
position, tokenIndex = position49, tokenIndex49
return false
},
/* 8 Index <- <([0-9] / [a-z])+> */
func() bool {
position53, tokenIndex53 := position, tokenIndex
{
position54 := position
{
position57, tokenIndex57 := position, tokenIndex
if c := buffer[position]; c < rune('0') || c > rune('9') {
goto l58
}
position++
goto l57
l58:
position, tokenIndex = position57, tokenIndex57
if c := buffer[position]; c < rune('a') || c > rune('z') {
goto l53
}
position++
}
l57:
l55:
{
position56, tokenIndex56 := position, tokenIndex
{
position59, tokenIndex59 := position, tokenIndex
if c := buffer[position]; c < rune('0') || c > rune('9') {
goto l60
}
position++
goto l59
l60:
position, tokenIndex = position59, tokenIndex59
if c := buffer[position]; c < rune('a') || c > rune('z') {
goto l56
}
position++
}
l59:
goto l55
l56:
position, tokenIndex = position56, tokenIndex56
}
add(ruleIndex, position54)
}
return true
l53:
position, tokenIndex = position53, tokenIndex53
return false
},
/* 9 Search <- <(Variable '[' WS? ('w' 'h' 'e' 'r' 'e') WS Query ']')> */
func() bool {
position61, tokenIndex61 := position, tokenIndex
{
position62 := position
if !_rules[ruleVariable]() {
goto l61
}
if buffer[position] != rune('[') {
goto l61
}
position++
{
position63, tokenIndex63 := position, tokenIndex
if !_rules[ruleWS]() {
goto l63
}
goto l64
l63:
position, tokenIndex = position63, tokenIndex63
}
l64:
if buffer[position] != rune('w') {
goto l61
}
position++
if buffer[position] != rune('h') {
goto l61
}
position++
if buffer[position] != rune('e') {
goto l61
}
position++
if buffer[position] != rune('r') {
goto l61
}
position++
if buffer[position] != rune('e') {
goto l61
}
position++
if !_rules[ruleWS]() {
goto l61
}
if !_rules[ruleQuery]() {
goto l61
}
if buffer[position] != rune(']') {
goto l61
}
position++
add(ruleSearch, position62)
}
return true
l61:
position, tokenIndex = position61, tokenIndex61
return false
},
/* 10 Action <- <(Expression '.' Command)> */
func() bool {
position65, tokenIndex65 := position, tokenIndex
{
position66 := position
if !_rules[ruleExpression]() {
goto l65
}
if buffer[position] != rune('.') {
goto l65
}
position++
if !_rules[ruleCommand]() {
goto l65
}
add(ruleAction, position66)
}
return true
l65:
position, tokenIndex = position65, tokenIndex65
return false
},
/* 11 Command <- <(Function '(' Args? ')')> */
func() bool {
position67, tokenIndex67 := position, tokenIndex
{
position68 := position
if !_rules[ruleFunction]() {
goto l67
}
if buffer[position] != rune('(') {
goto l67
}
position++
{
position69, tokenIndex69 := position, tokenIndex
if !_rules[ruleArgs]() {
goto l69
}
goto l70
l69:
position, tokenIndex = position69, tokenIndex69
}
l70:
if buffer[position] != rune(')') {
goto l67
}
position++
add(ruleCommand, position68)
}
return true
l67:
position, tokenIndex = position67, tokenIndex67
return false
},
/* 12 Function <- <([a-z] / [A-Z])+> */
func() bool {
position71, tokenIndex71 := position, tokenIndex
{
position72 := position
{
position75, tokenIndex75 := position, tokenIndex
if c := buffer[position]; c < rune('a') || c > rune('z') {
goto l76
}
position++
goto l75
l76:
position, tokenIndex = position75, tokenIndex75
if c := buffer[position]; c < rune('A') || c > rune('Z') {
goto l71
}
position++
}
l75:
l73:
{
position74, tokenIndex74 := position, tokenIndex
{
position77, tokenIndex77 := position, tokenIndex
if c := buffer[position]; c < rune('a') || c > rune('z') {
goto l78
}
position++
goto l77
l78:
position, tokenIndex = position77, tokenIndex77
if c := buffer[position]; c < rune('A') || c > rune('Z') {
goto l74
}
position++
}
l77:
goto l73
l74:
position, tokenIndex = position74, tokenIndex74
}
add(ruleFunction, position72)
}
return true
l71:
position, tokenIndex = position71, tokenIndex71
return false
},
/* 13 Args <- <(StringLiteral (WS? ',' WS? Args))> */
func() bool {
position79, tokenIndex79 := position, tokenIndex
{
position80 := position
if !_rules[ruleStringLiteral]() {
goto l79
}
{
position81, tokenIndex81 := position, tokenIndex
if !_rules[ruleWS]() {
goto l81
}
goto l82
l81:
position, tokenIndex = position81, tokenIndex81
}
l82:
if buffer[position] != rune(',') {
goto l79
}
position++
{
position83, tokenIndex83 := position, tokenIndex
if !_rules[ruleWS]() {
goto l83
}
goto l84
l83:
position, tokenIndex = position83, tokenIndex83
}
l84:
if !_rules[ruleArgs]() {
goto l79
}
add(ruleArgs, position80)
}
return true
l79:
position, tokenIndex = position79, tokenIndex79
return false
},
/* 14 Query <- <(Conjunctions (WS? ('|' '|') WS? Conjunctions)?)> */
func() bool {
position85, tokenIndex85 := position, tokenIndex
{
position86 := position
if !_rules[ruleConjunctions]() {
goto l85
}
{
position87, tokenIndex87 := position, tokenIndex
{
position89, tokenIndex89 := position, tokenIndex
if !_rules[ruleWS]() {
goto l89
}
goto l90
l89:
position, tokenIndex = position89, tokenIndex89
}
l90:
if buffer[position] != rune('|') {
goto l87
}
position++
if buffer[position] != rune('|') {
goto l87
}
position++
{
position91, tokenIndex91 := position, tokenIndex
if !_rules[ruleWS]() {
goto l91
}
goto l92
l91:
position, tokenIndex = position91, tokenIndex91
}
l92:
if !_rules[ruleConjunctions]() {
goto l87
}
goto l88
l87:
position, tokenIndex = position87, tokenIndex87
}
l88:
add(ruleQuery, position86)
}
return true
l85:
position, tokenIndex = position85, tokenIndex85
return false
},
/* 15 Conjunctions <- <(Conjunction (WS? ('&' '&') WS? Conjunctions)?)> */
func() bool {
position93, tokenIndex93 := position, tokenIndex
{
position94 := position
if !_rules[ruleConjunction]() {
goto l93
}
{
position95, tokenIndex95 := position, tokenIndex
{
position97, tokenIndex97 := position, tokenIndex
if !_rules[ruleWS]() {
goto l97
}
goto l98
l97:
position, tokenIndex = position97, tokenIndex97
}
l98:
if buffer[position] != rune('&') {
goto l95
}
position++
if buffer[position] != rune('&') {
goto l95
}
position++
{
position99, tokenIndex99 := position, tokenIndex
if !_rules[ruleWS]() {
goto l99
}
goto l100
l99:
position, tokenIndex = position99, tokenIndex99
}
l100:
if !_rules[ruleConjunctions]() {
goto l95
}
goto l96
l95:
position, tokenIndex = position95, tokenIndex95
}
l96:
add(ruleConjunctions, position94)
}
return true
l93:
position, tokenIndex = position93, tokenIndex93
return false
},
/* 16 Conjunction <- <(Field WS? Relation WS? StringLiteral)> */
func() bool {
position101, tokenIndex101 := position, tokenIndex
{
position102 := position
if !_rules[ruleField]() {
goto l101
}
{
position103, tokenIndex103 := position, tokenIndex
if !_rules[ruleWS]() {
goto l103
}
goto l104
l103:
position, tokenIndex = position103, tokenIndex103
}
l104:
if !_rules[ruleRelation]() {
goto l101
}
{
position105, tokenIndex105 := position, tokenIndex
if !_rules[ruleWS]() {
goto l105
}
goto l106
l105:
position, tokenIndex = position105, tokenIndex105
}
l106:
if !_rules[ruleStringLiteral]() {
goto l101
}
add(ruleConjunction, position102)
}
return true
l101:
position, tokenIndex = position101, tokenIndex101
return false
},
/* 17 Field <- <([a-z] ([a-z] / [A-Z] / [0-9])*)> */
func() bool {
position107, tokenIndex107 := position, tokenIndex
{
position108 := position
if c := buffer[position]; c < rune('a') || c > rune('z') {
goto l107
}
position++
l109:
{
position110, tokenIndex110 := position, tokenIndex
{
position111, tokenIndex111 := position, tokenIndex
if c := buffer[position]; c < rune('a') || c > rune('z') {
goto l112
}
position++
goto l111
l112:
position, tokenIndex = position111, tokenIndex111
if c := buffer[position]; c < rune('A') || c > rune('Z') {
goto l113
}
position++
goto l111
l113:
position, tokenIndex = position111, tokenIndex111
if c := buffer[position]; c < rune('0') || c > rune('9') {
goto l110
}
position++
}
l111:
goto l109
l110:
position, tokenIndex = position110, tokenIndex110
}
add(ruleField, position108)
}
return true
l107:
position, tokenIndex = position107, tokenIndex107
return false
},
/* 18 Relation <- <(('=' '=') / ('!' '=') / ('c' 'o' 'n' 't' 'a' 'i' 'n' 's') / ('s' 't' 'a' 'r' 't' 's' 'W' 'i' 't' 'h') / ('e' 'n' 'd' 's' 'W' 'i' 't' 'h'))> */
func() bool {
position114, tokenIndex114 := position, tokenIndex
{
position115 := position
{
position116, tokenIndex116 := position, tokenIndex
if buffer[position] != rune('=') {
goto l117
}
position++
if buffer[position] != rune('=') {
goto l117
}
position++
goto l116
l117:
position, tokenIndex = position116, tokenIndex116
if buffer[position] != rune('!') {
goto l118
}
position++
if buffer[position] != rune('=') {
goto l118
}
position++
goto l116
l118:
position, tokenIndex = position116, tokenIndex116
if buffer[position] != rune('c') {
goto l119
}
position++
if buffer[position] != rune('o') {
goto l119
}
position++
if buffer[position] != rune('n') {
goto l119
}
position++
if buffer[position] != rune('t') {
goto l119
}
position++
if buffer[position] != rune('a') {
goto l119
}
position++
if buffer[position] != rune('i') {
goto l119
}
position++
if buffer[position] != rune('n') {
goto l119
}
position++
if buffer[position] != rune('s') {
goto l119
}
position++
goto l116
l119:
position, tokenIndex = position116, tokenIndex116
if buffer[position] != rune('s') {
goto l120
}
position++
if buffer[position] != rune('t') {
goto l120
}
position++
if buffer[position] != rune('a') {
goto l120
}
position++
if buffer[position] != rune('r') {
goto l120
}
position++
if buffer[position] != rune('t') {
goto l120
}
position++
if buffer[position] != rune('s') {
goto l120
}
position++
if buffer[position] != rune('W') {
goto l120
}
position++
if buffer[position] != rune('i') {
goto l120
}
position++
if buffer[position] != rune('t') {
goto l120
}
position++
if buffer[position] != rune('h') {
goto l120
}
position++
goto l116
l120:
position, tokenIndex = position116, tokenIndex116
if buffer[position] != rune('e') {
goto l114
}
position++
if buffer[position] != rune('n') {
goto l114
}
position++
if buffer[position] != rune('d') {
goto l114
}
position++
if buffer[position] != rune('s') {
goto l114
}
position++
if buffer[position] != rune('W') {
goto l114
}
position++
if buffer[position] != rune('i') {
goto l114
}
position++
if buffer[position] != rune('t') {
goto l114
}
position++
if buffer[position] != rune('h') {
goto l114
}
position++
}
l116:
add(ruleRelation, position115)
}
return true
l114:
position, tokenIndex = position114, tokenIndex114
return false
},
/* 19 WS <- <(' ' / '\t')+> */
func() bool {
position121, tokenIndex121 := position, tokenIndex
{
position122 := position
{
position125, tokenIndex125 := position, tokenIndex
if buffer[position] != rune(' ') {
goto l126
}
position++
goto l125
l126:
position, tokenIndex = position125, tokenIndex125
if buffer[position] != rune('\t') {
goto l121
}
position++
}
l125:
l123:
{
position124, tokenIndex124 := position, tokenIndex
{
position127, tokenIndex127 := position, tokenIndex
if buffer[position] != rune(' ') {
goto l128
}
position++
goto l127
l128:
position, tokenIndex = position127, tokenIndex127
if buffer[position] != rune('\t') {
goto l124
}
position++
}
l127:
goto l123
l124:
position, tokenIndex = position124, tokenIndex124
}
add(ruleWS, position122)
}
return true
l121:
position, tokenIndex = position121, tokenIndex121
return false
},
}
p.rules = _rules
}