
[1] LocationPath	 ::= RelativeLocationPath
			     | AbsoluteLocationPath

[2] AbsoluteLocationPath ::= '/' RelativeLocationPath?

				| AbbreviatedAbsoluteLocationPath
[3] RelativeLocationPath ::=	Step
				| RelativeLocationPath '/' Step
				| AbbreviatedRelativeLocationPath

[4] Step	  ::=	AxisSpecifier NodeTest Predicate*
			| AbbreviatedStep

[5] AxisSpecifier ::=	AxisName '::'
			| AbbreviatedAxisSpecifier

[6] AxisName	  ::=	'ancestor'
			| 'ancestor-or-self'
			| 'attribute'
			| 'child'
			| 'descendant'
			| 'descendant-or-self'
			| 'following'
			| 'following-sibling'
			| 'namespace'
			| 'parent'
			| 'preceding'
			| 'preceding-sibling'
			| 'self'

[7] NodeTest	  ::=	NameTest
			| NodeType '(' ')'
			| 'processing-instruction' '(' Literal ')'

[8] Predicate	  ::=	'[' PredicateExpr ']'
[9] PredicateExpr ::=	Expr

[10] AbbreviatedAbsoluteLocationPath  ::= '//' RelativeLocationPath
[11] AbbreviatedRelativeLocationPath  ::= RelativeLocationPath '//' Step
[12] AbbreviatedStep		      ::= '.'
					  | '..'
[13] AbbreviatedAxisSpecifier	      ::= '@'?


[14] Expr	 ::=	OrExpr
[15] PrimaryExpr ::=	VariableReference
			| '(' Expr ')'
			| Literal
			| Number
			| FunctionCall

[16] FunctionCall ::=	FunctionName '(' ( Argument (',' Argument )*)? ')'
[17] Argument	  ::=	Expr

[18] UnionExpr	  ::=	PathExpr
			| UnionExpr '|' PathExpr

[19] PathExpr	  ::=	LocationPath
			| FilterExpr
			| FilterExpr '/' RelativeLocationPath

			| FilterExpr '//' RelativeLocationPath
[20] FilterExpr	  ::=	PrimaryExpr
			| FilterExpr Predicate

[21] OrExpr	  ::=	AndExpr
			| OrExpr 'or' AndExpr

[22] AndExpr	   ::=	EqualityExpr
			| AndExpr 'and' EqualityExpr

[23] EqualityExpr  ::=	RelationalExpr
			| EqualityExpr '=' RelationalExpr
			| EqualityExpr '!=' RelationalExpr

[24] RelationalExpr ::=	AdditiveExpr
			| RelationalExpr '<' AdditiveExpr
			| RelationalExpr '>' AdditiveExpr
			| RelationalExpr '<=' AdditiveExpr
			| RelationalExpr '>=' AdditiveExpr

[25] AdditiveExpr   ::= MultiplicativeExpr
			| AdditiveExpr '+' MultiplicativeExpr
			| AdditiveExpr '-' MultiplicativeExpr

[26] MultiplicativeExpr	::= UnaryExpr
			    | MultiplicativeExpr MultiplyOperator UnaryExpr
			    | MultiplicativeExpr 'div' UnaryExpr
			    | MultiplicativeExpr 'mod' UnaryExpr

[27] UnaryExpr	::=	UnionExpr
			| '-' UnaryExpr

[28] ExprToken	::=	'(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
			| NameTest
			| NodeType
			| Operator
			| FunctionName
			| AxisName
			| Literal
			| Number
			| VariableReference

[29] Literal	::=	'"' [^"]* '"'
			| "'" [^']* "'"

[30] Number	::=	Digits ('.' Digits?)?
			| '.' Digits

[31] Digits	::=	[0-9]+

[32] Operator	::=	OperatorName
			| MultiplyOperator
			| '/' | '//' | '|' | '+' | '-' | '=' | '!='
			| '<' | '<=' | '>' | '>='

[33] OperatorName ::=	'and' | 'or' | 'mod' | 'div'

[34] MultiplyOperator ::= '*'

[35] FunctionName	::= QName - NodeType

[36] VariableReference	::= '$' QName

[37] NameTest		::= '*'
			    | NCName ':' '*'
			    | QName

[38] NodeType		::= 'comment'
			    | 'text'
			    | 'processing-instruction'
			    | 'node'

[39] ExprWhitespace	::= S
