// Code generated by pigeon; DO NOT EDIT.

package parser

import (
	"bytes"
	"errors"
	"fmt"
	"io"
	"io/ioutil"
	"math"
	"os"
	"sort"
	"strings"
	"unicode"
	"unicode/utf8"
)

// DO NOT EDIT: This file is auto generated by the pigeon PEG parser generator.

var g = &grammar{
	rules: []*rule{
		{
			name: "Start",
			pos:  position{line: 8, col: 1, offset: 102},
			expr: &actionExpr{
				pos: position{line: 9, col: 5, offset: 112},
				run: (*parser).callonStart1,
				expr: &seqExpr{
					pos: position{line: 9, col: 5, offset: 112},
					exprs: []interface{}{
						&ruleRefExpr{
							pos:  position{line: 9, col: 5, offset: 112},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 9, col: 8, offset: 115},
							label: "program",
							expr: &ruleRefExpr{
								pos:  position{line: 9, col: 16, offset: 123},
								name: "Program",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 9, col: 24, offset: 131},
							name: "__",
						},
						&ruleRefExpr{
							pos:  position{line: 9, col: 27, offset: 134},
							name: "EOF",
						},
					},
				},
			},
		},
		{
			name: "Program",
			pos:  position{line: 13, col: 1, offset: 173},
			expr: &actionExpr{
				pos: position{line: 14, col: 5, offset: 185},
				run: (*parser).callonProgram1,
				expr: &labeledExpr{
					pos:   position{line: 14, col: 5, offset: 185},
					label: "body",
					expr: &ruleRefExpr{
						pos:  position{line: 14, col: 10, offset: 190},
						name: "SourceElements",
					},
				},
			},
		},
		{
			name: "SourceElements",
			pos:  position{line: 18, col: 1, offset: 256},
			expr: &actionExpr{
				pos: position{line: 19, col: 5, offset: 275},
				run: (*parser).callonSourceElements1,
				expr: &seqExpr{
					pos: position{line: 19, col: 5, offset: 275},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 19, col: 5, offset: 275},
							label: "head",
							expr: &ruleRefExpr{
								pos:  position{line: 19, col: 10, offset: 280},
								name: "SourceElement",
							},
						},
						&labeledExpr{
							pos:   position{line: 19, col: 24, offset: 294},
							label: "tail",
							expr: &zeroOrMoreExpr{
								pos: position{line: 19, col: 29, offset: 299},
								expr: &seqExpr{
									pos: position{line: 19, col: 30, offset: 300},
									exprs: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 19, col: 30, offset: 300},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 19, col: 33, offset: 303},
											name: "SourceElement",
										},
										&ruleRefExpr{
											pos:  position{line: 19, col: 47, offset: 317},
											name: "__",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "SourceElement",
			pos:  position{line: 23, col: 1, offset: 365},
			expr: &ruleRefExpr{
				pos:  position{line: 24, col: 5, offset: 383},
				name: "Statement",
			},
		},
		{
			name: "Statement",
			pos:  position{line: 26, col: 1, offset: 394},
			expr: &choiceExpr{
				pos: position{line: 27, col: 5, offset: 408},
				alternatives: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 27, col: 5, offset: 408},
						name: "VariableStatement",
					},
					&ruleRefExpr{
						pos:  position{line: 28, col: 5, offset: 430},
						name: "OptionStatement",
					},
					&ruleRefExpr{
						pos:  position{line: 29, col: 5, offset: 450},
						name: "ReturnStatement",
					},
					&ruleRefExpr{
						pos:  position{line: 30, col: 5, offset: 470},
						name: "ExpressionStatement",
					},
					&ruleRefExpr{
						pos:  position{line: 31, col: 5, offset: 494},
						name: "BlockStatement",
					},
				},
			},
		},
		{
			name: "OptionStatement",
			pos:  position{line: 34, col: 1, offset: 511},
			expr: &actionExpr{
				pos: position{line: 35, col: 5, offset: 531},
				run: (*parser).callonOptionStatement1,
				expr: &seqExpr{
					pos: position{line: 35, col: 5, offset: 531},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 35, col: 5, offset: 531},
							val:        "option",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 35, col: 14, offset: 540},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 35, col: 17, offset: 543},
							label: "id",
							expr: &ruleRefExpr{
								pos:  position{line: 35, col: 20, offset: 546},
								name: "Identifier",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 35, col: 31, offset: 557},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 35, col: 34, offset: 560},
							val:        "=",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 35, col: 38, offset: 564},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 35, col: 41, offset: 567},
							label: "expr",
							expr: &ruleRefExpr{
								pos:  position{line: 35, col: 46, offset: 572},
								name: "Expr",
							},
						},
					},
				},
			},
		},
		{
			name: "VariableStatement",
			pos:  position{line: 39, col: 1, offset: 631},
			expr: &actionExpr{
				pos: position{line: 40, col: 5, offset: 653},
				run: (*parser).callonVariableStatement1,
				expr: &labeledExpr{
					pos:   position{line: 40, col: 5, offset: 653},
					label: "declaration",
					expr: &ruleRefExpr{
						pos:  position{line: 40, col: 17, offset: 665},
						name: "VariableDeclaration",
					},
				},
			},
		},
		{
			name: "ReturnStatement",
			pos:  position{line: 44, col: 1, offset: 744},
			expr: &actionExpr{
				pos: position{line: 45, col: 5, offset: 764},
				run: (*parser).callonReturnStatement1,
				expr: &seqExpr{
					pos: position{line: 45, col: 5, offset: 764},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 45, col: 5, offset: 764},
							val:        "return",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 45, col: 14, offset: 773},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 45, col: 17, offset: 776},
							label: "argument",
							expr: &ruleRefExpr{
								pos:  position{line: 45, col: 26, offset: 785},
								name: "Expr",
							},
						},
					},
				},
			},
		},
		{
			name: "ExpressionStatement",
			pos:  position{line: 49, col: 1, offset: 848},
			expr: &actionExpr{
				pos: position{line: 50, col: 5, offset: 872},
				run: (*parser).callonExpressionStatement1,
				expr: &labeledExpr{
					pos:   position{line: 50, col: 5, offset: 872},
					label: "expr",
					expr: &ruleRefExpr{
						pos:  position{line: 50, col: 10, offset: 877},
						name: "Expr",
					},
				},
			},
		},
		{
			name: "BlockStatement",
			pos:  position{line: 54, col: 1, offset: 936},
			expr: &actionExpr{
				pos: position{line: 55, col: 5, offset: 955},
				run: (*parser).callonBlockStatement1,
				expr: &seqExpr{
					pos: position{line: 55, col: 5, offset: 955},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 55, col: 5, offset: 955},
							val:        "{",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 55, col: 9, offset: 959},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 55, col: 12, offset: 962},
							label: "body",
							expr: &zeroOrMoreExpr{
								pos: position{line: 55, col: 17, offset: 967},
								expr: &seqExpr{
									pos: position{line: 55, col: 19, offset: 969},
									exprs: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 55, col: 19, offset: 969},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 55, col: 22, offset: 972},
											name: "Statement",
										},
										&ruleRefExpr{
											pos:  position{line: 55, col: 32, offset: 982},
											name: "__",
										},
									},
								},
							},
						},
						&ruleRefExpr{
							pos:  position{line: 55, col: 38, offset: 988},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 55, col: 41, offset: 991},
							val:        "}",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "VariableDeclaration",
			pos:  position{line: 59, col: 1, offset: 1048},
			expr: &actionExpr{
				pos: position{line: 60, col: 5, offset: 1072},
				run: (*parser).callonVariableDeclaration1,
				expr: &seqExpr{
					pos: position{line: 60, col: 5, offset: 1072},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 60, col: 5, offset: 1072},
							label: "id",
							expr: &ruleRefExpr{
								pos:  position{line: 60, col: 8, offset: 1075},
								name: "Identifier",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 60, col: 19, offset: 1086},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 60, col: 22, offset: 1089},
							val:        "=",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 60, col: 26, offset: 1093},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 60, col: 29, offset: 1096},
							label: "init",
							expr: &ruleRefExpr{
								pos:  position{line: 60, col: 34, offset: 1101},
								name: "Expr",
							},
						},
					},
				},
			},
		},
		{
			name: "MemberExpressions",
			pos:  position{line: 65, col: 1, offset: 1162},
			expr: &actionExpr{
				pos: position{line: 66, col: 5, offset: 1184},
				run: (*parser).callonMemberExpressions1,
				expr: &seqExpr{
					pos: position{line: 66, col: 5, offset: 1184},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 66, col: 5, offset: 1184},
							label: "head",
							expr: &ruleRefExpr{
								pos:  position{line: 66, col: 10, offset: 1189},
								name: "Identifier",
							},
						},
						&labeledExpr{
							pos:   position{line: 67, col: 5, offset: 1231},
							label: "tail",
							expr: &zeroOrMoreExpr{
								pos: position{line: 67, col: 10, offset: 1236},
								expr: &actionExpr{
									pos: position{line: 68, col: 10, offset: 1247},
									run: (*parser).callonMemberExpressions7,
									expr: &seqExpr{
										pos: position{line: 68, col: 10, offset: 1247},
										exprs: []interface{}{
											&ruleRefExpr{
												pos:  position{line: 68, col: 10, offset: 1247},
												name: "__",
											},
											&labeledExpr{
												pos:   position{line: 68, col: 13, offset: 1250},
												label: "property",
												expr: &ruleRefExpr{
													pos:  position{line: 68, col: 22, offset: 1259},
													name: "MemberExpressionProperty",
												},
											},
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "MemberExpressionProperty",
			pos:  position{line: 76, col: 1, offset: 1399},
			expr: &choiceExpr{
				pos: position{line: 77, col: 5, offset: 1428},
				alternatives: []interface{}{
					&actionExpr{
						pos: position{line: 77, col: 5, offset: 1428},
						run: (*parser).callonMemberExpressionProperty2,
						expr: &seqExpr{
							pos: position{line: 77, col: 5, offset: 1428},
							exprs: []interface{}{
								&litMatcher{
									pos:        position{line: 77, col: 5, offset: 1428},
									val:        ".",
									ignoreCase: false,
								},
								&labeledExpr{
									pos:   position{line: 77, col: 9, offset: 1432},
									label: "property",
									expr: &ruleRefExpr{
										pos:  position{line: 77, col: 18, offset: 1441},
										name: "Identifier",
									},
								},
							},
						},
					},
					&actionExpr{
						pos: position{line: 80, col: 7, offset: 1514},
						run: (*parser).callonMemberExpressionProperty7,
						expr: &seqExpr{
							pos: position{line: 80, col: 7, offset: 1514},
							exprs: []interface{}{
								&litMatcher{
									pos:        position{line: 80, col: 7, offset: 1514},
									val:        "[",
									ignoreCase: false,
								},
								&ruleRefExpr{
									pos:  position{line: 80, col: 11, offset: 1518},
									name: "__",
								},
								&labeledExpr{
									pos:   position{line: 80, col: 14, offset: 1521},
									label: "property",
									expr: &ruleRefExpr{
										pos:  position{line: 80, col: 23, offset: 1530},
										name: "StringLiteral",
									},
								},
								&ruleRefExpr{
									pos:  position{line: 80, col: 37, offset: 1544},
									name: "__",
								},
								&litMatcher{
									pos:        position{line: 80, col: 40, offset: 1547},
									val:        "]",
									ignoreCase: false,
								},
							},
						},
					},
					&actionExpr{
						pos: position{line: 83, col: 7, offset: 1616},
						run: (*parser).callonMemberExpressionProperty15,
						expr: &seqExpr{
							pos: position{line: 83, col: 7, offset: 1616},
							exprs: []interface{}{
								&litMatcher{
									pos:        position{line: 83, col: 7, offset: 1616},
									val:        "[",
									ignoreCase: false,
								},
								&ruleRefExpr{
									pos:  position{line: 83, col: 11, offset: 1620},
									name: "__",
								},
								&labeledExpr{
									pos:   position{line: 83, col: 14, offset: 1623},
									label: "property",
									expr: &ruleRefExpr{
										pos:  position{line: 83, col: 23, offset: 1632},
										name: "Primary",
									},
								},
								&ruleRefExpr{
									pos:  position{line: 83, col: 31, offset: 1640},
									name: "__",
								},
								&litMatcher{
									pos:        position{line: 83, col: 34, offset: 1643},
									val:        "]",
									ignoreCase: false,
								},
							},
						},
					},
				},
			},
		},
		{
			name: "CallExpression",
			pos:  position{line: 87, col: 1, offset: 1689},
			expr: &actionExpr{
				pos: position{line: 88, col: 5, offset: 1708},
				run: (*parser).callonCallExpression1,
				expr: &seqExpr{
					pos: position{line: 88, col: 5, offset: 1708},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 88, col: 5, offset: 1708},
							label: "head",
							expr: &actionExpr{
								pos: position{line: 89, col: 7, offset: 1721},
								run: (*parser).callonCallExpression4,
								expr: &seqExpr{
									pos: position{line: 89, col: 7, offset: 1721},
									exprs: []interface{}{
										&labeledExpr{
											pos:   position{line: 89, col: 7, offset: 1721},
											label: "callee",
											expr: &ruleRefExpr{
												pos:  position{line: 89, col: 14, offset: 1728},
												name: "MemberExpressions",
											},
										},
										&ruleRefExpr{
											pos:  position{line: 89, col: 32, offset: 1746},
											name: "__",
										},
										&labeledExpr{
											pos:   position{line: 89, col: 35, offset: 1749},
											label: "args",
											expr: &ruleRefExpr{
												pos:  position{line: 89, col: 40, offset: 1754},
												name: "Arguments",
											},
										},
									},
								},
							},
						},
						&labeledExpr{
							pos:   position{line: 93, col: 5, offset: 1837},
							label: "tail",
							expr: &zeroOrMoreExpr{
								pos: position{line: 93, col: 10, offset: 1842},
								expr: &choiceExpr{
									pos: position{line: 94, col: 9, offset: 1852},
									alternatives: []interface{}{
										&actionExpr{
											pos: position{line: 94, col: 9, offset: 1852},
											run: (*parser).callonCallExpression14,
											expr: &seqExpr{
												pos: position{line: 94, col: 9, offset: 1852},
												exprs: []interface{}{
													&ruleRefExpr{
														pos:  position{line: 94, col: 9, offset: 1852},
														name: "__",
													},
													&labeledExpr{
														pos:   position{line: 94, col: 12, offset: 1855},
														label: "args",
														expr: &ruleRefExpr{
															pos:  position{line: 94, col: 17, offset: 1860},
															name: "Arguments",
														},
													},
												},
											},
										},
										&actionExpr{
											pos: position{line: 97, col: 10, offset: 1943},
											run: (*parser).callonCallExpression19,
											expr: &seqExpr{
												pos: position{line: 97, col: 10, offset: 1943},
												exprs: []interface{}{
													&ruleRefExpr{
														pos:  position{line: 97, col: 10, offset: 1943},
														name: "__",
													},
													&labeledExpr{
														pos:   position{line: 97, col: 13, offset: 1946},
														label: "property",
														expr: &ruleRefExpr{
															pos:  position{line: 97, col: 22, offset: 1955},
															name: "MemberExpressionProperty",
														},
													},
												},
											},
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "PipeExpression",
			pos:  position{line: 105, col: 1, offset: 2093},
			expr: &actionExpr{
				pos: position{line: 106, col: 5, offset: 2112},
				run: (*parser).callonPipeExpression1,
				expr: &seqExpr{
					pos: position{line: 106, col: 5, offset: 2112},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 106, col: 5, offset: 2112},
							label: "head",
							expr: &ruleRefExpr{
								pos:  position{line: 106, col: 10, offset: 2117},
								name: "PipeExpressionHead",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 106, col: 29, offset: 2136},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 106, col: 32, offset: 2139},
							label: "tail",
							expr: &oneOrMoreExpr{
								pos: position{line: 106, col: 37, offset: 2144},
								expr: &seqExpr{
									pos: position{line: 106, col: 38, offset: 2145},
									exprs: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 106, col: 38, offset: 2145},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 106, col: 41, offset: 2148},
											name: "PipeExpressionPipe",
										},
										&ruleRefExpr{
											pos:  position{line: 106, col: 60, offset: 2167},
											name: "__",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "PipeExpressionHead",
			pos:  position{line: 110, col: 1, offset: 2231},
			expr: &choiceExpr{
				pos: position{line: 111, col: 5, offset: 2254},
				alternatives: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 111, col: 5, offset: 2254},
						name: "CallExpression",
					},
					&ruleRefExpr{
						pos:  position{line: 112, col: 5, offset: 2395},
						name: "Literal",
					},
					&ruleRefExpr{
						pos:  position{line: 113, col: 5, offset: 2407},
						name: "Array",
					},
					&ruleRefExpr{
						pos:  position{line: 114, col: 5, offset: 2417},
						name: "MemberExpressions",
					},
					&ruleRefExpr{
						pos:  position{line: 115, col: 5, offset: 2439},
						name: "Identifier",
					},
					&ruleRefExpr{
						pos:  position{line: 116, col: 5, offset: 2454},
						name: "ObjectExpression",
					},
					&ruleRefExpr{
						pos:  position{line: 117, col: 5, offset: 2475},
						name: "ArrowFunctionExpression",
					},
					&ruleRefExpr{
						pos:  position{line: 118, col: 5, offset: 2503},
						name: "Parens",
					},
				},
			},
		},
		{
			name: "PipeExpressionPipe",
			pos:  position{line: 120, col: 1, offset: 2511},
			expr: &actionExpr{
				pos: position{line: 121, col: 5, offset: 2534},
				run: (*parser).callonPipeExpressionPipe1,
				expr: &seqExpr{
					pos: position{line: 121, col: 5, offset: 2534},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 121, col: 5, offset: 2534},
							val:        "|>",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 121, col: 10, offset: 2539},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 121, col: 13, offset: 2542},
							label: "call",
							expr: &ruleRefExpr{
								pos:  position{line: 121, col: 18, offset: 2547},
								name: "CallExpression",
							},
						},
					},
				},
			},
		},
		{
			name: "Arguments",
			pos:  position{line: 125, col: 1, offset: 2624},
			expr: &actionExpr{
				pos: position{line: 126, col: 5, offset: 2638},
				run: (*parser).callonArguments1,
				expr: &seqExpr{
					pos: position{line: 126, col: 5, offset: 2638},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 126, col: 5, offset: 2638},
							val:        "(",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 126, col: 9, offset: 2642},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 126, col: 12, offset: 2645},
							label: "args",
							expr: &zeroOrOneExpr{
								pos: position{line: 126, col: 17, offset: 2650},
								expr: &ruleRefExpr{
									pos:  position{line: 126, col: 18, offset: 2651},
									name: "ObjectProperties",
								},
							},
						},
						&ruleRefExpr{
							pos:  position{line: 126, col: 37, offset: 2670},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 126, col: 40, offset: 2673},
							val:        ")",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "ArrowFunctionExpression",
			pos:  position{line: 130, col: 1, offset: 2709},
			expr: &actionExpr{
				pos: position{line: 131, col: 5, offset: 2737},
				run: (*parser).callonArrowFunctionExpression1,
				expr: &seqExpr{
					pos: position{line: 131, col: 5, offset: 2737},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 131, col: 5, offset: 2737},
							val:        "(",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 131, col: 9, offset: 2741},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 131, col: 12, offset: 2744},
							label: "params",
							expr: &zeroOrOneExpr{
								pos: position{line: 131, col: 19, offset: 2751},
								expr: &ruleRefExpr{
									pos:  position{line: 131, col: 19, offset: 2751},
									name: "ArrowFunctionParams",
								},
							},
						},
						&ruleRefExpr{
							pos:  position{line: 131, col: 40, offset: 2772},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 131, col: 43, offset: 2775},
							val:        ")",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 131, col: 47, offset: 2779},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 131, col: 50, offset: 2782},
							val:        "=>",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 131, col: 55, offset: 2787},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 131, col: 58, offset: 2790},
							label: "body",
							expr: &ruleRefExpr{
								pos:  position{line: 131, col: 63, offset: 2795},
								name: "ArrowFunctionBody",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 131, col: 81, offset: 2813},
							name: "__",
						},
					},
				},
			},
		},
		{
			name: "ArrowFunctionParams",
			pos:  position{line: 135, col: 1, offset: 2882},
			expr: &actionExpr{
				pos: position{line: 136, col: 5, offset: 2906},
				run: (*parser).callonArrowFunctionParams1,
				expr: &seqExpr{
					pos: position{line: 136, col: 5, offset: 2906},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 136, col: 5, offset: 2906},
							label: "first",
							expr: &ruleRefExpr{
								pos:  position{line: 136, col: 11, offset: 2912},
								name: "ArrowFunctionParam",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 136, col: 30, offset: 2931},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 136, col: 33, offset: 2934},
							label: "rest",
							expr: &zeroOrMoreExpr{
								pos: position{line: 136, col: 38, offset: 2939},
								expr: &ruleRefExpr{
									pos:  position{line: 136, col: 38, offset: 2939},
									name: "ArrowFunctionParamsRest",
								},
							},
						},
						&zeroOrOneExpr{
							pos: position{line: 136, col: 63, offset: 2964},
							expr: &litMatcher{
								pos:        position{line: 136, col: 63, offset: 2964},
								val:        ",",
								ignoreCase: false,
							},
						},
					},
				},
			},
		},
		{
			name: "ArrowFunctionParamsRest",
			pos:  position{line: 140, col: 1, offset: 3049},
			expr: &actionExpr{
				pos: position{line: 141, col: 5, offset: 3077},
				run: (*parser).callonArrowFunctionParamsRest1,
				expr: &seqExpr{
					pos: position{line: 141, col: 5, offset: 3077},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 141, col: 5, offset: 3077},
							val:        ",",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 141, col: 9, offset: 3081},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 141, col: 13, offset: 3085},
							label: "arg",
							expr: &ruleRefExpr{
								pos:  position{line: 141, col: 17, offset: 3089},
								name: "ArrowFunctionParam",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 141, col: 36, offset: 3108},
							name: "__",
						},
					},
				},
			},
		},
		{
			name: "ArrowFunctionParam",
			pos:  position{line: 145, col: 1, offset: 3142},
			expr: &choiceExpr{
				pos: position{line: 146, col: 5, offset: 3165},
				alternatives: []interface{}{
					&actionExpr{
						pos: position{line: 146, col: 5, offset: 3165},
						run: (*parser).callonArrowFunctionParam2,
						expr: &seqExpr{
							pos: position{line: 146, col: 5, offset: 3165},
							exprs: []interface{}{
								&labeledExpr{
									pos:   position{line: 146, col: 5, offset: 3165},
									label: "key",
									expr: &ruleRefExpr{
										pos:  position{line: 146, col: 9, offset: 3169},
										name: "Identifier",
									},
								},
								&ruleRefExpr{
									pos:  position{line: 146, col: 20, offset: 3180},
									name: "__",
								},
								&litMatcher{
									pos:        position{line: 146, col: 23, offset: 3183},
									val:        "=",
									ignoreCase: false,
								},
								&ruleRefExpr{
									pos:  position{line: 146, col: 27, offset: 3187},
									name: "__",
								},
								&labeledExpr{
									pos:   position{line: 146, col: 30, offset: 3190},
									label: "value",
									expr: &ruleRefExpr{
										pos:  position{line: 146, col: 36, offset: 3196},
										name: "Primary",
									},
								},
								&ruleRefExpr{
									pos:  position{line: 146, col: 45, offset: 3205},
									name: "__",
								},
							},
						},
					},
					&actionExpr{
						pos: position{line: 149, col: 5, offset: 3269},
						run: (*parser).callonArrowFunctionParam12,
						expr: &seqExpr{
							pos: position{line: 149, col: 5, offset: 3269},
							exprs: []interface{}{
								&labeledExpr{
									pos:   position{line: 149, col: 5, offset: 3269},
									label: "key",
									expr: &ruleRefExpr{
										pos:  position{line: 149, col: 9, offset: 3273},
										name: "Identifier",
									},
								},
								&ruleRefExpr{
									pos:  position{line: 149, col: 20, offset: 3284},
									name: "__",
								},
							},
						},
					},
				},
			},
		},
		{
			name: "ArrowFunctionBody",
			pos:  position{line: 154, col: 1, offset: 3345},
			expr: &choiceExpr{
				pos: position{line: 155, col: 5, offset: 3367},
				alternatives: []interface{}{
					&actionExpr{
						pos: position{line: 155, col: 5, offset: 3367},
						run: (*parser).callonArrowFunctionBody2,
						expr: &labeledExpr{
							pos:   position{line: 155, col: 5, offset: 3367},
							label: "body",
							expr: &ruleRefExpr{
								pos:  position{line: 155, col: 10, offset: 3372},
								name: "Expr",
							},
						},
					},
					&actionExpr{
						pos: position{line: 158, col: 5, offset: 3412},
						run: (*parser).callonArrowFunctionBody5,
						expr: &labeledExpr{
							pos:   position{line: 158, col: 5, offset: 3412},
							label: "body",
							expr: &ruleRefExpr{
								pos:  position{line: 158, col: 10, offset: 3417},
								name: "BlockStatement",
							},
						},
					},
				},
			},
		},
		{
			name: "ObjectExpression",
			pos:  position{line: 162, col: 1, offset: 3460},
			expr: &actionExpr{
				pos: position{line: 163, col: 5, offset: 3481},
				run: (*parser).callonObjectExpression1,
				expr: &seqExpr{
					pos: position{line: 163, col: 5, offset: 3481},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 163, col: 5, offset: 3481},
							val:        "{",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 163, col: 9, offset: 3485},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 163, col: 12, offset: 3488},
							label: "object",
							expr: &zeroOrOneExpr{
								pos: position{line: 163, col: 19, offset: 3495},
								expr: &ruleRefExpr{
									pos:  position{line: 163, col: 20, offset: 3496},
									name: "ObjectProperties",
								},
							},
						},
						&ruleRefExpr{
							pos:  position{line: 163, col: 39, offset: 3515},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 163, col: 42, offset: 3518},
							val:        "}",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "ObjectProperties",
			pos:  position{line: 167, col: 1, offset: 3552},
			expr: &actionExpr{
				pos: position{line: 168, col: 5, offset: 3573},
				run: (*parser).callonObjectProperties1,
				expr: &seqExpr{
					pos: position{line: 168, col: 5, offset: 3573},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 168, col: 5, offset: 3573},
							label: "first",
							expr: &ruleRefExpr{
								pos:  position{line: 168, col: 11, offset: 3579},
								name: "Property",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 168, col: 20, offset: 3588},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 168, col: 23, offset: 3591},
							label: "rest",
							expr: &zeroOrMoreExpr{
								pos: position{line: 168, col: 28, offset: 3596},
								expr: &ruleRefExpr{
									pos:  position{line: 168, col: 28, offset: 3596},
									name: "PropertiesRest",
								},
							},
						},
						&ruleRefExpr{
							pos:  position{line: 168, col: 44, offset: 3612},
							name: "__",
						},
						&zeroOrOneExpr{
							pos: position{line: 168, col: 47, offset: 3615},
							expr: &litMatcher{
								pos:        position{line: 168, col: 47, offset: 3615},
								val:        ",",
								ignoreCase: false,
							},
						},
					},
				},
			},
		},
		{
			name: "PropertiesRest",
			pos:  position{line: 172, col: 1, offset: 3681},
			expr: &actionExpr{
				pos: position{line: 173, col: 5, offset: 3700},
				run: (*parser).callonPropertiesRest1,
				expr: &seqExpr{
					pos: position{line: 173, col: 5, offset: 3700},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 173, col: 5, offset: 3700},
							val:        ",",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 173, col: 9, offset: 3704},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 173, col: 13, offset: 3708},
							label: "arg",
							expr: &ruleRefExpr{
								pos:  position{line: 173, col: 17, offset: 3712},
								name: "Property",
							},
						},
					},
				},
			},
		},
		{
			name: "Property",
			pos:  position{line: 177, col: 1, offset: 3752},
			expr: &actionExpr{
				pos: position{line: 178, col: 5, offset: 3765},
				run: (*parser).callonProperty1,
				expr: &seqExpr{
					pos: position{line: 178, col: 5, offset: 3765},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 178, col: 5, offset: 3765},
							label: "key",
							expr: &ruleRefExpr{
								pos:  position{line: 178, col: 9, offset: 3769},
								name: "Identifier",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 178, col: 20, offset: 3780},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 178, col: 24, offset: 3784},
							val:        ":",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 178, col: 28, offset: 3788},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 178, col: 31, offset: 3791},
							label: "value",
							expr: &ruleRefExpr{
								pos:  position{line: 178, col: 37, offset: 3797},
								name: "Expr",
							},
						},
					},
				},
			},
		},
		{
			name: "Expr",
			pos:  position{line: 189, col: 1, offset: 4047},
			expr: &ruleRefExpr{
				pos:  position{line: 190, col: 5, offset: 4056},
				name: "LogicalExpression",
			},
		},
		{
			name: "LogicalOperators",
			pos:  position{line: 192, col: 1, offset: 4075},
			expr: &actionExpr{
				pos: position{line: 193, col: 5, offset: 4096},
				run: (*parser).callonLogicalOperators1,
				expr: &choiceExpr{
					pos: position{line: 193, col: 6, offset: 4097},
					alternatives: []interface{}{
						&litMatcher{
							pos:        position{line: 193, col: 6, offset: 4097},
							val:        "or",
							ignoreCase: true,
						},
						&litMatcher{
							pos:        position{line: 193, col: 14, offset: 4105},
							val:        "and",
							ignoreCase: true,
						},
					},
				},
			},
		},
		{
			name: "LogicalExpression",
			pos:  position{line: 197, col: 1, offset: 4157},
			expr: &actionExpr{
				pos: position{line: 198, col: 5, offset: 4179},
				run: (*parser).callonLogicalExpression1,
				expr: &seqExpr{
					pos: position{line: 198, col: 5, offset: 4179},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 198, col: 5, offset: 4179},
							label: "head",
							expr: &ruleRefExpr{
								pos:  position{line: 198, col: 10, offset: 4184},
								name: "Equality",
							},
						},
						&labeledExpr{
							pos:   position{line: 198, col: 19, offset: 4193},
							label: "tail",
							expr: &zeroOrMoreExpr{
								pos: position{line: 198, col: 24, offset: 4198},
								expr: &seqExpr{
									pos: position{line: 198, col: 26, offset: 4200},
									exprs: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 198, col: 26, offset: 4200},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 198, col: 30, offset: 4204},
											name: "LogicalOperators",
										},
										&ruleRefExpr{
											pos:  position{line: 198, col: 47, offset: 4221},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 198, col: 51, offset: 4225},
											name: "Equality",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "EqualityOperators",
			pos:  position{line: 202, col: 1, offset: 4304},
			expr: &actionExpr{
				pos: position{line: 203, col: 5, offset: 4326},
				run: (*parser).callonEqualityOperators1,
				expr: &choiceExpr{
					pos: position{line: 203, col: 6, offset: 4327},
					alternatives: []interface{}{
						&litMatcher{
							pos:        position{line: 203, col: 6, offset: 4327},
							val:        "==",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 203, col: 13, offset: 4334},
							val:        "!=",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 203, col: 20, offset: 4341},
							val:        "=~",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 203, col: 27, offset: 4348},
							val:        "!~",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "Equality",
			pos:  position{line: 207, col: 1, offset: 4393},
			expr: &actionExpr{
				pos: position{line: 208, col: 5, offset: 4406},
				run: (*parser).callonEquality1,
				expr: &seqExpr{
					pos: position{line: 208, col: 5, offset: 4406},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 208, col: 5, offset: 4406},
							label: "head",
							expr: &ruleRefExpr{
								pos:  position{line: 208, col: 10, offset: 4411},
								name: "Relational",
							},
						},
						&labeledExpr{
							pos:   position{line: 208, col: 21, offset: 4422},
							label: "tail",
							expr: &zeroOrMoreExpr{
								pos: position{line: 208, col: 26, offset: 4427},
								expr: &seqExpr{
									pos: position{line: 208, col: 28, offset: 4429},
									exprs: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 208, col: 28, offset: 4429},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 208, col: 31, offset: 4432},
											name: "EqualityOperators",
										},
										&ruleRefExpr{
											pos:  position{line: 208, col: 49, offset: 4450},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 208, col: 52, offset: 4453},
											name: "Relational",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "RelationalOperators",
			pos:  position{line: 212, col: 1, offset: 4533},
			expr: &actionExpr{
				pos: position{line: 213, col: 5, offset: 4557},
				run: (*parser).callonRelationalOperators1,
				expr: &choiceExpr{
					pos: position{line: 213, col: 9, offset: 4561},
					alternatives: []interface{}{
						&litMatcher{
							pos:        position{line: 213, col: 9, offset: 4561},
							val:        "<=",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 214, col: 9, offset: 4574},
							val:        "<",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 215, col: 9, offset: 4586},
							val:        ">=",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 216, col: 9, offset: 4599},
							val:        ">",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 217, col: 9, offset: 4611},
							val:        "startswith",
							ignoreCase: true,
						},
						&litMatcher{
							pos:        position{line: 218, col: 9, offset: 4633},
							val:        "in",
							ignoreCase: true,
						},
						&litMatcher{
							pos:        position{line: 219, col: 9, offset: 4647},
							val:        "not empty",
							ignoreCase: true,
						},
						&litMatcher{
							pos:        position{line: 220, col: 9, offset: 4668},
							val:        "empty",
							ignoreCase: true,
						},
					},
				},
			},
		},
		{
			name: "Relational",
			pos:  position{line: 225, col: 1, offset: 4726},
			expr: &actionExpr{
				pos: position{line: 226, col: 5, offset: 4741},
				run: (*parser).callonRelational1,
				expr: &seqExpr{
					pos: position{line: 226, col: 5, offset: 4741},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 226, col: 5, offset: 4741},
							label: "head",
							expr: &ruleRefExpr{
								pos:  position{line: 226, col: 10, offset: 4746},
								name: "Additive",
							},
						},
						&labeledExpr{
							pos:   position{line: 226, col: 19, offset: 4755},
							label: "tail",
							expr: &zeroOrMoreExpr{
								pos: position{line: 226, col: 24, offset: 4760},
								expr: &seqExpr{
									pos: position{line: 226, col: 26, offset: 4762},
									exprs: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 226, col: 26, offset: 4762},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 226, col: 29, offset: 4765},
											name: "RelationalOperators",
										},
										&ruleRefExpr{
											pos:  position{line: 226, col: 49, offset: 4785},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 226, col: 52, offset: 4788},
											name: "Additive",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "AdditiveOperator",
			pos:  position{line: 230, col: 1, offset: 4866},
			expr: &actionExpr{
				pos: position{line: 231, col: 5, offset: 4887},
				run: (*parser).callonAdditiveOperator1,
				expr: &choiceExpr{
					pos: position{line: 231, col: 6, offset: 4888},
					alternatives: []interface{}{
						&litMatcher{
							pos:        position{line: 231, col: 6, offset: 4888},
							val:        "+",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 231, col: 12, offset: 4894},
							val:        "-",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "Additive",
			pos:  position{line: 235, col: 1, offset: 4942},
			expr: &actionExpr{
				pos: position{line: 236, col: 5, offset: 4955},
				run: (*parser).callonAdditive1,
				expr: &seqExpr{
					pos: position{line: 236, col: 5, offset: 4955},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 236, col: 5, offset: 4955},
							label: "head",
							expr: &ruleRefExpr{
								pos:  position{line: 236, col: 10, offset: 4960},
								name: "Multiplicative",
							},
						},
						&labeledExpr{
							pos:   position{line: 236, col: 25, offset: 4975},
							label: "tail",
							expr: &zeroOrMoreExpr{
								pos: position{line: 236, col: 30, offset: 4980},
								expr: &seqExpr{
									pos: position{line: 236, col: 32, offset: 4982},
									exprs: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 236, col: 32, offset: 4982},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 236, col: 35, offset: 4985},
											name: "AdditiveOperator",
										},
										&ruleRefExpr{
											pos:  position{line: 236, col: 52, offset: 5002},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 236, col: 55, offset: 5005},
											name: "Multiplicative",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "MultiplicativeOperator",
			pos:  position{line: 240, col: 1, offset: 5089},
			expr: &actionExpr{
				pos: position{line: 241, col: 5, offset: 5116},
				run: (*parser).callonMultiplicativeOperator1,
				expr: &choiceExpr{
					pos: position{line: 241, col: 6, offset: 5117},
					alternatives: []interface{}{
						&litMatcher{
							pos:        position{line: 241, col: 6, offset: 5117},
							val:        "*",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 241, col: 12, offset: 5123},
							val:        "/",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "Multiplicative",
			pos:  position{line: 245, col: 1, offset: 5167},
			expr: &actionExpr{
				pos: position{line: 246, col: 5, offset: 5186},
				run: (*parser).callonMultiplicative1,
				expr: &seqExpr{
					pos: position{line: 246, col: 5, offset: 5186},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 246, col: 5, offset: 5186},
							label: "head",
							expr: &ruleRefExpr{
								pos:  position{line: 246, col: 10, offset: 5191},
								name: "UnaryExpression",
							},
						},
						&labeledExpr{
							pos:   position{line: 246, col: 26, offset: 5207},
							label: "tail",
							expr: &zeroOrMoreExpr{
								pos: position{line: 246, col: 31, offset: 5212},
								expr: &seqExpr{
									pos: position{line: 246, col: 33, offset: 5214},
									exprs: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 246, col: 33, offset: 5214},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 246, col: 36, offset: 5217},
											name: "MultiplicativeOperator",
										},
										&ruleRefExpr{
											pos:  position{line: 246, col: 59, offset: 5240},
											name: "__",
										},
										&ruleRefExpr{
											pos:  position{line: 246, col: 62, offset: 5243},
											name: "UnaryExpression",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "UnaryOperator",
			pos:  position{line: 250, col: 1, offset: 5328},
			expr: &actionExpr{
				pos: position{line: 251, col: 5, offset: 5346},
				run: (*parser).callonUnaryOperator1,
				expr: &choiceExpr{
					pos: position{line: 251, col: 6, offset: 5347},
					alternatives: []interface{}{
						&litMatcher{
							pos:        position{line: 251, col: 6, offset: 5347},
							val:        "-",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 251, col: 12, offset: 5353},
							val:        "not",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "UnaryExpression",
			pos:  position{line: 255, col: 1, offset: 5399},
			expr: &choiceExpr{
				pos: position{line: 256, col: 5, offset: 5419},
				alternatives: []interface{}{
					&actionExpr{
						pos: position{line: 256, col: 5, offset: 5419},
						run: (*parser).callonUnaryExpression2,
						expr: &seqExpr{
							pos: position{line: 256, col: 5, offset: 5419},
							exprs: []interface{}{
								&ruleRefExpr{
									pos:  position{line: 256, col: 5, offset: 5419},
									name: "__",
								},
								&labeledExpr{
									pos:   position{line: 256, col: 8, offset: 5422},
									label: "op",
									expr: &ruleRefExpr{
										pos:  position{line: 256, col: 11, offset: 5425},
										name: "UnaryOperator",
									},
								},
								&ruleRefExpr{
									pos:  position{line: 256, col: 25, offset: 5439},
									name: "__",
								},
								&labeledExpr{
									pos:   position{line: 256, col: 28, offset: 5442},
									label: "argument",
									expr: &ruleRefExpr{
										pos:  position{line: 256, col: 37, offset: 5451},
										name: "Primary",
									},
								},
								&ruleRefExpr{
									pos:  position{line: 256, col: 45, offset: 5459},
									name: "__",
								},
							},
						},
					},
					&ruleRefExpr{
						pos:  position{line: 259, col: 5, offset: 5532},
						name: "Primary",
					},
				},
			},
		},
		{
			name: "Primary",
			pos:  position{line: 261, col: 1, offset: 5541},
			expr: &choiceExpr{
				pos: position{line: 262, col: 5, offset: 5553},
				alternatives: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 262, col: 5, offset: 5553},
						name: "PipeExpression",
					},
					&ruleRefExpr{
						pos:  position{line: 263, col: 5, offset: 5572},
						name: "Array",
					},
					&ruleRefExpr{
						pos:  position{line: 264, col: 5, offset: 5582},
						name: "Literal",
					},
					&ruleRefExpr{
						pos:  position{line: 265, col: 5, offset: 5594},
						name: "CallExpression",
					},
					&ruleRefExpr{
						pos:  position{line: 266, col: 5, offset: 5613},
						name: "MemberExpressions",
					},
					&ruleRefExpr{
						pos:  position{line: 267, col: 5, offset: 5635},
						name: "Identifier",
					},
					&ruleRefExpr{
						pos:  position{line: 268, col: 5, offset: 5650},
						name: "ObjectExpression",
					},
					&ruleRefExpr{
						pos:  position{line: 269, col: 5, offset: 5671},
						name: "ArrowFunctionExpression",
					},
					&ruleRefExpr{
						pos:  position{line: 270, col: 5, offset: 5699},
						name: "Parens",
					},
				},
			},
		},
		{
			name: "Literal",
			pos:  position{line: 272, col: 1, offset: 5707},
			expr: &choiceExpr{
				pos: position{line: 273, col: 5, offset: 5719},
				alternatives: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 273, col: 5, offset: 5719},
						name: "StringLiteral",
					},
					&ruleRefExpr{
						pos:  position{line: 274, col: 5, offset: 5737},
						name: "BooleanLiteral",
					},
					&ruleRefExpr{
						pos:  position{line: 275, col: 5, offset: 5756},
						name: "RegexpLiteral",
					},
					&ruleRefExpr{
						pos:  position{line: 276, col: 5, offset: 5774},
						name: "PipeLiteral",
					},
					&ruleRefExpr{
						pos:  position{line: 277, col: 5, offset: 5790},
						name: "DurationLiteral",
					},
					&ruleRefExpr{
						pos:  position{line: 278, col: 5, offset: 5810},
						name: "DateTimeLiteral",
					},
					&ruleRefExpr{
						pos:  position{line: 279, col: 5, offset: 5830},
						name: "NumberLiteral",
					},
					&ruleRefExpr{
						pos:  position{line: 280, col: 5, offset: 5848},
						name: "IntegerLiteral",
					},
				},
			},
		},
		{
			name: "Parens",
			pos:  position{line: 282, col: 1, offset: 5864},
			expr: &actionExpr{
				pos: position{line: 283, col: 5, offset: 5875},
				run: (*parser).callonParens1,
				expr: &seqExpr{
					pos: position{line: 283, col: 5, offset: 5875},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 283, col: 5, offset: 5875},
							val:        "(",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 283, col: 9, offset: 5879},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 283, col: 12, offset: 5882},
							label: "expr",
							expr: &ruleRefExpr{
								pos:  position{line: 283, col: 17, offset: 5887},
								name: "Expr",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 283, col: 22, offset: 5892},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 283, col: 25, offset: 5895},
							val:        ")",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "Array",
			pos:  position{line: 287, col: 1, offset: 5931},
			expr: &actionExpr{
				pos: position{line: 288, col: 5, offset: 5941},
				run: (*parser).callonArray1,
				expr: &seqExpr{
					pos: position{line: 288, col: 5, offset: 5941},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 288, col: 5, offset: 5941},
							val:        "[",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 288, col: 9, offset: 5945},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 288, col: 12, offset: 5948},
							label: "elements",
							expr: &zeroOrOneExpr{
								pos: position{line: 288, col: 21, offset: 5957},
								expr: &ruleRefExpr{
									pos:  position{line: 288, col: 21, offset: 5957},
									name: "ArrayElements",
								},
							},
						},
						&ruleRefExpr{
							pos:  position{line: 288, col: 36, offset: 5972},
							name: "__",
						},
						&litMatcher{
							pos:        position{line: 288, col: 39, offset: 5975},
							val:        "]",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "ArrayElements",
			pos:  position{line: 292, col: 1, offset: 6015},
			expr: &actionExpr{
				pos: position{line: 293, col: 5, offset: 6033},
				run: (*parser).callonArrayElements1,
				expr: &seqExpr{
					pos: position{line: 293, col: 5, offset: 6033},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 293, col: 5, offset: 6033},
							label: "first",
							expr: &ruleRefExpr{
								pos:  position{line: 293, col: 11, offset: 6039},
								name: "Primary",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 293, col: 19, offset: 6047},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 293, col: 22, offset: 6050},
							label: "rest",
							expr: &zeroOrMoreExpr{
								pos: position{line: 293, col: 27, offset: 6055},
								expr: &ruleRefExpr{
									pos:  position{line: 293, col: 27, offset: 6055},
									name: "ArrayRest",
								},
							},
						},
					},
				},
			},
		},
		{
			name: "ArrayRest",
			pos:  position{line: 297, col: 1, offset: 6127},
			expr: &actionExpr{
				pos: position{line: 298, col: 5, offset: 6141},
				run: (*parser).callonArrayRest1,
				expr: &seqExpr{
					pos: position{line: 298, col: 5, offset: 6141},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 298, col: 5, offset: 6141},
							val:        ",",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 298, col: 9, offset: 6145},
							name: "__",
						},
						&labeledExpr{
							pos:   position{line: 298, col: 12, offset: 6148},
							label: "element",
							expr: &ruleRefExpr{
								pos:  position{line: 298, col: 20, offset: 6156},
								name: "Primary",
							},
						},
					},
				},
			},
		},
		{
			name: "DateFullYear",
			pos:  position{line: 302, col: 1, offset: 6199},
			expr: &seqExpr{
				pos: position{line: 303, col: 5, offset: 6216},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 303, col: 5, offset: 6216},
						name: "Digit",
					},
					&ruleRefExpr{
						pos:  position{line: 303, col: 11, offset: 6222},
						name: "Digit",
					},
					&ruleRefExpr{
						pos:  position{line: 303, col: 17, offset: 6228},
						name: "Digit",
					},
					&ruleRefExpr{
						pos:  position{line: 303, col: 23, offset: 6234},
						name: "Digit",
					},
				},
			},
		},
		{
			name: "DateMonth",
			pos:  position{line: 305, col: 1, offset: 6241},
			expr: &seqExpr{
				pos: position{line: 307, col: 5, offset: 6266},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 307, col: 5, offset: 6266},
						name: "Digit",
					},
					&ruleRefExpr{
						pos:  position{line: 307, col: 11, offset: 6272},
						name: "Digit",
					},
				},
			},
		},
		{
			name: "DateMDay",
			pos:  position{line: 309, col: 1, offset: 6279},
			expr: &seqExpr{
				pos: position{line: 312, col: 5, offset: 6349},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 312, col: 5, offset: 6349},
						name: "Digit",
					},
					&ruleRefExpr{
						pos:  position{line: 312, col: 11, offset: 6355},
						name: "Digit",
					},
				},
			},
		},
		{
			name: "TimeHour",
			pos:  position{line: 314, col: 1, offset: 6362},
			expr: &seqExpr{
				pos: position{line: 316, col: 5, offset: 6386},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 316, col: 5, offset: 6386},
						name: "Digit",
					},
					&ruleRefExpr{
						pos:  position{line: 316, col: 11, offset: 6392},
						name: "Digit",
					},
				},
			},
		},
		{
			name: "TimeMinute",
			pos:  position{line: 318, col: 1, offset: 6399},
			expr: &seqExpr{
				pos: position{line: 320, col: 5, offset: 6425},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 320, col: 5, offset: 6425},
						name: "Digit",
					},
					&ruleRefExpr{
						pos:  position{line: 320, col: 11, offset: 6431},
						name: "Digit",
					},
				},
			},
		},
		{
			name: "TimeSecond",
			pos:  position{line: 322, col: 1, offset: 6438},
			expr: &seqExpr{
				pos: position{line: 325, col: 5, offset: 6510},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 325, col: 5, offset: 6510},
						name: "Digit",
					},
					&ruleRefExpr{
						pos:  position{line: 325, col: 11, offset: 6516},
						name: "Digit",
					},
				},
			},
		},
		{
			name: "TimeSecFrac",
			pos:  position{line: 327, col: 1, offset: 6523},
			expr: &seqExpr{
				pos: position{line: 328, col: 5, offset: 6539},
				exprs: []interface{}{
					&litMatcher{
						pos:        position{line: 328, col: 5, offset: 6539},
						val:        ".",
						ignoreCase: false,
					},
					&oneOrMoreExpr{
						pos: position{line: 328, col: 9, offset: 6543},
						expr: &ruleRefExpr{
							pos:  position{line: 328, col: 9, offset: 6543},
							name: "Digit",
						},
					},
				},
			},
		},
		{
			name: "TimeNumOffset",
			pos:  position{line: 330, col: 1, offset: 6551},
			expr: &seqExpr{
				pos: position{line: 331, col: 5, offset: 6569},
				exprs: []interface{}{
					&choiceExpr{
						pos: position{line: 331, col: 6, offset: 6570},
						alternatives: []interface{}{
							&litMatcher{
								pos:        position{line: 331, col: 6, offset: 6570},
								val:        "+",
								ignoreCase: false,
							},
							&litMatcher{
								pos:        position{line: 331, col: 12, offset: 6576},
								val:        "-",
								ignoreCase: false,
							},
						},
					},
					&ruleRefExpr{
						pos:  position{line: 331, col: 17, offset: 6581},
						name: "TimeHour",
					},
					&litMatcher{
						pos:        position{line: 331, col: 26, offset: 6590},
						val:        ":",
						ignoreCase: false,
					},
					&ruleRefExpr{
						pos:  position{line: 331, col: 30, offset: 6594},
						name: "TimeMinute",
					},
				},
			},
		},
		{
			name: "TimeOffset",
			pos:  position{line: 333, col: 1, offset: 6606},
			expr: &choiceExpr{
				pos: position{line: 334, col: 6, offset: 6622},
				alternatives: []interface{}{
					&litMatcher{
						pos:        position{line: 334, col: 6, offset: 6622},
						val:        "Z",
						ignoreCase: false,
					},
					&ruleRefExpr{
						pos:  position{line: 334, col: 12, offset: 6628},
						name: "TimeNumOffset",
					},
				},
			},
		},
		{
			name: "PartialTime",
			pos:  position{line: 336, col: 1, offset: 6644},
			expr: &seqExpr{
				pos: position{line: 337, col: 5, offset: 6660},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 337, col: 5, offset: 6660},
						name: "TimeHour",
					},
					&litMatcher{
						pos:        position{line: 337, col: 14, offset: 6669},
						val:        ":",
						ignoreCase: false,
					},
					&ruleRefExpr{
						pos:  position{line: 337, col: 18, offset: 6673},
						name: "TimeMinute",
					},
					&litMatcher{
						pos:        position{line: 337, col: 29, offset: 6684},
						val:        ":",
						ignoreCase: false,
					},
					&ruleRefExpr{
						pos:  position{line: 337, col: 33, offset: 6688},
						name: "TimeSecond",
					},
					&zeroOrOneExpr{
						pos: position{line: 337, col: 44, offset: 6699},
						expr: &ruleRefExpr{
							pos:  position{line: 337, col: 44, offset: 6699},
							name: "TimeSecFrac",
						},
					},
				},
			},
		},
		{
			name: "FullDate",
			pos:  position{line: 339, col: 1, offset: 6713},
			expr: &seqExpr{
				pos: position{line: 340, col: 5, offset: 6726},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 340, col: 5, offset: 6726},
						name: "DateFullYear",
					},
					&litMatcher{
						pos:        position{line: 340, col: 18, offset: 6739},
						val:        "-",
						ignoreCase: false,
					},
					&ruleRefExpr{
						pos:  position{line: 340, col: 22, offset: 6743},
						name: "DateMonth",
					},
					&litMatcher{
						pos:        position{line: 340, col: 32, offset: 6753},
						val:        "-",
						ignoreCase: false,
					},
					&ruleRefExpr{
						pos:  position{line: 340, col: 36, offset: 6757},
						name: "DateMDay",
					},
				},
			},
		},
		{
			name: "FullTime",
			pos:  position{line: 342, col: 1, offset: 6767},
			expr: &seqExpr{
				pos: position{line: 343, col: 5, offset: 6780},
				exprs: []interface{}{
					&ruleRefExpr{
						pos:  position{line: 343, col: 5, offset: 6780},
						name: "PartialTime",
					},
					&ruleRefExpr{
						pos:  position{line: 343, col: 17, offset: 6792},
						name: "TimeOffset",
					},
				},
			},
		},
		{
			name: "DateTimeLiteral",
			pos:  position{line: 345, col: 1, offset: 6804},
			expr: &actionExpr{
				pos: position{line: 346, col: 5, offset: 6824},
				run: (*parser).callonDateTimeLiteral1,
				expr: &seqExpr{
					pos: position{line: 346, col: 5, offset: 6824},
					exprs: []interface{}{
						&ruleRefExpr{
							pos:  position{line: 346, col: 5, offset: 6824},
							name: "FullDate",
						},
						&litMatcher{
							pos:        position{line: 346, col: 14, offset: 6833},
							val:        "T",
							ignoreCase: false,
						},
						&ruleRefExpr{
							pos:  position{line: 346, col: 18, offset: 6837},
							name: "FullTime",
						},
					},
				},
			},
		},
		{
			name: "DurationLiteral",
			pos:  position{line: 353, col: 1, offset: 7099},
			expr: &actionExpr{
				pos: position{line: 354, col: 5, offset: 7119},
				run: (*parser).callonDurationLiteral1,
				expr: &labeledExpr{
					pos:   position{line: 354, col: 5, offset: 7119},
					label: "durations",
					expr: &choiceExpr{
						pos: position{line: 355, col: 9, offset: 7139},
						alternatives: []interface{}{
							&ruleRefExpr{
								pos:  position{line: 355, col: 9, offset: 7139},
								name: "DayDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 356, col: 9, offset: 7159},
								name: "HourDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 357, col: 9, offset: 7180},
								name: "MicroSecondDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 358, col: 9, offset: 7208},
								name: "MilliSecondDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 359, col: 9, offset: 7236},
								name: "MonthDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 360, col: 9, offset: 7258},
								name: "MinuteDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 361, col: 9, offset: 7281},
								name: "NanoSecondDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 362, col: 9, offset: 7308},
								name: "SecondDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 363, col: 9, offset: 7331},
								name: "WeekDuration",
							},
							&ruleRefExpr{
								pos:  position{line: 364, col: 9, offset: 7352},
								name: "YearDuration",
							},
						},
					},
				},
			},
		},
		{
			name: "YearDuration",
			pos:  position{line: 369, col: 1, offset: 7435},
			expr: &actionExpr{
				pos: position{line: 370, col: 5, offset: 7452},
				run: (*parser).callonYearDuration1,
				expr: &seqExpr{
					pos: position{line: 370, col: 5, offset: 7452},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 370, col: 5, offset: 7452},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 370, col: 9, offset: 7456},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 370, col: 24, offset: 7471},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 370, col: 29, offset: 7476},
								name: "YearUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 370, col: 39, offset: 7486},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 370, col: 50, offset: 7497},
								expr: &choiceExpr{
									pos: position{line: 371, col: 9, offset: 7507},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 371, col: 9, offset: 7507},
											name: "DayDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 372, col: 9, offset: 7527},
											name: "HourDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 373, col: 9, offset: 7548},
											name: "MicroSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 374, col: 9, offset: 7576},
											name: "MilliSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 375, col: 9, offset: 7604},
											name: "MonthDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 376, col: 9, offset: 7626},
											name: "MinuteDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 377, col: 9, offset: 7649},
											name: "NanoSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 378, col: 9, offset: 7676},
											name: "SecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 379, col: 9, offset: 7699},
											name: "WeekDuration",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "MonthDuration",
			pos:  position{line: 384, col: 1, offset: 7801},
			expr: &actionExpr{
				pos: position{line: 385, col: 5, offset: 7819},
				run: (*parser).callonMonthDuration1,
				expr: &seqExpr{
					pos: position{line: 385, col: 5, offset: 7819},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 385, col: 5, offset: 7819},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 385, col: 9, offset: 7823},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 385, col: 24, offset: 7838},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 385, col: 29, offset: 7843},
								name: "MonthUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 385, col: 40, offset: 7854},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 385, col: 51, offset: 7865},
								expr: &choiceExpr{
									pos: position{line: 386, col: 9, offset: 7875},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 386, col: 9, offset: 7875},
											name: "DayDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 387, col: 9, offset: 7895},
											name: "HourDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 388, col: 9, offset: 7916},
											name: "MicroSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 389, col: 9, offset: 7944},
											name: "MilliSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 390, col: 9, offset: 7972},
											name: "MinuteDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 391, col: 9, offset: 7995},
											name: "NanoSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 392, col: 9, offset: 8022},
											name: "SecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 393, col: 9, offset: 8045},
											name: "WeekDuration",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "WeekDuration",
			pos:  position{line: 398, col: 1, offset: 8148},
			expr: &actionExpr{
				pos: position{line: 399, col: 5, offset: 8165},
				run: (*parser).callonWeekDuration1,
				expr: &seqExpr{
					pos: position{line: 399, col: 5, offset: 8165},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 399, col: 5, offset: 8165},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 399, col: 9, offset: 8169},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 399, col: 24, offset: 8184},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 399, col: 29, offset: 8189},
								name: "WeekUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 399, col: 39, offset: 8199},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 399, col: 50, offset: 8210},
								expr: &choiceExpr{
									pos: position{line: 400, col: 9, offset: 8220},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 400, col: 9, offset: 8220},
											name: "DayDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 401, col: 9, offset: 8240},
											name: "HourDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 402, col: 9, offset: 8261},
											name: "MicroSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 403, col: 9, offset: 8289},
											name: "MilliSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 404, col: 9, offset: 8317},
											name: "MinuteDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 405, col: 9, offset: 8340},
											name: "NanoSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 406, col: 9, offset: 8367},
											name: "SecondDuration",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "DayDuration",
			pos:  position{line: 411, col: 1, offset: 8471},
			expr: &actionExpr{
				pos: position{line: 412, col: 5, offset: 8487},
				run: (*parser).callonDayDuration1,
				expr: &seqExpr{
					pos: position{line: 412, col: 5, offset: 8487},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 412, col: 5, offset: 8487},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 412, col: 9, offset: 8491},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 412, col: 24, offset: 8506},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 412, col: 29, offset: 8511},
								name: "DayUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 412, col: 38, offset: 8520},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 412, col: 49, offset: 8531},
								expr: &choiceExpr{
									pos: position{line: 413, col: 9, offset: 8541},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 413, col: 9, offset: 8541},
											name: "HourDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 414, col: 9, offset: 8562},
											name: "MicroSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 415, col: 9, offset: 8590},
											name: "MilliSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 416, col: 9, offset: 8618},
											name: "MinuteDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 417, col: 9, offset: 8641},
											name: "NanoSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 418, col: 9, offset: 8668},
											name: "SecondDuration",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "HourDuration",
			pos:  position{line: 423, col: 1, offset: 8772},
			expr: &actionExpr{
				pos: position{line: 424, col: 5, offset: 8789},
				run: (*parser).callonHourDuration1,
				expr: &seqExpr{
					pos: position{line: 424, col: 5, offset: 8789},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 424, col: 5, offset: 8789},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 424, col: 9, offset: 8793},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 424, col: 24, offset: 8808},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 424, col: 29, offset: 8813},
								name: "HourUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 424, col: 39, offset: 8823},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 424, col: 50, offset: 8834},
								expr: &choiceExpr{
									pos: position{line: 425, col: 9, offset: 8844},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 425, col: 9, offset: 8844},
											name: "MicroSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 426, col: 9, offset: 8872},
											name: "MilliSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 427, col: 9, offset: 8900},
											name: "MinuteDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 428, col: 9, offset: 8923},
											name: "NanoSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 429, col: 9, offset: 8950},
											name: "SecondDuration",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "MinuteDuration",
			pos:  position{line: 434, col: 1, offset: 9054},
			expr: &actionExpr{
				pos: position{line: 435, col: 5, offset: 9073},
				run: (*parser).callonMinuteDuration1,
				expr: &seqExpr{
					pos: position{line: 435, col: 5, offset: 9073},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 435, col: 5, offset: 9073},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 435, col: 9, offset: 9077},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 435, col: 24, offset: 9092},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 435, col: 29, offset: 9097},
								name: "MinuteUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 435, col: 41, offset: 9109},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 435, col: 52, offset: 9120},
								expr: &choiceExpr{
									pos: position{line: 436, col: 9, offset: 9130},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 436, col: 9, offset: 9130},
											name: "MicroSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 437, col: 9, offset: 9158},
											name: "MilliSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 438, col: 9, offset: 9186},
											name: "NanoSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 439, col: 9, offset: 9213},
											name: "SecondDuration",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "SecondDuration",
			pos:  position{line: 444, col: 1, offset: 9317},
			expr: &actionExpr{
				pos: position{line: 445, col: 5, offset: 9336},
				run: (*parser).callonSecondDuration1,
				expr: &seqExpr{
					pos: position{line: 445, col: 5, offset: 9336},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 445, col: 5, offset: 9336},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 445, col: 9, offset: 9340},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 445, col: 24, offset: 9355},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 445, col: 29, offset: 9360},
								name: "SecondUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 445, col: 41, offset: 9372},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 445, col: 52, offset: 9383},
								expr: &choiceExpr{
									pos: position{line: 446, col: 9, offset: 9393},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 446, col: 9, offset: 9393},
											name: "MicroSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 447, col: 9, offset: 9421},
											name: "MilliSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 448, col: 9, offset: 9449},
											name: "NanoSecondDuration",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "MilliSecondDuration",
			pos:  position{line: 453, col: 1, offset: 9557},
			expr: &actionExpr{
				pos: position{line: 454, col: 5, offset: 9581},
				run: (*parser).callonMilliSecondDuration1,
				expr: &seqExpr{
					pos: position{line: 454, col: 5, offset: 9581},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 454, col: 5, offset: 9581},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 454, col: 9, offset: 9585},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 454, col: 24, offset: 9600},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 454, col: 29, offset: 9605},
								name: "MilliSecondUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 454, col: 46, offset: 9622},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 454, col: 57, offset: 9633},
								expr: &choiceExpr{
									pos: position{line: 455, col: 9, offset: 9643},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 455, col: 9, offset: 9643},
											name: "MicroSecondDuration",
										},
										&ruleRefExpr{
											pos:  position{line: 456, col: 9, offset: 9671},
											name: "NanoSecondDuration",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "MicroSecondDuration",
			pos:  position{line: 461, col: 1, offset: 9779},
			expr: &actionExpr{
				pos: position{line: 462, col: 5, offset: 9803},
				run: (*parser).callonMicroSecondDuration1,
				expr: &seqExpr{
					pos: position{line: 462, col: 5, offset: 9803},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 462, col: 5, offset: 9803},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 462, col: 9, offset: 9807},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 462, col: 24, offset: 9822},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 462, col: 29, offset: 9827},
								name: "MicroSecondUnits",
							},
						},
						&labeledExpr{
							pos:   position{line: 462, col: 46, offset: 9844},
							label: "otherParts",
							expr: &zeroOrOneExpr{
								pos: position{line: 462, col: 57, offset: 9855},
								expr: &ruleRefExpr{
									pos:  position{line: 463, col: 7, offset: 9863},
									name: "NanoSecondDuration",
								},
							},
						},
					},
				},
			},
		},
		{
			name: "NanoSecondDuration",
			pos:  position{line: 468, col: 1, offset: 9971},
			expr: &actionExpr{
				pos: position{line: 469, col: 5, offset: 9994},
				run: (*parser).callonNanoSecondDuration1,
				expr: &seqExpr{
					pos: position{line: 469, col: 5, offset: 9994},
					exprs: []interface{}{
						&labeledExpr{
							pos:   position{line: 469, col: 5, offset: 9994},
							label: "mag",
							expr: &ruleRefExpr{
								pos:  position{line: 469, col: 9, offset: 9998},
								name: "IntegerLiteral",
							},
						},
						&labeledExpr{
							pos:   position{line: 469, col: 24, offset: 10013},
							label: "unit",
							expr: &ruleRefExpr{
								pos:  position{line: 469, col: 29, offset: 10018},
								name: "NanoSecondUnits",
							},
						},
					},
				},
			},
		},
		{
			name: "NanoSecondUnits",
			pos:  position{line: 473, col: 1, offset: 10109},
			expr: &litMatcher{
				pos:        position{line: 474, col: 5, offset: 10129},
				val:        "ns",
				ignoreCase: false,
			},
		},
		{
			name: "MicroSecondUnits",
			pos:  position{line: 476, col: 1, offset: 10135},
			expr: &actionExpr{
				pos: position{line: 477, col: 5, offset: 10156},
				run: (*parser).callonMicroSecondUnits1,
				expr: &choiceExpr{
					pos: position{line: 477, col: 6, offset: 10157},
					alternatives: []interface{}{
						&litMatcher{
							pos:        position{line: 477, col: 6, offset: 10157},
							val:        "us",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 477, col: 13, offset: 10164},
							val:        "µs",
							ignoreCase: false,
						},
						&litMatcher{
							pos:        position{line: 477, col: 20, offset: 10172},
							val:        "μs",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "MilliSecondUnits",
			pos:  position{line: 481, col: 1, offset: 10219},
			expr: &litMatcher{
				pos:        position{line: 482, col: 5, offset: 10240},
				val:        "ms",
				ignoreCase: false,
			},
		},
		{
			name: "SecondUnits",
			pos:  position{line: 484, col: 1, offset: 10246},
			expr: &litMatcher{
				pos:        position{line: 485, col: 5, offset: 10262},
				val:        "s",
				ignoreCase: false,
			},
		},
		{
			name: "MinuteUnits",
			pos:  position{line: 487, col: 1, offset: 10267},
			expr: &litMatcher{
				pos:        position{line: 488, col: 5, offset: 10283},
				val:        "m",
				ignoreCase: false,
			},
		},
		{
			name: "HourUnits",
			pos:  position{line: 490, col: 1, offset: 10288},
			expr: &litMatcher{
				pos:        position{line: 491, col: 5, offset: 10302},
				val:        "h",
				ignoreCase: false,
			},
		},
		{
			name: "DayUnits",
			pos:  position{line: 493, col: 1, offset: 10307},
			expr: &litMatcher{
				pos:        position{line: 494, col: 5, offset: 10320},
				val:        "d",
				ignoreCase: false,
			},
		},
		{
			name: "WeekUnits",
			pos:  position{line: 496, col: 1, offset: 10325},
			expr: &litMatcher{
				pos:        position{line: 497, col: 5, offset: 10339},
				val:        "w",
				ignoreCase: false,
			},
		},
		{
			name: "MonthUnits",
			pos:  position{line: 499, col: 1, offset: 10344},
			expr: &litMatcher{
				pos:        position{line: 500, col: 5, offset: 10359},
				val:        "mo",
				ignoreCase: false,
			},
		},
		{
			name: "YearUnits",
			pos:  position{line: 502, col: 1, offset: 10365},
			expr: &litMatcher{
				pos:        position{line: 503, col: 5, offset: 10379},
				val:        "y",
				ignoreCase: false,
			},
		},
		{
			name: "StringLiteral",
			pos:  position{line: 505, col: 1, offset: 10384},
			expr: &choiceExpr{
				pos: position{line: 506, col: 5, offset: 10402},
				alternatives: []interface{}{
					&actionExpr{
						pos: position{line: 506, col: 5, offset: 10402},
						run: (*parser).callonStringLiteral2,
						expr: &seqExpr{
							pos: position{line: 506, col: 7, offset: 10404},
							exprs: []interface{}{
								&litMatcher{
									pos:        position{line: 506, col: 7, offset: 10404},
									val:        "\"",
									ignoreCase: false,
								},
								&zeroOrMoreExpr{
									pos: position{line: 506, col: 11, offset: 10408},
									expr: &ruleRefExpr{
										pos:  position{line: 506, col: 11, offset: 10408},
										name: "DoubleStringChar",
									},
								},
								&litMatcher{
									pos:        position{line: 506, col: 29, offset: 10426},
									val:        "\"",
									ignoreCase: false,
								},
							},
						},
					},
					&actionExpr{
						pos: position{line: 509, col: 5, offset: 10486},
						run: (*parser).callonStringLiteral8,
						expr: &seqExpr{
							pos: position{line: 509, col: 7, offset: 10488},
							exprs: []interface{}{
								&litMatcher{
									pos:        position{line: 509, col: 7, offset: 10488},
									val:        "\"",
									ignoreCase: false,
								},
								&zeroOrMoreExpr{
									pos: position{line: 509, col: 11, offset: 10492},
									expr: &ruleRefExpr{
										pos:  position{line: 509, col: 11, offset: 10492},
										name: "DoubleStringChar",
									},
								},
								&choiceExpr{
									pos: position{line: 509, col: 31, offset: 10512},
									alternatives: []interface{}{
										&ruleRefExpr{
											pos:  position{line: 509, col: 31, offset: 10512},
											name: "EOL",
										},
										&ruleRefExpr{
											pos:  position{line: 509, col: 37, offset: 10518},
											name: "EOF",
										},
									},
								},
							},
						},
					},
				},
			},
		},
		{
			name: "DoubleStringChar",
			pos:  position{line: 513, col: 1, offset: 10596},
			expr: &choiceExpr{
				pos: position{line: 514, col: 5, offset: 10617},
				alternatives: []interface{}{
					&seqExpr{
						pos: position{line: 514, col: 5, offset: 10617},
						exprs: []interface{}{
							&notExpr{
								pos: position{line: 514, col: 5, offset: 10617},
								expr: &choiceExpr{
									pos: position{line: 514, col: 8, offset: 10620},
									alternatives: []interface{}{
										&litMatcher{
											pos:        position{line: 514, col: 8, offset: 10620},
											val:        "\"",
											ignoreCase: false,
										},
										&litMatcher{
											pos:        position{line: 514, col: 14, offset: 10626},
											val:        "\\",
											ignoreCase: false,
										},
										&ruleRefExpr{
											pos:  position{line: 514, col: 21, offset: 10633},
											name: "EOL",
										},
									},
								},
							},
							&ruleRefExpr{
								pos:  position{line: 514, col: 27, offset: 10639},
								name: "SourceChar",
							},
						},
					},
					&seqExpr{
						pos: position{line: 515, col: 5, offset: 10654},
						exprs: []interface{}{
							&litMatcher{
								pos:        position{line: 515, col: 5, offset: 10654},
								val:        "\\",
								ignoreCase: false,
							},
							&ruleRefExpr{
								pos:  position{line: 515, col: 10, offset: 10659},
								name: "DoubleStringEscape",
							},
						},
					},
				},
			},
		},
		{
			name: "DoubleStringEscape",
			pos:  position{line: 517, col: 1, offset: 10679},
			expr: &choiceExpr{
				pos: position{line: 518, col: 5, offset: 10702},
				alternatives: []interface{}{
					&litMatcher{
						pos:        position{line: 518, col: 5, offset: 10702},
						val:        "\"",
						ignoreCase: false,
					},
					&actionExpr{
						pos: position{line: 519, col: 5, offset: 10710},
						run: (*parser).callonDoubleStringEscape3,
						expr: &choiceExpr{
							pos: position{line: 519, col: 7, offset: 10712},
							alternatives: []interface{}{
								&ruleRefExpr{
									pos:  position{line: 519, col: 7, offset: 10712},
									name: "SourceChar",
								},
								&ruleRefExpr{
									pos:  position{line: 519, col: 20, offset: 10725},
									name: "EOL",
								},
								&ruleRefExpr{
									pos:  position{line: 519, col: 26, offset: 10731},
									name: "EOF",
								},
							},
						},
					},
				},
			},
		},
		{
			name: "RegexpLiteral",
			pos:  position{line: 524, col: 1, offset: 10804},
			expr: &actionExpr{
				pos: position{line: 525, col: 5, offset: 10822},
				run: (*parser).callonRegexpLiteral1,
				expr: &seqExpr{
					pos: position{line: 525, col: 5, offset: 10822},
					exprs: []interface{}{
						&litMatcher{
							pos:        position{line: 525, col: 5, offset: 10822},
							val:        "/",
							ignoreCase: false,
						},
						&labeledExpr{
							pos:   position{line: 525, col: 9, offset: 10826},
							label: "pattern",
							expr: &ruleRefExpr{
								pos:  position{line: 525, col: 17, offset: 10834},
								name: "RegexpBody",
							},
						},
						&litMatcher{
							pos:        position{line: 525, col: 28, offset: 10845},
							val:        "/",
							ignoreCase: false,
						},
					},
				},
			},
		},
		{
			name: "RegexpBody",
			pos:  position{line: 529, col: 1, offset: 10888},
			expr: &actionExpr{
				pos: position{line: 530, col: 5, offset: 10903},
				run: (*parser).callonRegexpBody1,
				expr: &labeledExpr{
					pos:   position{line: 530, col: 5, offset: 10903},
					label: "chars",
					expr: &oneOrMoreExpr{
						pos: position{line: 530, col: 11, offset: 10909},
						expr: &ruleRefExpr{
							pos:  position{line: 530, col: 11, offset: 10909},
							name: "RegexpChar",
						},
					},
				},
			},
		},
		{
			name: "RegexpChar",
			pos:  position{line: 534, col: 1, offset: 10978},
			expr: &choiceExpr{
				pos: position{line: 535, col: 5, offset: 10993},
				alternatives: []interface{}{
					&actionExpr{
						pos: position{line: 535, col: 5, offset: 10993},
						run: (*parser).callonRegexpChar2,
						expr: &seqExpr{
							pos: position{line: 535, col: 5, offset: 10993},
							exprs: []interface{}{
								&notExpr{
									pos: position{line: 535, col: 5, offset: 10993},
									expr: &charClassMatcher{
										pos:        position{line: 535, col: 6, offset: 10994},
										val:        "[\\\\/]",
										chars:      []rune{'\\', '/'},
										ignoreCase: false,
										inverted:   false,
									},
								},
								&labeledExpr{
									pos:   position{line: 535, col: 12, offset: 11000},
									label: "re",
									expr: &ruleRefExpr{
										pos:  position{line: 535, col: 15, offset: 11003},
										name: "RegexpNonTerminator",
									},
								},
							},
						},
					},
					&ruleRefExpr{
						pos:  position{line: 538, col: 5, offset: 11056},
						name: "RegexpBackslashSequence",
					},
				},
			},
		},
		{
			name: "RegexpBackslashSequence",
			pos:  position{line: 540, col: 1, offset: 11081},
			expr: &choiceExpr{
				pos: position{line: 541, col: 5, offset: 11109},
				alternatives: []interface{}{
					&actionExpr{
						pos: position{line: 541, col: 5, offset: 11109},
						run: (*parser).callonRegexpBackslashSequence2,
						expr: &litMatcher{
							pos:        position{line: 541, col: 5, offset: 11109},
							val:        "\\/",
							ignoreCase: false,
						},
					},
					&actionExpr{
						pos: position{line: 544, col: 5, offset: 11157},
						run: (*parser).callonRegexpBackslashSequence4,
						expr: &seqExpr{
							pos: position{line: 544, col: 5, offset: 11157},
							exprs: []interface{}{
								&litMatcher{
									pos:        position{line: 544, col: 5, offset: 11157},
									val:        "\\",
									ignoreCase: false,
								},
								&ruleRefExpr{
									pos:  position{line: 544, col: 10, offset: 11162},
									name: "RegexpNonTerminator",
								},
							},
						},
					},
				},
			},
		},
		{
			name: "RegexpNonTerminator",
			pos:  position{line: 548, col: 1, offset: 11216},
			expr: &actionExpr{
				pos: position{line: 549, col: 5, offset: 11240},
				run: (*parser).callonRegexpNonTerminator1,
				expr: &seqExpr{
					pos: position{line: 549, col: 5, offset: 11240},
					exprs: []interface{}{
						&notExpr{
							pos: position{line: 549, col: 5, offset: 11240},
							expr: &ruleRefExpr{
								pos:  position{line: 549, col: 6, offset: 11241},
								name: "LineTerminator",
							},
						},
						&ruleRefExpr{
							pos:  position{line: 549, col: 21, offset: 11256},
							name: "SourceChar",
						},
					},
				},
			},
		},
		{
			name: "BooleanLiteral",
			pos:  position{line: 553, col: 1, offset: 11301},
			expr: &choiceExpr{
				pos: position{line: 554, col: 5, offset: 11320},
				alternatives: []interface{}{
					&actionExpr{
						pos: position{line: 554, col: 5, offset: 11320},
						run: (*parser).callonBooleanLiteral2,
						expr: &seqExpr{
							pos: position{line: 554, col: 5, offset: 11320},
							exprs: []interface{}{
								&ruleRefExpr{
									pos:  position{line: 554, col: 5, offset: 11320},
									name: "__",
								},
								&litMatcher{
									pos:        position{line: 554, col: 8, offset: 11323},
									val:        "true",
									ignoreCase: false,
								},
								&ruleRefExpr{
									pos:  position{line: 554, col: 15, offset: 11330},
									name: "__",
								},
							},
						},
					},
					&actionExpr{
						pos: position{line: 557, col: 5, offset: 11394},
						run: (*parser).callonBooleanLiteral7,
						expr: &seqExpr{
							pos: position{line: 557, col: 5, offset: 11394},
							exprs: []interface{}{
								&ruleRefExpr{
									pos:  position{line: 557, col: 5, offset: 11394},
									name: "__",
								},
								&litMatcher{
									pos:        position{line: 557, col: 8, offset: 11397},
									val:        "false",
									ignoreCase: false,
								},
								&ruleRefExpr{
									pos:  position{line: 557, col: 16, offset: 11405},
									name: "__",
								},
							},
						},
					},
				},
			},
		},
		{
			name: "NumberLiteral",
			pos:  position{line: 561, col: 1, offset: 11467},
			expr: &actionExpr{
				pos: position{line: 562, col: 5, offset: 11485},
				run: (*parser).callonNumberLiteral1,
				expr: &seqExpr{
					pos: position{line: 562, col: 5, offset: 11485},
					exprs: []interface{}{
						&ruleRefExpr{
							pos:  position{line: 562, col: 5, offset: 11485},
							name: "Integer",
						},
						&litMatcher{
							pos:        position{line: 562, col: 13, offset: 11493},
							val:        ".",
							ignoreCase: false,
						},
						&oneOrMoreExpr{
							pos: position{line: 562, col: 17, offset: 11497},
							expr: &ruleRefExpr{
								pos:  position{line: 562, col: 17, offset: 11497},
								name: "Digit",
							},
						},
					},
				},
			},
		},
		{
			name: "Integer",
			pos:  position{line: 566, col: 1, offset: 11554},
			expr: &choiceExpr{
				pos: position{line: 567, col: 6, offset: 11567},
				alternatives: []interface{}{
					&litMatcher{
						pos:        position{line: 567, col: 6, offset: 11567},
						val:        "0",
						ignoreCase: false,
					},
					&seqExpr{
						pos: position{line: 567, col: 12, offset: 11573},
						exprs: []interface{}{
							&ruleRefExpr{
								pos:  position{line: 567, col: 12, offset: 11573},
								name: "NonZeroDigit",
							},
							&zeroOrMoreExpr{
								pos: position{line: 567, col: 25, offset: 11586},
								expr: &ruleRefExpr{
									pos:  position{line: 567, col: 25, offset: 11586},
									name: "Digit",
								},
							},
						},
					},
				},
			},
		},
		{
			name: "IntegerLiteral",
			pos:  position{line: 569, col: 1, offset: 11595},
			expr: &actionExpr{
				pos: position{line: 570, col: 5, offset: 11614},
				run: (*parser).callonIntegerLiteral1,
				expr: &ruleRefExpr{
					pos:  position{line: 570, col: 5, offset: 11614},
					name: "Integer",
				},
			},
		},
		{
			name: "NonZeroDigit",
			pos:  position{line: 574, col: 1, offset: 11674},
			expr: &charClassMatcher{
				pos:        position{line: 575, col: 5, offset: 11691},
				val:        "[1-9]",
				ranges:     []rune{'1', '9'},
				ignoreCase: false,
				inverted:   false,
			},
		},
		{
			name: "Digit",
			pos:  position{line: 577, col: 1, offset: 11698},
			expr: &charClassMatcher{
				pos:        position{line: 578, col: 5, offset: 11708},
				val:        "[0-9]",
				ranges:     []rune{'0', '9'},
				ignoreCase: false,
				inverted:   false,
			},
		},
		{
			name: "PipeLiteral",
			pos:  position{line: 580, col: 1, offset: 11715},
			expr: &actionExpr{
				pos: position{line: 581, col: 5, offset: 11731},
				run: (*parser).callonPipeLiteral1,
				expr: &litMatcher{
					pos:        position{line: 581, col: 5, offset: 11731},
					val:        "<-",
					ignoreCase: false,
				},
			},
		},
		{
			name: "Identifier",
			pos:  position{line: 586, col: 1, offset: 11795},
			expr: &actionExpr{
				pos: position{line: 588, col: 5, offset: 11917},
				run: (*parser).callonIdentifier1,
				expr: &seqExpr{
					pos: position{line: 588, col: 5, offset: 11917},
					exprs: []interface{}{
						&charClassMatcher{
							pos:        position{line: 588, col: 5, offset: 11917},
							val:        "[_\\pL]",
							chars:      []rune{'_'},
							classes:    []*unicode.RangeTable{rangeTable("L")},
							ignoreCase: false,
							inverted:   false,
						},
						&zeroOrMoreExpr{
							pos: position{line: 588, col: 11, offset: 11923},
							expr: &charClassMatcher{
								pos:        position{line: 588, col: 11, offset: 11923},
								val:        "[_0-9\\pL]",
								chars:      []rune{'_'},
								ranges:     []rune{'0', '9'},
								classes:    []*unicode.RangeTable{rangeTable("L")},
								ignoreCase: false,
								inverted:   false,
							},
						},
					},
				},
			},
		},
		{
			name: "SourceChar",
			pos:  position{line: 593, col: 1, offset: 11983},
			expr: &anyMatcher{
				line: 594, col: 5, offset: 11998,
			},
		},
		{
			name: "__",
			pos:  position{line: 595, col: 1, offset: 12000},
			expr: &zeroOrMoreExpr{
				pos: position{line: 596, col: 5, offset: 12007},
				expr: &choiceExpr{
					pos: position{line: 596, col: 7, offset: 12009},
					alternatives: []interface{}{
						&ruleRefExpr{
							pos:  position{line: 596, col: 7, offset: 12009},
							name: "ws",
						},
						&ruleRefExpr{
							pos:  position{line: 596, col: 12, offset: 12014},
							name: "EOL",
						},
						&ruleRefExpr{
							pos:  position{line: 596, col: 18, offset: 12020},
							name: "Comment",
						},
					},
				},
			},
		},
		{
			name: "Comment",
			pos:  position{line: 598, col: 1, offset: 12032},
			expr: &seqExpr{
				pos: position{line: 599, col: 5, offset: 12044},
				exprs: []interface{}{
					&litMatcher{
						pos:        position{line: 599, col: 5, offset: 12044},
						val:        "//",
						ignoreCase: false,
					},
					&zeroOrMoreExpr{
						pos: position{line: 599, col: 10, offset: 12049},
						expr: &charClassMatcher{
							pos:        position{line: 599, col: 10, offset: 12049},
							val:        "[^\\r\\n]",
							chars:      []rune{'\r', '\n'},
							ignoreCase: false,
							inverted:   true,
						},
					},
					&ruleRefExpr{
						pos:  position{line: 599, col: 19, offset: 12058},
						name: "EOL",
					},
				},
			},
		},
		{
			name: "ws",
			pos:  position{line: 601, col: 1, offset: 12063},
			expr: &charClassMatcher{
				pos:        position{line: 602, col: 5, offset: 12070},
				val:        "[ \\t\\r\\n]",
				chars:      []rune{' ', '\t', '\r', '\n'},
				ignoreCase: false,
				inverted:   false,
			},
		},
		{
			name: "LineTerminator",
			pos:  position{line: 604, col: 1, offset: 12081},
			expr: &charClassMatcher{
				pos:        position{line: 605, col: 5, offset: 12100},
				val:        "[\\n\\r]",
				chars:      []rune{'\n', '\r'},
				ignoreCase: false,
				inverted:   false,
			},
		},
		{
			name: "EOL",
			pos:  position{line: 607, col: 1, offset: 12108},
			expr: &litMatcher{
				pos:        position{line: 608, col: 5, offset: 12116},
				val:        "\n",
				ignoreCase: false,
			},
		},
		{
			name: "EOF",
			pos:  position{line: 610, col: 1, offset: 12122},
			expr: &notExpr{
				pos: position{line: 611, col: 5, offset: 12130},
				expr: &anyMatcher{
					line: 611, col: 6, offset: 12131,
				},
			},
		},
	},
}

func (c *current) onStart1(program interface{}) (interface{}, error) {
	return program, nil

}

func (p *parser) callonStart1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onStart1(stack["program"])
}

func (c *current) onProgram1(body interface{}) (interface{}, error) {
	return program(body, c.text, c.pos)

}

func (p *parser) callonProgram1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onProgram1(stack["body"])
}

func (c *current) onSourceElements1(head, tail interface{}) (interface{}, error) {
	return srcElems(head, tail)

}

func (p *parser) callonSourceElements1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onSourceElements1(stack["head"], stack["tail"])
}

func (c *current) onOptionStatement1(id, expr interface{}) (interface{}, error) {
	return optionstmt(id, expr, c.text, c.pos)

}

func (p *parser) callonOptionStatement1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onOptionStatement1(stack["id"], stack["expr"])
}

func (c *current) onVariableStatement1(declaration interface{}) (interface{}, error) {
	return varstmt(declaration, c.text, c.pos)

}

func (p *parser) callonVariableStatement1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onVariableStatement1(stack["declaration"])
}

func (c *current) onReturnStatement1(argument interface{}) (interface{}, error) {
	return returnstmt(argument, c.text, c.pos)

}

func (p *parser) callonReturnStatement1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onReturnStatement1(stack["argument"])
}

func (c *current) onExpressionStatement1(expr interface{}) (interface{}, error) {
	return exprstmt(expr, c.text, c.pos)

}

func (p *parser) callonExpressionStatement1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onExpressionStatement1(stack["expr"])
}

func (c *current) onBlockStatement1(body interface{}) (interface{}, error) {
	return blockstmt(body, c.text, c.pos)

}

func (p *parser) callonBlockStatement1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onBlockStatement1(stack["body"])
}

func (c *current) onVariableDeclaration1(id, init interface{}) (interface{}, error) {
	return vardecl(id, init, c.text, c.pos)

}

func (p *parser) callonVariableDeclaration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onVariableDeclaration1(stack["id"], stack["init"])
}

func (c *current) onMemberExpressions7(property interface{}) (interface{}, error) {
	return property, nil

}

func (p *parser) callonMemberExpressions7() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMemberExpressions7(stack["property"])
}

func (c *current) onMemberExpressions1(head, tail interface{}) (interface{}, error) {
	return memberexprs(head, tail, c.text, c.pos)

}

func (p *parser) callonMemberExpressions1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMemberExpressions1(stack["head"], stack["tail"])
}

func (c *current) onMemberExpressionProperty2(property interface{}) (interface{}, error) {
	return memberExprFromIdentifier(property)

}

func (p *parser) callonMemberExpressionProperty2() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMemberExpressionProperty2(stack["property"])
}

func (c *current) onMemberExpressionProperty7(property interface{}) (interface{}, error) {
	return memberExprFromStringLiteral(property)

}

func (p *parser) callonMemberExpressionProperty7() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMemberExpressionProperty7(stack["property"])
}

func (c *current) onMemberExpressionProperty15(property interface{}) (interface{}, error) {
	return indexExpr(property)

}

func (p *parser) callonMemberExpressionProperty15() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMemberExpressionProperty15(stack["property"])
}

func (c *current) onCallExpression4(callee, args interface{}) (interface{}, error) {
	return callexpr(callee, args, c.text, c.pos)

}

func (p *parser) callonCallExpression4() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onCallExpression4(stack["callee"], stack["args"])
}

func (c *current) onCallExpression14(args interface{}) (interface{}, error) {
	return callexpr(nil, args, c.text, c.pos)

}

func (p *parser) callonCallExpression14() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onCallExpression14(stack["args"])
}

func (c *current) onCallExpression19(property interface{}) (interface{}, error) {
	return property, nil

}

func (p *parser) callonCallExpression19() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onCallExpression19(stack["property"])
}

func (c *current) onCallExpression1(head, tail interface{}) (interface{}, error) {
	return callexprs(head, tail, c.text, c.pos)

}

func (p *parser) callonCallExpression1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onCallExpression1(stack["head"], stack["tail"])
}

func (c *current) onPipeExpression1(head, tail interface{}) (interface{}, error) {
	return pipeExprs(head, tail, c.text, c.pos)

}

func (p *parser) callonPipeExpression1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onPipeExpression1(stack["head"], stack["tail"])
}

func (c *current) onPipeExpressionPipe1(call interface{}) (interface{}, error) {
	return incompletePipeExpr(call, c.text, c.pos)

}

func (p *parser) callonPipeExpressionPipe1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onPipeExpressionPipe1(stack["call"])
}

func (c *current) onArguments1(args interface{}) (interface{}, error) {
	return args, nil

}

func (p *parser) callonArguments1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArguments1(stack["args"])
}

func (c *current) onArrowFunctionExpression1(params, body interface{}) (interface{}, error) {
	return arrowfunc(params, body, c.text, c.pos), nil

}

func (p *parser) callonArrowFunctionExpression1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrowFunctionExpression1(stack["params"], stack["body"])
}

func (c *current) onArrowFunctionParams1(first, rest interface{}) (interface{}, error) {
	return append([]interface{}{first}, toIfaceSlice(rest)...), nil

}

func (p *parser) callonArrowFunctionParams1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrowFunctionParams1(stack["first"], stack["rest"])
}

func (c *current) onArrowFunctionParamsRest1(arg interface{}) (interface{}, error) {
	return arg, nil

}

func (p *parser) callonArrowFunctionParamsRest1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrowFunctionParamsRest1(stack["arg"])
}

func (c *current) onArrowFunctionParam2(key, value interface{}) (interface{}, error) {
	return property(key, value, c.text, c.pos)

}

func (p *parser) callonArrowFunctionParam2() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrowFunctionParam2(stack["key"], stack["value"])
}

func (c *current) onArrowFunctionParam12(key interface{}) (interface{}, error) {
	return property(key, nil, c.text, c.pos)

}

func (p *parser) callonArrowFunctionParam12() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrowFunctionParam12(stack["key"])
}

func (c *current) onArrowFunctionBody2(body interface{}) (interface{}, error) {
	return body, nil

}

func (p *parser) callonArrowFunctionBody2() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrowFunctionBody2(stack["body"])
}

func (c *current) onArrowFunctionBody5(body interface{}) (interface{}, error) {
	return body, nil

}

func (p *parser) callonArrowFunctionBody5() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrowFunctionBody5(stack["body"])
}

func (c *current) onObjectExpression1(object interface{}) (interface{}, error) {
	return object, nil

}

func (p *parser) callonObjectExpression1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onObjectExpression1(stack["object"])
}

func (c *current) onObjectProperties1(first, rest interface{}) (interface{}, error) {
	return objectexpr(first, rest, c.text, c.pos)

}

func (p *parser) callonObjectProperties1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onObjectProperties1(stack["first"], stack["rest"])
}

func (c *current) onPropertiesRest1(arg interface{}) (interface{}, error) {
	return arg, nil

}

func (p *parser) callonPropertiesRest1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onPropertiesRest1(stack["arg"])
}

func (c *current) onProperty1(key, value interface{}) (interface{}, error) {
	return property(key, value, c.text, c.pos)

}

func (p *parser) callonProperty1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onProperty1(stack["key"], stack["value"])
}

func (c *current) onLogicalOperators1() (interface{}, error) {
	return logicalOp(c.text)

}

func (p *parser) callonLogicalOperators1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onLogicalOperators1()
}

func (c *current) onLogicalExpression1(head, tail interface{}) (interface{}, error) {
	return logicalExpression(head, tail, c.text, c.pos)

}

func (p *parser) callonLogicalExpression1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onLogicalExpression1(stack["head"], stack["tail"])
}

func (c *current) onEqualityOperators1() (interface{}, error) {
	return operator(c.text)

}

func (p *parser) callonEqualityOperators1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onEqualityOperators1()
}

func (c *current) onEquality1(head, tail interface{}) (interface{}, error) {
	return binaryExpression(head, tail, c.text, c.pos)

}

func (p *parser) callonEquality1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onEquality1(stack["head"], stack["tail"])
}

func (c *current) onRelationalOperators1() (interface{}, error) {
	return operator(c.text)

}

func (p *parser) callonRelationalOperators1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onRelationalOperators1()
}

func (c *current) onRelational1(head, tail interface{}) (interface{}, error) {
	return binaryExpression(head, tail, c.text, c.pos)

}

func (p *parser) callonRelational1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onRelational1(stack["head"], stack["tail"])
}

func (c *current) onAdditiveOperator1() (interface{}, error) {
	return operator(c.text)

}

func (p *parser) callonAdditiveOperator1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onAdditiveOperator1()
}

func (c *current) onAdditive1(head, tail interface{}) (interface{}, error) {
	return binaryExpression(head, tail, c.text, c.pos)

}

func (p *parser) callonAdditive1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onAdditive1(stack["head"], stack["tail"])
}

func (c *current) onMultiplicativeOperator1() (interface{}, error) {
	return operator(c.text)

}

func (p *parser) callonMultiplicativeOperator1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMultiplicativeOperator1()
}

func (c *current) onMultiplicative1(head, tail interface{}) (interface{}, error) {
	return binaryExpression(head, tail, c.text, c.pos)

}

func (p *parser) callonMultiplicative1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMultiplicative1(stack["head"], stack["tail"])
}

func (c *current) onUnaryOperator1() (interface{}, error) {
	return operator(c.text)

}

func (p *parser) callonUnaryOperator1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onUnaryOperator1()
}

func (c *current) onUnaryExpression2(op, argument interface{}) (interface{}, error) {
	return unaryExpression(op, argument, c.text, c.pos)

}

func (p *parser) callonUnaryExpression2() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onUnaryExpression2(stack["op"], stack["argument"])
}

func (c *current) onParens1(expr interface{}) (interface{}, error) {
	return expr, nil

}

func (p *parser) callonParens1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onParens1(stack["expr"])
}

func (c *current) onArray1(elements interface{}) (interface{}, error) {
	return elements, nil

}

func (p *parser) callonArray1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArray1(stack["elements"])
}

func (c *current) onArrayElements1(first, rest interface{}) (interface{}, error) {
	return array(first, rest, c.text, c.pos), nil

}

func (p *parser) callonArrayElements1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrayElements1(stack["first"], stack["rest"])
}

func (c *current) onArrayRest1(element interface{}) (interface{}, error) {
	return element, nil

}

func (p *parser) callonArrayRest1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onArrayRest1(stack["element"])
}

func (c *current) onDateTimeLiteral1() (interface{}, error) {
	return datetime(c.text, c.pos)

}

func (p *parser) callonDateTimeLiteral1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onDateTimeLiteral1()
}

func (c *current) onDurationLiteral1(durations interface{}) (interface{}, error) {
	return durationLiteral(durations, c.text, c.pos)

}

func (p *parser) callonDurationLiteral1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onDurationLiteral1(stack["durations"])
}

func (c *current) onYearDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonYearDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onYearDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onMonthDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonMonthDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMonthDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onWeekDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonWeekDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onWeekDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onDayDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonDayDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onDayDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onHourDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonHourDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onHourDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onMinuteDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonMinuteDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMinuteDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onSecondDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonSecondDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onSecondDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onMilliSecondDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonMilliSecondDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMilliSecondDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onMicroSecondDuration1(mag, unit, otherParts interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, otherParts, c.text, c.pos)

}

func (p *parser) callonMicroSecondDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMicroSecondDuration1(stack["mag"], stack["unit"], stack["otherParts"])
}

func (c *current) onNanoSecondDuration1(mag, unit interface{}) (interface{}, error) {
	return appendSingleDurations(mag, unit, nil, c.text, c.pos)

}

func (p *parser) callonNanoSecondDuration1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onNanoSecondDuration1(stack["mag"], stack["unit"])
}

func (c *current) onMicroSecondUnits1() (interface{}, error) {
	return []byte("us"), nil

}

func (p *parser) callonMicroSecondUnits1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onMicroSecondUnits1()
}

func (c *current) onStringLiteral2() (interface{}, error) {
	return stringLiteral(c.text, c.pos)

}

func (p *parser) callonStringLiteral2() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onStringLiteral2()
}

func (c *current) onStringLiteral8() (interface{}, error) {
	return "", errors.New("string literal not terminated")

}

func (p *parser) callonStringLiteral8() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onStringLiteral8()
}

func (c *current) onDoubleStringEscape3() (interface{}, error) {
	return nil, errors.New("invalid escape character")

}

func (p *parser) callonDoubleStringEscape3() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onDoubleStringEscape3()
}

func (c *current) onRegexpLiteral1(pattern interface{}) (interface{}, error) {
	return pattern, nil

}

func (p *parser) callonRegexpLiteral1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onRegexpLiteral1(stack["pattern"])
}

func (c *current) onRegexpBody1(chars interface{}) (interface{}, error) {
	return regexLiteral(chars, c.text, c.pos)

}

func (p *parser) callonRegexpBody1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onRegexpBody1(stack["chars"])
}

func (c *current) onRegexpChar2(re interface{}) (interface{}, error) {
	return re, nil

}

func (p *parser) callonRegexpChar2() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onRegexpChar2(stack["re"])
}

func (c *current) onRegexpBackslashSequence2() (interface{}, error) {
	return []byte{'/'}, nil

}

func (p *parser) callonRegexpBackslashSequence2() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onRegexpBackslashSequence2()
}

func (c *current) onRegexpBackslashSequence4() (interface{}, error) {
	return c.text, nil

}

func (p *parser) callonRegexpBackslashSequence4() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onRegexpBackslashSequence4()
}

func (c *current) onRegexpNonTerminator1() (interface{}, error) {
	return c.text, nil

}

func (p *parser) callonRegexpNonTerminator1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onRegexpNonTerminator1()
}

func (c *current) onBooleanLiteral2() (interface{}, error) {
	return booleanLiteral(true, c.text, c.pos)

}

func (p *parser) callonBooleanLiteral2() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onBooleanLiteral2()
}

func (c *current) onBooleanLiteral7() (interface{}, error) {
	return booleanLiteral(false, c.text, c.pos)

}

func (p *parser) callonBooleanLiteral7() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onBooleanLiteral7()
}

func (c *current) onNumberLiteral1() (interface{}, error) {
	return numberLiteral(c.text, c.pos)

}

func (p *parser) callonNumberLiteral1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onNumberLiteral1()
}

func (c *current) onIntegerLiteral1() (interface{}, error) {
	return integerLiteral(c.text, c.pos)

}

func (p *parser) callonIntegerLiteral1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onIntegerLiteral1()
}

func (c *current) onPipeLiteral1() (interface{}, error) {
	return pipeLiteral(c.text, c.pos), nil

}

func (p *parser) callonPipeLiteral1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onPipeLiteral1()
}

func (c *current) onIdentifier1() (interface{}, error) {
	return identifier(c.text, c.pos)

}

func (p *parser) callonIdentifier1() (interface{}, error) {
	stack := p.vstack[len(p.vstack)-1]
	_ = stack
	return p.cur.onIdentifier1()
}

var (
	// errNoRule is returned when the grammar to parse has no rule.
	errNoRule = errors.New("grammar has no rule")

	// errInvalidEntrypoint is returned when the specified entrypoint rule
	// does not exit.
	errInvalidEntrypoint = errors.New("invalid entrypoint")

	// errInvalidEncoding is returned when the source is not properly
	// utf8-encoded.
	errInvalidEncoding = errors.New("invalid encoding")

	// errMaxExprCnt is used to signal that the maximum number of
	// expressions have been parsed.
	errMaxExprCnt = errors.New("max number of expresssions parsed")
)

// Option is a function that can set an option on the parser. It returns
// the previous setting as an Option.
type Option func(*parser) Option

// MaxExpressions creates an Option to stop parsing after the provided
// number of expressions have been parsed, if the value is 0 then the parser will
// parse for as many steps as needed (possibly an infinite number).
//
// The default for maxExprCnt is 0.
func MaxExpressions(maxExprCnt uint64) Option {
	return func(p *parser) Option {
		oldMaxExprCnt := p.maxExprCnt
		p.maxExprCnt = maxExprCnt
		return MaxExpressions(oldMaxExprCnt)
	}
}

// Entrypoint creates an Option to set the rule name to use as entrypoint.
// The rule name must have been specified in the -alternate-entrypoints
// if generating the parser with the -optimize-grammar flag, otherwise
// it may have been optimized out. Passing an empty string sets the
// entrypoint to the first rule in the grammar.
//
// The default is to start parsing at the first rule in the grammar.
func Entrypoint(ruleName string) Option {
	return func(p *parser) Option {
		oldEntrypoint := p.entrypoint
		p.entrypoint = ruleName
		if ruleName == "" {
			p.entrypoint = g.rules[0].name
		}
		return Entrypoint(oldEntrypoint)
	}
}

// AllowInvalidUTF8 creates an Option to allow invalid UTF-8 bytes.
// Every invalid UTF-8 byte is treated as a utf8.RuneError (U+FFFD)
// by character class matchers and is matched by the any matcher.
// The returned matched value, c.text and c.offset are NOT affected.
//
// The default is false.
func AllowInvalidUTF8(b bool) Option {
	return func(p *parser) Option {
		old := p.allowInvalidUTF8
		p.allowInvalidUTF8 = b
		return AllowInvalidUTF8(old)
	}
}

// Recover creates an Option to set the recover flag to b. When set to
// true, this causes the parser to recover from panics and convert it
// to an error. Setting it to false can be useful while debugging to
// access the full stack trace.
//
// The default is true.
func Recover(b bool) Option {
	return func(p *parser) Option {
		old := p.recover
		p.recover = b
		return Recover(old)
	}
}

// GlobalStore creates an Option to set a key to a certain value in
// the globalStore.
func GlobalStore(key string, value interface{}) Option {
	return func(p *parser) Option {
		old := p.cur.globalStore[key]
		p.cur.globalStore[key] = value
		return GlobalStore(key, old)
	}
}

// ParseFile parses the file identified by filename.
func ParseFile(filename string, opts ...Option) (i interface{}, err error) {
	f, err := os.Open(filename)
	if err != nil {
		return nil, err
	}
	defer func() {
		if closeErr := f.Close(); closeErr != nil {
			err = closeErr
		}
	}()
	return ParseReader(filename, f, opts...)
}

// ParseReader parses the data from r using filename as information in the
// error messages.
func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) {
	b, err := ioutil.ReadAll(r)
	if err != nil {
		return nil, err
	}

	return Parse(filename, b, opts...)
}

// Parse parses the data from b using filename as information in the
// error messages.
func Parse(filename string, b []byte, opts ...Option) (interface{}, error) {
	return newParser(filename, b, opts...).parse(g)
}

// position records a position in the text.
type position struct {
	line, col, offset int
}

func (p position) String() string {
	return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset)
}

// savepoint stores all state required to go back to this point in the
// parser.
type savepoint struct {
	position
	rn rune
	w  int
}

type current struct {
	pos  position // start position of the match
	text []byte   // raw text of the match

	// globalStore is a general store for the user to store arbitrary key-value
	// pairs that they need to manage and that they do not want tied to the
	// backtracking of the parser. This is only modified by the user and never
	// rolled back by the parser. It is always up to the user to keep this in a
	// consistent state.
	globalStore storeDict
}

type storeDict map[string]interface{}

// the AST types...

type grammar struct {
	pos   position
	rules []*rule
}

type rule struct {
	pos         position
	name        string
	displayName string
	expr        interface{}
}

type choiceExpr struct {
	pos          position
	alternatives []interface{}
}

type actionExpr struct {
	pos  position
	expr interface{}
	run  func(*parser) (interface{}, error)
}

type recoveryExpr struct {
	pos          position
	expr         interface{}
	recoverExpr  interface{}
	failureLabel []string
}

type seqExpr struct {
	pos   position
	exprs []interface{}
}

type throwExpr struct {
	pos   position
	label string
}

type labeledExpr struct {
	pos   position
	label string
	expr  interface{}
}

type expr struct {
	pos  position
	expr interface{}
}

type andExpr expr
type notExpr expr
type zeroOrOneExpr expr
type zeroOrMoreExpr expr
type oneOrMoreExpr expr

type ruleRefExpr struct {
	pos  position
	name string
}

type andCodeExpr struct {
	pos position
	run func(*parser) (bool, error)
}

type notCodeExpr struct {
	pos position
	run func(*parser) (bool, error)
}

type litMatcher struct {
	pos        position
	val        string
	ignoreCase bool
}

type charClassMatcher struct {
	pos             position
	val             string
	basicLatinChars [128]bool
	chars           []rune
	ranges          []rune
	classes         []*unicode.RangeTable
	ignoreCase      bool
	inverted        bool
}

type anyMatcher position

// errList cumulates the errors found by the parser.
type errList []error

func (e *errList) add(err error) {
	*e = append(*e, err)
}

func (e errList) err() error {
	if len(e) == 0 {
		return nil
	}
	e.dedupe()
	return e
}

func (e *errList) dedupe() {
	var cleaned []error
	set := make(map[string]bool)
	for _, err := range *e {
		if msg := err.Error(); !set[msg] {
			set[msg] = true
			cleaned = append(cleaned, err)
		}
	}
	*e = cleaned
}

func (e errList) Error() string {
	switch len(e) {
	case 0:
		return ""
	case 1:
		return e[0].Error()
	default:
		var buf bytes.Buffer

		for i, err := range e {
			if i > 0 {
				buf.WriteRune('\n')
			}
			buf.WriteString(err.Error())
		}
		return buf.String()
	}
}

// parserError wraps an error with a prefix indicating the rule in which
// the error occurred. The original error is stored in the Inner field.
type parserError struct {
	Inner    error
	pos      position
	prefix   string
	expected []string
}

// Error returns the error message.
func (p *parserError) Error() string {
	return p.prefix + ": " + p.Inner.Error()
}

// newParser creates a parser with the specified input source and options.
func newParser(filename string, b []byte, opts ...Option) *parser {
	stats := Stats{
		ChoiceAltCnt: make(map[string]map[string]int),
	}

	p := &parser{
		filename: filename,
		errs:     new(errList),
		data:     b,
		pt:       savepoint{position: position{line: 1}},
		recover:  true,
		cur: current{
			globalStore: make(storeDict),
		},
		maxFailPos:      position{col: 1, line: 1},
		maxFailExpected: make([]string, 0, 20),
		Stats:           &stats,
		// start rule is rule [0] unless an alternate entrypoint is specified
		entrypoint: g.rules[0].name,
	}
	p.setOptions(opts)

	if p.maxExprCnt == 0 {
		p.maxExprCnt = math.MaxUint64
	}

	return p
}

// setOptions applies the options to the parser.
func (p *parser) setOptions(opts []Option) {
	for _, opt := range opts {
		opt(p)
	}
}

type resultTuple struct {
	v   interface{}
	b   bool
	end savepoint
}

const choiceNoMatch = -1

// Stats stores some statistics, gathered during parsing
type Stats struct {
	// ExprCnt counts the number of expressions processed during parsing
	// This value is compared to the maximum number of expressions allowed
	// (set by the MaxExpressions option).
	ExprCnt uint64

	// ChoiceAltCnt is used to count for each ordered choice expression,
	// which alternative is used how may times.
	// These numbers allow to optimize the order of the ordered choice expression
	// to increase the performance of the parser
	//
	// The outer key of ChoiceAltCnt is composed of the name of the rule as well
	// as the line and the column of the ordered choice.
	// The inner key of ChoiceAltCnt is the number (one-based) of the matching alternative.
	// For each alternative the number of matches are counted. If an ordered choice does not
	// match, a special counter is incremented. The name of this counter is set with
	// the parser option Statistics.
	// For an alternative to be included in ChoiceAltCnt, it has to match at least once.
	ChoiceAltCnt map[string]map[string]int
}

type parser struct {
	filename string
	pt       savepoint
	cur      current

	data []byte
	errs *errList

	depth   int
	recover bool

	// rules table, maps the rule identifier to the rule node
	rules map[string]*rule
	// variables stack, map of label to value
	vstack []map[string]interface{}
	// rule stack, allows identification of the current rule in errors
	rstack []*rule

	// parse fail
	maxFailPos            position
	maxFailExpected       []string
	maxFailInvertExpected bool

	// max number of expressions to be parsed
	maxExprCnt uint64
	// entrypoint for the parser
	entrypoint string

	allowInvalidUTF8 bool

	*Stats

	choiceNoMatch string
	// recovery expression stack, keeps track of the currently available recovery expression, these are traversed in reverse
	recoveryStack []map[string]interface{}
}

// push a variable set on the vstack.
func (p *parser) pushV() {
	if cap(p.vstack) == len(p.vstack) {
		// create new empty slot in the stack
		p.vstack = append(p.vstack, nil)
	} else {
		// slice to 1 more
		p.vstack = p.vstack[:len(p.vstack)+1]
	}

	// get the last args set
	m := p.vstack[len(p.vstack)-1]
	if m != nil && len(m) == 0 {
		// empty map, all good
		return
	}

	m = make(map[string]interface{})
	p.vstack[len(p.vstack)-1] = m
}

// pop a variable set from the vstack.
func (p *parser) popV() {
	// if the map is not empty, clear it
	m := p.vstack[len(p.vstack)-1]
	if len(m) > 0 {
		// GC that map
		p.vstack[len(p.vstack)-1] = nil
	}
	p.vstack = p.vstack[:len(p.vstack)-1]
}

// push a recovery expression with its labels to the recoveryStack
func (p *parser) pushRecovery(labels []string, expr interface{}) {
	if cap(p.recoveryStack) == len(p.recoveryStack) {
		// create new empty slot in the stack
		p.recoveryStack = append(p.recoveryStack, nil)
	} else {
		// slice to 1 more
		p.recoveryStack = p.recoveryStack[:len(p.recoveryStack)+1]
	}

	m := make(map[string]interface{}, len(labels))
	for _, fl := range labels {
		m[fl] = expr
	}
	p.recoveryStack[len(p.recoveryStack)-1] = m
}

// pop a recovery expression from the recoveryStack
func (p *parser) popRecovery() {
	// GC that map
	p.recoveryStack[len(p.recoveryStack)-1] = nil

	p.recoveryStack = p.recoveryStack[:len(p.recoveryStack)-1]
}

func (p *parser) addErr(err error) {
	p.addErrAt(err, p.pt.position, []string{})
}

func (p *parser) addErrAt(err error, pos position, expected []string) {
	var buf bytes.Buffer
	if p.filename != "" {
		buf.WriteString(p.filename)
	}
	if buf.Len() > 0 {
		buf.WriteString(":")
	}
	buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset))
	if len(p.rstack) > 0 {
		if buf.Len() > 0 {
			buf.WriteString(": ")
		}
		rule := p.rstack[len(p.rstack)-1]
		if rule.displayName != "" {
			buf.WriteString("rule " + rule.displayName)
		} else {
			buf.WriteString("rule " + rule.name)
		}
	}
	pe := &parserError{Inner: err, pos: pos, prefix: buf.String(), expected: expected}
	p.errs.add(pe)
}

func (p *parser) failAt(fail bool, pos position, want string) {
	// process fail if parsing fails and not inverted or parsing succeeds and invert is set
	if fail == p.maxFailInvertExpected {
		if pos.offset < p.maxFailPos.offset {
			return
		}

		if pos.offset > p.maxFailPos.offset {
			p.maxFailPos = pos
			p.maxFailExpected = p.maxFailExpected[:0]
		}

		if p.maxFailInvertExpected {
			want = "!" + want
		}
		p.maxFailExpected = append(p.maxFailExpected, want)
	}
}

// read advances the parser to the next rune.
func (p *parser) read() {
	p.pt.offset += p.pt.w
	rn, n := utf8.DecodeRune(p.data[p.pt.offset:])
	p.pt.rn = rn
	p.pt.w = n
	p.pt.col++
	if rn == '\n' {
		p.pt.line++
		p.pt.col = 0
	}

	if rn == utf8.RuneError && n == 1 { // see utf8.DecodeRune
		if !p.allowInvalidUTF8 {
			p.addErr(errInvalidEncoding)
		}
	}
}

// restore parser position to the savepoint pt.
func (p *parser) restore(pt savepoint) {
	if pt.offset == p.pt.offset {
		return
	}
	p.pt = pt
}

// get the slice of bytes from the savepoint start to the current position.
func (p *parser) sliceFrom(start savepoint) []byte {
	return p.data[start.position.offset:p.pt.position.offset]
}

func (p *parser) buildRulesTable(g *grammar) {
	p.rules = make(map[string]*rule, len(g.rules))
	for _, r := range g.rules {
		p.rules[r.name] = r
	}
}

func (p *parser) parse(g *grammar) (val interface{}, err error) {
	if len(g.rules) == 0 {
		p.addErr(errNoRule)
		return nil, p.errs.err()
	}

	// TODO : not super critical but this could be generated
	p.buildRulesTable(g)

	if p.recover {
		// panic can be used in action code to stop parsing immediately
		// and return the panic as an error.
		defer func() {
			if e := recover(); e != nil {
				val = nil
				switch e := e.(type) {
				case error:
					p.addErr(e)
				default:
					p.addErr(fmt.Errorf("%v", e))
				}
				err = p.errs.err()
			}
		}()
	}

	startRule, ok := p.rules[p.entrypoint]
	if !ok {
		p.addErr(errInvalidEntrypoint)
		return nil, p.errs.err()
	}

	p.read() // advance to first rune
	val, ok = p.parseRule(startRule)
	if !ok {
		if len(*p.errs) == 0 {
			// If parsing fails, but no errors have been recorded, the expected values
			// for the farthest parser position are returned as error.
			maxFailExpectedMap := make(map[string]struct{}, len(p.maxFailExpected))
			for _, v := range p.maxFailExpected {
				maxFailExpectedMap[v] = struct{}{}
			}
			expected := make([]string, 0, len(maxFailExpectedMap))
			eof := false
			if _, ok := maxFailExpectedMap["!."]; ok {
				delete(maxFailExpectedMap, "!.")
				eof = true
			}
			for k := range maxFailExpectedMap {
				expected = append(expected, k)
			}
			sort.Strings(expected)
			if eof {
				expected = append(expected, "EOF")
			}
			p.addErrAt(errors.New("no match found, expected: "+listJoin(expected, ", ", "or")), p.maxFailPos, expected)
		}

		return nil, p.errs.err()
	}
	return val, p.errs.err()
}

func listJoin(list []string, sep string, lastSep string) string {
	switch len(list) {
	case 0:
		return ""
	case 1:
		return list[0]
	default:
		return fmt.Sprintf("%s %s %s", strings.Join(list[:len(list)-1], sep), lastSep, list[len(list)-1])
	}
}

func (p *parser) parseRule(rule *rule) (interface{}, bool) {
	p.rstack = append(p.rstack, rule)
	p.pushV()
	val, ok := p.parseExpr(rule.expr)
	p.popV()
	p.rstack = p.rstack[:len(p.rstack)-1]
	return val, ok
}

func (p *parser) parseExpr(expr interface{}) (interface{}, bool) {

	p.ExprCnt++
	if p.ExprCnt > p.maxExprCnt {
		panic(errMaxExprCnt)
	}

	var val interface{}
	var ok bool
	switch expr := expr.(type) {
	case *actionExpr:
		val, ok = p.parseActionExpr(expr)
	case *andCodeExpr:
		val, ok = p.parseAndCodeExpr(expr)
	case *andExpr:
		val, ok = p.parseAndExpr(expr)
	case *anyMatcher:
		val, ok = p.parseAnyMatcher(expr)
	case *charClassMatcher:
		val, ok = p.parseCharClassMatcher(expr)
	case *choiceExpr:
		val, ok = p.parseChoiceExpr(expr)
	case *labeledExpr:
		val, ok = p.parseLabeledExpr(expr)
	case *litMatcher:
		val, ok = p.parseLitMatcher(expr)
	case *notCodeExpr:
		val, ok = p.parseNotCodeExpr(expr)
	case *notExpr:
		val, ok = p.parseNotExpr(expr)
	case *oneOrMoreExpr:
		val, ok = p.parseOneOrMoreExpr(expr)
	case *recoveryExpr:
		val, ok = p.parseRecoveryExpr(expr)
	case *ruleRefExpr:
		val, ok = p.parseRuleRefExpr(expr)
	case *seqExpr:
		val, ok = p.parseSeqExpr(expr)
	case *throwExpr:
		val, ok = p.parseThrowExpr(expr)
	case *zeroOrMoreExpr:
		val, ok = p.parseZeroOrMoreExpr(expr)
	case *zeroOrOneExpr:
		val, ok = p.parseZeroOrOneExpr(expr)
	default:
		panic(fmt.Sprintf("unknown expression type %T", expr))
	}
	return val, ok
}

func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) {
	start := p.pt
	val, ok := p.parseExpr(act.expr)
	if ok {
		p.cur.pos = start.position
		p.cur.text = p.sliceFrom(start)
		actVal, err := act.run(p)
		if err != nil {
			p.addErrAt(err, start.position, []string{})
		}

		val = actVal
	}
	return val, ok
}

func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) {

	ok, err := and.run(p)
	if err != nil {
		p.addErr(err)
	}

	return nil, ok
}

func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) {
	pt := p.pt
	p.pushV()
	_, ok := p.parseExpr(and.expr)
	p.popV()
	p.restore(pt)

	return nil, ok
}

func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) {
	if p.pt.rn == utf8.RuneError && p.pt.w == 0 {
		// EOF - see utf8.DecodeRune
		p.failAt(false, p.pt.position, ".")
		return nil, false
	}
	start := p.pt
	p.read()
	p.failAt(true, start.position, ".")
	return p.sliceFrom(start), true
}

func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) {
	cur := p.pt.rn
	start := p.pt

	// can't match EOF
	if cur == utf8.RuneError && p.pt.w == 0 { // see utf8.DecodeRune
		p.failAt(false, start.position, chr.val)
		return nil, false
	}

	if chr.ignoreCase {
		cur = unicode.ToLower(cur)
	}

	// try to match in the list of available chars
	for _, rn := range chr.chars {
		if rn == cur {
			if chr.inverted {
				p.failAt(false, start.position, chr.val)
				return nil, false
			}
			p.read()
			p.failAt(true, start.position, chr.val)
			return p.sliceFrom(start), true
		}
	}

	// try to match in the list of ranges
	for i := 0; i < len(chr.ranges); i += 2 {
		if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] {
			if chr.inverted {
				p.failAt(false, start.position, chr.val)
				return nil, false
			}
			p.read()
			p.failAt(true, start.position, chr.val)
			return p.sliceFrom(start), true
		}
	}

	// try to match in the list of Unicode classes
	for _, cl := range chr.classes {
		if unicode.Is(cl, cur) {
			if chr.inverted {
				p.failAt(false, start.position, chr.val)
				return nil, false
			}
			p.read()
			p.failAt(true, start.position, chr.val)
			return p.sliceFrom(start), true
		}
	}

	if chr.inverted {
		p.read()
		p.failAt(true, start.position, chr.val)
		return p.sliceFrom(start), true
	}
	p.failAt(false, start.position, chr.val)
	return nil, false
}

func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) {
	for altI, alt := range ch.alternatives {
		// dummy assignment to prevent compile error if optimized
		_ = altI

		p.pushV()
		val, ok := p.parseExpr(alt)
		p.popV()
		if ok {
			return val, ok
		}
	}
	return nil, false
}

func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) {
	p.pushV()
	val, ok := p.parseExpr(lab.expr)
	p.popV()
	if ok && lab.label != "" {
		m := p.vstack[len(p.vstack)-1]
		m[lab.label] = val
	}
	return val, ok
}

func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) {
	ignoreCase := ""
	if lit.ignoreCase {
		ignoreCase = "i"
	}
	val := fmt.Sprintf("%q%s", lit.val, ignoreCase)
	start := p.pt
	for _, want := range lit.val {
		cur := p.pt.rn
		if lit.ignoreCase {
			cur = unicode.ToLower(cur)
		}
		if cur != want {
			p.failAt(false, start.position, val)
			p.restore(start)
			return nil, false
		}
		p.read()
	}
	p.failAt(true, start.position, val)
	return p.sliceFrom(start), true
}

func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) {
	ok, err := not.run(p)
	if err != nil {
		p.addErr(err)
	}

	return nil, !ok
}

func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) {
	pt := p.pt
	p.pushV()
	p.maxFailInvertExpected = !p.maxFailInvertExpected
	_, ok := p.parseExpr(not.expr)
	p.maxFailInvertExpected = !p.maxFailInvertExpected
	p.popV()
	p.restore(pt)

	return nil, !ok
}

func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) {
	var vals []interface{}

	for {
		p.pushV()
		val, ok := p.parseExpr(expr.expr)
		p.popV()
		if !ok {
			if len(vals) == 0 {
				// did not match once, no match
				return nil, false
			}
			return vals, true
		}
		vals = append(vals, val)
	}
}

func (p *parser) parseRecoveryExpr(recover *recoveryExpr) (interface{}, bool) {

	p.pushRecovery(recover.failureLabel, recover.recoverExpr)
	val, ok := p.parseExpr(recover.expr)
	p.popRecovery()

	return val, ok
}

func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) {
	if ref.name == "" {
		panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos))
	}

	rule := p.rules[ref.name]
	if rule == nil {
		p.addErr(fmt.Errorf("undefined rule: %s", ref.name))
		return nil, false
	}
	return p.parseRule(rule)
}

func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) {
	vals := make([]interface{}, 0, len(seq.exprs))

	pt := p.pt
	for _, expr := range seq.exprs {
		val, ok := p.parseExpr(expr)
		if !ok {
			p.restore(pt)
			return nil, false
		}
		vals = append(vals, val)
	}
	return vals, true
}

func (p *parser) parseThrowExpr(expr *throwExpr) (interface{}, bool) {

	for i := len(p.recoveryStack) - 1; i >= 0; i-- {
		if recoverExpr, ok := p.recoveryStack[i][expr.label]; ok {
			if val, ok := p.parseExpr(recoverExpr); ok {
				return val, ok
			}
		}
	}

	return nil, false
}

func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) {
	var vals []interface{}

	for {
		p.pushV()
		val, ok := p.parseExpr(expr.expr)
		p.popV()
		if !ok {
			return vals, true
		}
		vals = append(vals, val)
	}
}

func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) {
	p.pushV()
	val, _ := p.parseExpr(expr.expr)
	p.popV()
	// whether it matched or not, consider it a match
	return val, true
}

func rangeTable(class string) *unicode.RangeTable {
	if rt, ok := unicode.Categories[class]; ok {
		return rt
	}
	if rt, ok := unicode.Properties[class]; ok {
		return rt
	}
	if rt, ok := unicode.Scripts[class]; ok {
		return rt
	}

	// cannot happen
	panic(fmt.Sprintf("invalid Unicode class: %s", class))
}
