XPath-supported syntax and tokens

XML Services supports the following XPath syntax:

xpath::= or_expr
or_expr::= and_expr | and_expr TOKEN_OR or_expr
and_expr::= union_expr | union_expr TOKEN_AND and_expr
union_expr::= intersect_expr
	| intersect_expr TOKEN_UNION union_expr
intersect_expr::= comparison_expr
	| comparison_expr TOKEN_INTERSECT intersect_expr
comparison_expr::= range_exp
	| range_expr general_comp comparisonRightHandSide
general_comp::= TOKEN_EQUAL | TOKEN_NOTEQUAL
	| TOKEN_LESSTHAN | TOKEN_LESSTHANEQUAL
	| TOKEN_GREATERTHAN | TOKEN_GREATERTHANEQUAL
range_expr::= unary_expr | unary_expr TOKEN_TO unary_expr
unary_expr::= TOKEN_MINUS path_expr
	| TOKEN_PLUS path_expr
	| path_expr
comparisonRightHandSide::= literal
path_expr::= relativepath_expr | TOKEN_SLASH
	| TOKEN_SLASH relativepath_expr
	| TOKEN_DOUBLESLASH relativepath_expr
relativepath_expr::= step_expr
	| step_expr TOKEN_SLASH relativepath_expr
	| step_expr TOKEN_DOUBLESLASH relativepath_expr
step_expr::= forward_step predicates
	| primary_expr predicates	
	| predicates
primary_expr::= literal | function_call | (xpath)
function_call::=
	tolower([xpath])
	| toupper([xpath])
	| normalize-space([xpath])
	| concat([xpath [,xpath]...])
forward_step::= abbreviated_forward_step
abbreviated_forward_step::= name_test
	| TOKEN_ATRATE name_test
	| TOKEN_PERIOD
name_test::= q_name | wild_card | text test
text_test ::= TOKEN_TEXT TOKEN_LPAREN TOKEN_RPAREN
literal::= numeric_literal | string_literal
wild_card::= TOKEN_ASTERISK
q_name::= TOKEN_ID
string_literal::= TOKEN_STRING 
numeric_literal::= TOKEN_INT | TOKEN_FLOATVAL|
	| TOKEN_MINUS TOKEN_INT 
	| TOKEN_MINUSTOKEN_FLOATVAL
predicates::= 
	| TOKEN_LSQUARE expr TOKEN_RSQUARE predicates
	| TOKEN_LSQUARE expr TOKEN_RSQUARE 

The following tokens are supported by the XML Services subset of XPath:

APOS ::= '''
DIGITS ::= [0-9]+
NONAPOS ::= '^''
NONQUOTE ::= '^"'
NONSTART ::= LETTER | DIGIT | '.' | '-' | '_' | ':'
QUOTE ::= '"'
START ::= LETTER | '_'
TOKEN_AND ::= 'and'
TOKEN_ASTERISK  ::= '*'
TOKEN_ATRATE  ::= '@			'
TOKEN_COMMA ::= ','
TOKEN_DOUBLESLASH  ::= '//'
TOKEN_EQUAL ::=  '=' 
TOKEN_GREATERTHAN ::=  '>' 
TOKEN_GREATERTHANEQUAL ::=  '>=' 
TOKEN_INTERSECT ::=   'intersect'
TOKEN_LESSTHAN ::= '<' 
TOKEN_LESSTHANEQUAL ::= '<=' 
TOKEN_LPAREN  ::= '('
TOKEN_LSQUARE  ::= '['
TOKEN_MINUS  ::= '-'
TOKEN_NOT ::= 'not'
TOKEN_NOTEQUAL ::= '!=' 
TOKEN_OR ::= 'or'
TOKEN_PERIOD  ::= '.'
TOKEN_PLUS  ::= '+' 
TOKEN_RPAREN  ::= ')'
TOKEN_RSQUARE  ::= ']'
TOKEN_SLASH  ::= '/'
TOKEN_TO ::= 'to				'
TOKEN_UNION ::= '|'  | 'union'
TOKEN_ID  ::= START [NONSTART...]
TOKEN_FLOATVAL  ::= DIGITS | '.'DIGITS | DIGITS'.'DIGITS
TOKEN_INT  ::= DIGITS
TOKEN_STRING  ::=        
       QUOTE NONQUOTE... QUOTE
      | APOS NONAPOS... APOS
TOKEN_TEXT ::=  'text'