blob: 453c0fe567a401a12b21a3f2f407bbafeecf76ed (
plain)
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
58
59
60
61
62
63
64
65
66
67
68
69
|
/**
* Define a parser grammar called AAIDsl
*/
grammar AAIDsl;
aaiquery: startStatement limit?;
startStatement: (vertex ) (traversal)* ;
nestedStatement: (traversal)+ ;
vertex: label store? (filter)?;
//traversal: ( vertex|unionVertex edge);
traversal: (edge* (vertex|unionVertex));
filter: (selectFilter)* (propertyFilter)* whereFilter?;
propertyFilter: (not? '(' key (',' (key | num | bool))* ')');
selectFilter: (not? '{' key (',' key)* '}');
bool: BOOL;
whereFilter: (not? '(' nestedStatement ')' );
unionVertex: '[' ( nestedStatement ( comma (nestedStatement))*) ']' store?;
comma: ',';
edge: ( TRAVERSE|DIRTRAVERSE) (edgeFilter)?;
edgeFilter: '(' key (',' key )* ')';
num: NUM;
limit: LIMIT num;
label: (ID | NUM )+;
key: KEY;
store: STORE | selectFilter;
not: NOT;
BOOL: 'true'|'TRUE'|'false'|'FALSE';
LIMIT: 'LIMIT'|'limit';
NUM: (DIGIT)+;
/*NODE: (ID | NUM )+;*/
fragment ESCAPED_QUOTE : '\\' '\'';
KEY : '\'' (ESCAPED_QUOTE | ~[\r\n] )*? '\'';
AND: [&];
STORE: [*];
OR: [|];
DIRTRAVERSE: '>>' | '<<' ;
TRAVERSE: '>' ;
EQUAL: [=];
NOT: [!];
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment DIGIT : [0-9] ;
fragment ESC : '\\' . ;
fragment ID_SPECIALS: [-:_];
ID
: ( LOWERCASE | UPPERCASE | DIGIT | ID_SPECIALS)
;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
|