-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunx.g4
100 lines (75 loc) · 1.57 KB
/
funx.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
grammar funx;
root: (fun_declaration)* (expr)?;
fun_declaration: FUN_IDENT declare_params block;
expr:
expr A_LA expr
| expr (PER | ENTRE | MOD) expr
| expr (MES | MENYS) expr
| '(' expr ')'
| fun_call
| (MENYS | MES)? NUMBER
| IDENT;
declare_params: (IDENT)*;
block: '{' (logical_expr | show)* expr? '}';
fun_call: FUN_IDENT call_params;
show: SHOW (expr | StringLiteral);
logical_expr: if_expr | while_expr | assignment;
call_params: (expr)*;
StringLiteral: UnterminatedStringLiteral '"';
UnterminatedStringLiteral: '"' (~["\\\r\n] | '\\' (. | EOF))*;
if_expr:
IF condition_block (ELSE IF condition_block)* (ELSE block)?;
while_expr: WHILE condition_block;
assignment: IDENT ASSIGN expr;
condition_block: condition block;
condition:
condition GT condition
| condition GE condition
| condition LT condition
| condition LE condition
| condition EQ condition
| condition NE condition
| condition AND condition
| condition OR condition
| condition XOR condition
| '(' condition ')'
| expr;
// comment
LINE_COMMENT: '#' ~[\r\n]* -> skip;
// operators
A_LA: '^';
PER: '*';
ENTRE: '/';
MOD: '%';
MES: '+';
MENYS: '-';
// assignment
ASSIGN: '<-';
// show
SHOW: 'show';
// logical_expr
IF: 'if';
ELSE: 'else';
WHILE: 'while';
// logical_operators
AND: 'and';
OR: 'or';
XOR: 'xor';
GT: '>';
GE: '>=';
LT: '<';
LE: '<=';
EQ: '=';
NE: '!=';
// constructions
NUMBER: (DIGIT)+;
IDENT: MINUS (LETTER | DIGIT)*;
FUN_IDENT: MAJUS (LETTER | DIGIT)*;
COMMENT_START: '#';
// atoms
LETTER: (MINUS | MAJUS);
MAJUS: [A-Z];
MINUS: [a-z];
DIGIT: [0-9];
// helpers
WS: [ \r\n]+ -> skip;