-
Notifications
You must be signed in to change notification settings - Fork 0
/
MyGrammar.g4
106 lines (89 loc) · 1.91 KB
/
MyGrammar.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
103
104
105
106
//parser grammar ExprParser;
//options { tokenVocab=ExprLexer; }
grammar MyGrammar;
//parser grammar ParserGrammar;
program
: MAIN '{'stat*'}' EOF?
;
stat: TYPE? ID '=' expr ';'
| expr ';'
| TYPE ID ';'
| def ';'
| expr DOT expr ';'
| TYPE? ID '=' expr DOT func ';'
| RETURN expr ';'
| TYPE ID (',' ID)* '='
expr (',' expr)* ';'
| ELSE '{'(stat)+'}' ';'
| IF '('expr')'
'{' (stat)+ '}'
ELSE '{'(stat)+'}' ';'
| IF '('expr')'
'{' (stat)+ '}' ';'
| WHILE '('expr')'
'{'(stat)+ '}' ';'
| SWITCH '('expr')''{'
(CASE expr '{'(stat)*'}')+
'}' ';'
;
def : TYPE ID '(' TYPE LINK ID
(',' TYPE LINK ID)*')'
'{' stat* '}' ;
index : '['INT']'
| '['ID']';
lists: '[' INT (',' INT)* ']';
trees: '[' '['INT ',' INT ',' INT']' (',' '['INT ',' INT ',' INT']')* ';' '['INT ',' INT ',' INT']' (',' '['INT ',' INT ',' INT']')* ';' '['INT ',' INT ',' INT']' (',' '['INT ',' INT ',' INT']')* ']';
expr: ID
| INT
| func
| 'not' expr
| expr 'and' expr
| expr 'or' expr
| expr COMBINATION expr
| expr INTERSECTION expr
| expr SET expr
| expr SSET expr
| expr GREATER expr
| expr LESS expr
| expr INCREMENT
| expr DECREMENT
| lists
| trees
| expr index
| INT+
;
func : ID '(' expr? (',' expr)* ')' ;
AND : 'and' ;
OR : 'or' ;
NOT : 'not' ;
EQ : '=' ;
GREATER: '>' ;
LESS: '<' ;
COMBINATION: '+' ;
INTERSECTION: '*' ;
SET: '-' ;
SSET: '/';
INCREMENT: '++' ;
DECREMENT: '--' ;
COMMA : ',' ;
SEMI : ';' ;
LPAREN : '(' ;
RPAREN : ')' ;
LCURLY : '{' ;
RCURLY : '}' ;
LSQUARE: '[' ;
RSQUARE: ']' ;
RETURN: 'return' ;
TYPE: 'int' | 'list' | 'element'| 'def'
| 'queue' | 'tree' ;
LINK: '&' ;
DOT: '.' ;
IF: 'if' ;
ELSE: 'else' ;
WHILE: 'while' ;
SWITCH: 'switch' ;
CASE: 'case' ;
MAIN: 'main' ;
INT : [0-9]+ ;
ID: [a-zA-Z_][a-zA-Z_0-9]* ;
WS: [ \t\n\r\f]+ -> skip ;