/
XQuery.g4
57 lines (53 loc) · 2.08 KB
/
XQuery.g4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
grammar XQuery;
import XLexer, XPath;
/*
* CONSIDERATIONS
* -Using STRING_LITERAL as URI
* -USING STRING_LITERAL as C
* -Using QNAME_TOKEN names as ENAME
* -Using QNAME_TOKEN names as ANAME
*/
/*
* TODO:
* -Scape characters
*/
/* Non-terminals */
xquery : flwrexpr EOF ;
flwrexpr : initial middle* returnStat ;
initial : forStat
| let ;
middle : initial
| where
| groupBy ;
forStat : 'for' forBinding (COMMA forBinding)* ;
forBinding : VAR 'in' pathExpr_xq ;
let : 'let' letBinding (COMMA letBinding)* ;
letBinding : VAR ':=' ( pathExpr_xq | flwrexpr | aggrExpr | arithmeticExpr_xq | literal) ;
arithExpr : ;
pathExpr_xq : 'distinct-values' '(' pathExprInner_xq (xpath)? ')' | pathExprInner_xq (xpath)? ;
pathExprInner_xq : 'collection' '(' STRING_LITERAL ')' #pathExprInner_xq_collection
| 'doc' '(' STRING_LITERAL ')' #pathExprInner_xq_doc
| VAR #pathExprInner_xq_VAR
;
aggrExpr : AGGR_FUNCT '(' VAR ')' ;
where : 'where' orExpr_xq ;
orExpr_xq : andExpr_xq (OR andExpr_xq)* ;
andExpr_xq : boolExpr_xq (AND boolExpr_xq)* ;
boolExpr_xq : NOT '(' boolExprInner_xq ')' | boolExprInner_xq ;
boolExprInner_xq : pred | contains | empty ;
pred : arithmeticExpr_xq ( ( vcmp | ncmp ) ( arithmeticExpr_xq | STRING_LITERAL | (OP_SUB)? numericLiteral ) )?;
vcmp : EQ | NE | LT | LE | GT | GE | EQ_S | NE_S | LT_S | LE_S | GT_S | GE_S ;
ncmp : 'is' | '<<' | '>>' ;
contains : 'contains' '(' VAR COMMA STRING_LITERAL ')' ;
empty : 'empty' '(' VAR ')' ;
groupBy : 'group by' VAR (COMMA VAR)* ;
returnStat : 'return' ( eleConst | aggrExpr | VAR ) ;
eleConst : LT_S eaName (att)* (CLOSE_OPENING_TAG | (GT_S (eleConst | LEFTCURL eleConstInner RIGHTCURL )* OPEN_CLOSING_TAG (eaName) GT_S )) ;
eleConstInner : ( VAR | aggrExpr ) ( COMMA ( VAR | aggrExpr ) )* ;
att : eaName '=' attInner ;
attInner : OPEN_ATTR_VAR_DOUBLE attInner2 CLOSE_ATTR_VAR_DOUBLE
| OPEN_ATTR_VAR_SINGLE attInner2 CLOSE_ATTR_VAR_SINGLE
| STRING_LITERAL ;
attInner2 : VAR | aggrExpr ;
eaName : functionName | QNAME_TOKEN ;
arithmeticExpr_xq : VAR ( ( OP_ADD | OP_SUB | OP_MUL | SLASH) numericLiteral )? ;