aboutsummaryrefslogtreecommitdiffstats
path: root/aai-traversal/src/main/resources/antlr4/org/onap/aai/dsl/v2/AAIDsl.g4
blob: 5d923e103e3a9520e5ed0ae5e4732edd10c4c68f (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
70
/**
 * Define a parser grammar called AAIDsl
 */
grammar AAIDsl;

aaiquery: startStatement limit?;

startStatement: (vertex|unionVertex  ) (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: ( '{' key (',' key)* '}');
bool: BOOL;

whereFilter: (not? '('  nestedStatement ')' );

//unionVertex: '[' ( nestedStatement ( comma (nestedStatement))*) ']' store?;
unionVertex: '[' ( (edgeFilter)* nestedStatement ( comma ( (edgeFilter)* 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