-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunx.g4
53 lines (41 loc) · 1.45 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
grammar funx;
root : bloc EOF;
bloc : (instru | funcio)*;
instru: execfunc
| expr
| cond
| bucle
| assignacio
;
funcio: FUNCIO (VARIABLE)* '{' (instru)+ '}';
execfunc: FUNCIO expr* ';'?;
expr: '(' expr ')' # ExprParentesis
| <assoc=right> expr '^' expr # Potencia
| expr ('%' | '/' | '*') expr # ModDivMult
| expr ('+' | '-') expr # SumaResta
| VARIABLE # ExprVariable
| NUM # Numero
| '-' expr # Negatiu
| execfunc # Exprfunc
;
cond: ifcond elsecond?;
ifcond: 'if' bool '{' instru* '}' ;
elsecond: 'else' '{' instru* '}' ;
bool: '(' bool ')' # BoolParentesis
| 'not' bool # Negacio
| bool 'or' bool # Disjuncio
| bool 'and' bool # Unio
| expr ('=' | '!=' | '<' | '>' | '<=' | '>=') expr #Comparacio
| expr # Boolean
| 'True' # True
| 'False' # False
| VARIABLE # BoolVariable
;
bucle: 'while' bool '{' instru* '}' ;
assignacio: VARIABLE '<-' (expr | bool) ;
NUM : [0-9]+;
VARIABLE : [a-z][A-Za-z0-9]* ;
FUNCIO : [A-Z][a-zA-Z0-9]+ ;
STRING: '"' ~["]* '"';
COMENTARI : '#' (~[\n])* '\n' -> skip;
WS : [ \n]+ -> skip;