-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathMiniDecaf.g4
More file actions
100 lines (81 loc) · 3.42 KB
/
Copy pathMiniDecaf.g4
File metadata and controls
100 lines (81 loc) · 3.42 KB
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 MiniDecaf;
import CommonLex;
prog
: (func | decl_global ';')* EOF
;
func
: type Identifier '(' (type Identifier ',')* (type Identifier)? ')' ('{' blockItem* '}' | ';')
;
blockItem
: stmt
| decl ';'
;
decl_global
: type Identifier ('=' Interger)? # globalVar
| type Identifier ('[' Interger ']')+ # globalArrDef
;
decl
: type Identifier ('=' expr)? # varDef
| type Identifier ('[' Interger ']')+ # localArrDef
;
stmt
: 'return' expr ';' # returnStmt
| expr? ';' # singleExpr
| 'if' '(' expr ')' stmt ('else' stmt)? # ifStmt
| '{' blockItem* '}' # block
| 'while' '(' expr ')' stmt # whileLoop
| 'do' stmt 'while' '(' expr ')' ';' # doWhile
| 'for' '(' (decl | expr)? ';' (expr)? ';' (expr)? ')' stmt # forLoop
| 'break' ';' # break
| 'continue' ';' # continue
;
expr
: unary '=' expr # assign
| cond # cond_nop
;
cond
: lor_op '?' expr ':' cond # condExpr
| lor_op # lor_nop
;
lor_op
: lor_op '||' lor_op # lor
| land_op # land_nop
;
land_op
: land_op '&&' land_op # land
| equ # equ_nop
;
equ
: equ ('==' | '!=') equ # equal
| rel # rel_nop
;
rel
: rel ('<' | '<=' | '>' | '>=') rel # lessGreat
| add # add_nop
;
add
: add ('+' | '-') add # addSub
| mul # mul_nop
;
mul
: mul ('*' | '/' | '%') mul # mulDiv
| unary # factor_nop
;
unary
: ('!' | '~' | '-' | '*' | '&') unary # unaryOp
| '(' type ')' unary # cast
| postfix # postfix_nop
;
postfix
: Identifier '(' (expr ',')* (expr)? ')' # funcCall
| postfix '[' expr ']' # arrayIndex
| primary # primary_nop
;
primary
: '(' expr ')' # atomParen
| Identifier # identifier
| Interger # integer
;
type
: 'int' '*'* # intType
;