XPATH Grammar

expr → or‑expr
or‑expr → and‑expr (name and‑expr)*
and‑expr → equality‑expr (name equality‑expr)*
equality‑expr → relational‑expr ((= | !=) relational‑expr)*
relational‑expr → additive‑expr ((<= | >= | < | >) additive‑expr)*
additive‑expr → multiplicative‑expr ((+ | -) multiplicative‑expr)*
multiplicative‑expr → unary‑expr ((* | name) unary‑expr)*
unary‑expr → - unary‑expr | union‑expr
union‑expr → path‑expr (| path‑expr)*
path‑expr → location‑path − function‑call | filter‑expr ((// | /) relative‑location‑path)?
filter‑expr → primary‑expr predicate*
location‑path → absolute‑location‑path | relative‑location‑path
absolute‑location‑path → abbreviated‑absolute‑location‑path | / relative‑location‑path?
abbreviated‑absolute‑location‑path → // relative‑location‑path
relative‑location‑path → step ((// | /) step)*
step → axis‑specifier node‑test predicate* | abbreviated‑step
axis‑specifier → axis‑name :: | abbreviated‑axis‑specifier
axis‑name → name
abbreviated‑axis‑specifier → @ | <empty>
node‑test → name ( literal ) | node‑type ( ) | name‑test
node‑type → name
name‑test → * | ncname : * | qname
abbreviated‑step → .. | .
literal → dq‑string | sq‑string
number → num
predicate → [ predicate‑expr ]
predicate‑expr → expr
primary‑expr → function‑call | variable‑reference | ( expr ) | literal | number
variable‑reference → $ qname
function‑call → function‑name ( (argument % ,)? )
function‑name → qname − node‑type
argument → expr
qname → prefixed‑name | unprefixed‑name
prefixed‑name → prefix : local‑part
prefix → ncname
unprefixed‑name → local‑part
local‑part → ncname
ncname → name