/
Filter.g4
79 lines (68 loc) · 1.79 KB
/
Filter.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
grammar Filter;
/* Parser rules */
filter
: ( (LPAREN logicalExpression RPAREN) | logicalExpression ) EOF
;
logicalExpression
: booleanAndExpression ( OR booleanAndExpression )*
;
booleanAndExpression
: simpleFilter (AND simpleFilter)*
;
simpleFilter
: STR
| NOT simpleFilter
| key=STR op=EQ value=(STR | DECIMAL)
| key=STR op=NE value=(STR | DECIMAL)
| key=STR op=GT value=(STR | DECIMAL)
| key=STR op=GE value=(STR | DECIMAL)
| key=STR op=LT value=(STR | DECIMAL)
| key=STR op=LE value=(STR | DECIMAL)
| key=STR op=IN referenceValue
| key=STR op=NOT op=IN referenceValue
| key=STR op=BETWEEN fromValue=(STR | DECIMAL) AND toValue=(STR | DECIMAL)
| key=STR NOT BETWEEN fromValue=(STR | DECIMAL) AND toValue=(STR | DECIMAL)
| key=STR op=IN array
| key=STR NOT IN array
| key=STR op=CONTAINS value=(STR | DECIMAL)
| key=STR NOT CONTAINS value=(STR | DECIMAL)
| DOLLAR LCURLY FILTER SEP id=(DECIMAL | STR) SEP name=STR RCURLY
;
array
: LBRACKET (arrayItem SEP*)+ RBRACKET
;
arrayItem
: value=(STR | DECIMAL)
| referenceValue
;
referenceValue
: DOLLAR LCURLY type=LIST SEP id=(STR | DECIMAL) SEP name=(STR | DECIMAL) RCURLY
;
/* Lexer Rules*/
SEP: ',' | ';' ;
LIST : 'List' ;
FILTER: 'Filter' ;
DOLLAR: '$';
LCURLY: '{';
RCURLY: '}';
LPAREN: '(';
RPAREN: ')';
LBRACKET: '[';
RBRACKET: ']';
GT: '>';
GE: '>=';
LT: '<';
LE: '<=';
EQ: '=';
NE: '!=';
NOT: '!' | 'not' | 'NOT';
AND: 'AND' | 'and';
OR: 'OR' | 'or';
IN: 'in' | 'IN';
BETWEEN: 'between' | 'BETWEEN';
CONTAINS: 'contains' | 'CONTAINS';
DECIMAL: '-'? DIGIT+ ( '.' DIGIT+ )? ;
fragment DIGIT: [0-9] ;
STR: ALPHANUMERIC+ | '"' (ALPHANUMERIC | [ ] | '""')+ '"';
fragment ALPHANUMERIC: [a-z0-9A-Z!.:@#$%&^*'+/?_`~-];
WS : [ \t\r\n\f]+ -> skip ;