diff --git a/xpath-grammar.txt b/xpath-grammar.txt new file mode 100644 index 00000000..3f269e5c --- /dev/null +++ b/xpath-grammar.txt @@ -0,0 +1,138 @@ +[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