Appendix C


/* 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).
	
xhtml valid? | css valid? | last update on September 2010