| START | ::= | ExprSingle <EOF> |
| ExprSingle | ::= | OrExpr |
| OperatorExpr | ::= | OrExpr |
| OrExpr | ::= | AndExpr ( "or" AndExpr )* |
| AndExpr | ::= | EqualityExpr ( "and" EqualityExpr )* |
| EqualityExpr | ::= | RelationalExpr ( ( "=" | "!=" ) RelationalExpr )* |
| RelationalExpr | ::= | AdditiveExpr ( ( <LeftAngleBracket> | ">" | "<=" | ">=" ) AdditiveExpr )* |
| AdditiveExpr | ::= | MultiplicativeExpr ( ( <Plus> | <Minus> ) MultiplicativeExpr )* |
| MultiplicativeExpr | ::= | UnaryExpr ( ( "*" | "div" | "mod" ) UnaryExpr )* |
| UnaryExpr | ::= | ( <Minus> )* UnionExpr1 |
| UnionExpr1 | ::= | ValueExpr ( "|" ValueExpr )* |
| ValueExpr | ::= | ( ( FilterExpr ( ( <Slash> | <SlashSlash> ) RelativePathExpr )? ) | PathExpr ) |
| PathExpr | ::= | ( ( <Slash> ( RelativePathExpr )? ) | ( <SlashSlash> RelativePathExpr ) | RelativePathExpr ) |
| RelativePathExpr | ::= | StepExpr ( ( <Slash> | <SlashSlash> ) StepExpr )* |
| StepExpr | ::= | ( AxisStep | ContextItemExpr | AbbrevReverseStep ) |
| AxisStep | ::= | ( ReverseStep | ForwardStep ) PredicateList |
| ForwardStep | ::= | ( ( ForwardAxis NodeTest ) | AbbrevForwardStep ) |
| ForwardAxis | ::= | ( ( "child" "::" ) | ( "descendant" "::" ) | ( "attribute" "::" ) | ( "self" "::" ) | ( "descendant-or-self" "::" ) | ( "following-sibling" "::" ) | ( "following" "::" ) | ( "namespace" "::" ) ) |
| AbbrevForwardStep | ::= | ( "@" )? NodeTest |
| ReverseStep | ::= | ( ReverseAxis NodeTest ) |
| ReverseAxis | ::= | ( ( "parent" "::" ) | ( "ancestor" "::" ) | ( "preceding-sibling" "::" ) | ( "preceding" "::" ) | ( "ancestor-or-self" "::" ) ) |
| AbbrevReverseStep | ::= | ".." |
| NodeTest | ::= | ( KindTest | NameTest ) |
| NameTest | ::= | ( QName | Wildcard ) |
| Wildcard | ::= | ( "*" | <NCNameColonStar> ) |
| FilterExpr | ::= | PrimaryExpr PredicateList |
| PredicateList | ::= | ( Predicate )* |
| Predicate | ::= | "[" ExprSingle "]" |
| PrimaryExpr | ::= | ( Literal | VarRef | ParenthesizedExpr | FunctionCall ) |
| Literal | ::= | ( NumericLiteral | <StringLiteral> ) |
| NumericLiteral | ::= | ( <IntegerLiteral> | <DecimalLiteral> ) |
| VarRef | ::= | "$" VarName |
| VarName | ::= | QName |
| ParenthesizedExpr | ::= | "(" ExprSingle ")" |
| ContextItemExpr | ::= | "." |
| FunctionCall | ::= | FunctionQName ( "(" ( ExprSingle ( "," ExprSingle )* )? ")" ) |
| KindTest | ::= | ( PITest | CommentTest | TextTest | AnyKindTest ) |
| AnyKindTest | ::= | "node" "(" ")" |
| TextTest | ::= | "text" "(" ")" |
| CommentTest | ::= | "comment" "(" ")" |
| PITest | ::= | "processing-instruction" "(" ( <StringLiteral> )? ")" |
| NCName | ::= | QName |
| QName | ::= | ( FunctionQName | "comment" | "node" | "processing-instruction" | "text" ) |
| FunctionQName | ::= | ( <QNameToken> | "ancestor" | "ancestor-or-self" | "and" | "attribute" | "child" | "descendant" | "descendant-or-self" | "div" | "following" | "following-sibling" | "mod" | "namespace" | "or" | "parent" | "preceding" | "preceding-sibling" | "self" ) |