/* primitive XPath BNF Grammar */ /* an xpath query 'xpath' is an expression 'expr' */ xpath(A) ::= expr(B). /* an expression 'expr' can be: * - a relative path expression alone: /node_a/node_b/node_c * - an equality expression between a relative path expression and * a primary expression: /node_a/node_b=value * - an equality between an attribute name and a primary expression * (an attribute name can't be alone): @attr=value */ expr(A) ::= relativePathExpr(B). expr(A) ::= relativePathExpr(B) EQUAL_SYMBOL primaryExpr(C). expr(A) ::= attribute(B) EQUAL_SYMBOL primaryExpr(C). /* a relative path expression can be: * - a single step (=just one XML tag name): node_a * - a child symbol and a single step: /node_a * - a descendant symbol and a single step://node_a * - a relative path and a child (= path/element_name) * recursive declaration: /node_a//node_b/node_c * - a relative path and a descendant (= path//element_name) * recursive declaration: /node_a//node_b//node_c */ relativePathExpr(A) ::= stepExpr(B). relativePathExpr(A) ::= CHILD_SYMBOL stepExpr(B). relativePathExpr(A) ::= DESC_SYMBOL stepExpr(B). relativePathExpr(A) ::= relativePathExpr(B) CHILD_SYMBOL stepExpr(C). relativePathExpr(A) ::= relativePathExpr(B) DESC_SYMBOL stepExpr(C). /* each single step expression is can be: * - or a primary expression and a predicate list: * node_a[predicate1][predicate2][...] * - just a primary expression: node_a */ stepExpr(A) ::= primaryExpr(B) predicateList(C). stepExpr(A) ::= primaryExpr(B). /* a list of predicate can be: * - just one predicate (= [predicate]) * - more predicates (= [predicate1][predicate2][...]) * recursive declaration */ predicateList(A) ::= predicate(B). predicateList(A) ::= predicateList(B) predicate(C). /* a predicate is an expression between brackets (= [expr]) */ predicate(A) ::= BRACKET_L expr(B) BRACKET_R. primaryExpr(A) ::= LITERAL_VALUE(B). attribute(A) ::= ATTR_SYMBOL LITERAL_VALUE(B).