-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtiger.grm
131 lines (97 loc) · 2.11 KB
/
tiger.grm
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
%%
%term
EOF
| ID of string
| INT of int | STRING of string
| COMMA | COLON | SEMICOLON | LPAREN | RPAREN | LBRACK | RBRACK
| LBRACE | RBRACE | DOT
| PLUS | MINUS | TIMES | DIVIDE | EQ | NEQ | LT | LE | GT | GE
| AND | OR | ASSIGN
| ARRAY | IF | THEN | ELSE | WHILE | FOR | TO | DO | LET | IN | END | OF
| BREAK | NIL
| FUNCTION | VAR | TYPE
%nonterm
program
| letexp | funexp | funargs
| exp | expseq
| decs | dec
| tydec | ty | tyfields | tyfield
| vardec
| fundec
| array
| lvalue | lval
| record | recfields | recfield
| arith | arithterm | arithop
| comp | compterm | compop
%pos int
%verbose
%start program
%eop EOF
%noshift EOF
%name Tiger
%keyword WHILE FOR TO BREAK LET IN END FUNCTION VAR TYPE ARRAY IF THEN ELSE
DO OF NIL
%prefer THEN ELSE LPAREN
%value ID ("bogus_id")
%%
program: letexp ()
letexp: LET decs IN expseq END ()
expseq: exp ()
| exp SEMICOLON exp ()
exp: letexp()
| funexp ()
| lvalue ()
| lvalue ASSIGN exp ()
| array ()
| record ()
| STRING ()
| NIL ()
| LPAREN RPAREN ()
| IF exp THEN exp ELSE exp ()
| arith ()
| comp ()
arith: arithterm () | arith arithop arithterm ()
arithterm: INT ()
arithop: PLUS ()
| MINUS ()
| TIMES ()
| DIVIDE ()
comp: compterm compop comp ()
compterm: ID ()
compop: EQ ()
| LT GT ()
| LT ()
| GT ()
| LT EQ ()
| GT EQ ()
array: ID LBRACK exp RBRACK OF exp ()
record: ID LBRACE recfields RBRACE ()
recfields: ()
| recfield ()
recfield: ID EQ exp ()
| ID EQ exp COMMA recfield ()
funexp: ID LPAREN RPAREN ()
| ID LPAREN funargs RPAREN ()
funargs: exp ()
| exp COMMA funargs ()
decs: dec decs ()
| ()
dec: tydec ()
| vardec ()
| fundec ()
tydec: TYPE ID EQ ty ()
ty: ID ()
| LBRACE tyfields RBRACE ()
| ARRAY OF ID ()
tyfields: ()
| tyfield ()
tyfield: ID COLON ID ()
| ID COLON ID COMMA tyfield ()
vardec: VAR ID ASSIGN exp ()
| VAR ID COLON ID ASSIGN exp ()
fundec: FUNCTION ID LPAREN tyfields RPAREN EQ exp ()
| FUNCTION ID LPAREN tyfields RPAREN COLON ID EQ exp ()
lvalue: ID lval ()
lval: DOT ID lval ()
| LBRACK exp RBRACK lval ()
| ()