shithub: tlsclient

ref: 98c1cd7ae022efe276123898af6b892eade0732c
dir: /third_party/boringssl/src/util/fipstools/acvp/acvptool/parser.peg.go/

View raw version
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
}