blob: 3ba370c6104c1549e0e58cdacaa95a752ca48cf3 (
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
|
/**
* Define a parser grammar called AAIDsl
*/
grammar AAIDsl;
aaiquery: startStatement limit?;
startStatement: (vertex ) (traversal)* ;
nestedStatement: (vertex|unionVertex ) (traversal)* ;
vertex: label store? (filter)?;
traversal: (edge (vertex|unionVertex));
filter: (propertyFilter)* whereFilter?;
propertyFilter: (not? '(' key (',' (key | num | bool))* ')');
bool: BOOL;
whereFilter: (not? '(' edge nestedStatement ')' );
unionVertex: '[' ( (edgeFilter)* nestedStatement ( comma ( (edgeFilter)* nestedStatement))*) ']' store?;
comma: ',';
edge: TRAVERSE (edgeFilter)*;
edgeFilter: '(' key (',' key )* ')';
num: NUM;
limit: LIMIT num;
label: (ID | NUM )+;
key: KEY;
store: STORE;
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: [|];
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
|