[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
