-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathExpr.g4
102 lines (71 loc) · 2.33 KB
/
Expr.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
grammar Expr ;
start: boolExpression EOF ;
boolExpression
: '!' boolExpression # Not
| boolExpression op=(EQ | NEQ ) boolExpression # BoolCompare
| expression op=(GT | LT | GTE | LTE | EQ | NEQ ) expression # Compare
| expression op=(IN | NOTIN) (stringList | numberList) # In
| boolExpression AND boolExpression # And
| boolExpression OR boolExpression # Or
| BOOLEAN # Boolean
| function # BoolFunction
| '(' boolExpression ')' # BoolBracket
| VAR # BoolVariable
| IDENTIFIER # BoolIdentifier
;
expression
: expression op=(MUL | DIV) expression # MulDiv
| '-' expression # SubExpression
| expression op=(ADD | SUB) expression # AddSub
| STRING # String
| IDENTIFIER # Identifier
| number # ExpressionNumber
| VAR # Variable
| function # ExpressionFunction
| '(' expression ')' # Bracket
;
number: INT | FLOAT;
stringList
: '(' STRING (',' STRING)* ')'
;
numberList
: '(' number (',' number)* ')'
;
function: name=IDENTIFIER '(' fnargs=args? ')';
args: arg (',' arg)*;
arg
: VAR
| number
| BOOLEAN
| STRING
;
OR: 'or' ;
AND: 'and' ;
GT: '>' ;
GTE: '>=' ;
LT: '<' ;
LTE: '<=' ;
EQ: '=' ;
NEQ: '!=' ;
IN: 'in' ;
NOTIN: 'not in' ;
MUL: '*' ;
MOD: '%' ;
DIV: '/' ;
ADD: '+' ;
SUB: '-' ;
INT: '-'? DIGIT+ ;
FLOAT: '-'? DIGIT+ '.' DIGIT+ ;
BOOLEAN: TRUE | FALSE ;
STRING: '\'' (ESC|.)*? '\'' ;
VAR: '$' IDENTIFIER ;
IDENTIFIER: [a-zA-Z_]+[a-zA-Z0-9_]* ;
WS: [ \r\n\t]+ -> skip ;
fragment
ESC : '\\\'' | '\\\\' ; // match char \' and \\
fragment
DIGIT: [0-9] ;
fragment
TRUE: 'true' ;
fragment
FALSE: 'false' ;