Disable queens test case from book (temporarily)
[tiger.ml.git] / tiger / src / lib / tiger / tiger_parser.mly
CommitLineData
543d3420
SK
1%{
2 open Printf
3%}
4
5/* Declarations */
6%token AND
7%token ARRAY
8%token ASSIGN
9%token BREAK
10%token COLON
11%token COMMA
12%token DIVIDE
13%token DO
14%token DOT
15%token ELSE
16%token END
17%token EOF
18%token EQ
19%token FOR
20%token FUNCTION
21%token GE
22%token GT
23%token <string> ID
24%token IF
25%token IN
26%token <int> INT
27%token LBRACE
28%token LBRACK
29%token LE
30%token LET
31%token LPAREN
32%token LT
33%token MINUS
34%token NEQ
35%token NIL
36%token OF
37%token OR
38%token PLUS
39%token RBRACE
40%token RBRACK
41%token RPAREN
42%token SEMICOLON
43%token <string> STRING
44%token THEN
45%token TIMES
46%token TO
47%token TYPE
48%token VAR
49%token WHILE
50
51/* from lowest precedence */
52%left OR
53%left AND
54%nonassoc EQ NEQ GT LT GE LE
55%left PLUS MINUS
56%left TIMES DIVIDE
57%nonassoc UMINUS
58/* to highest precedence */
59
60%type <string> program
61
62%start program
63
64%%
65
66program:
67 | exp EOF
68 {
69 sprintf "program[%s]" $1
70 }
a0db5523 71 ;
543d3420
SK
72
73exp:
74 | NIL
75 {
76 "nil[]"
77 }
78 | INT
79 {
80 sprintf "int[%d]" $1
81 }
82 | MINUS exp %prec UMINUS
83 {
84 sprintf "negation[%s]" $2
85 }
ef945634 86 | ID LBRACK exp RBRACK OF exp
543d3420 87 {
ef945634 88 let type_id = $1 in
a0db5523
SK
89 let number_of_elements = $3 in
90 let initial_value = $6 in
91 sprintf
92 "array[type[%s], size[%s], val[%s]]"
93 type_id number_of_elements initial_value
543d3420 94 }
ef945634 95 | ID LBRACE rec_field_assignments RBRACE
543d3420 96 {
ef945634
SK
97 let type_id = $1 in
98 let rec_field_assignments = $3 in
99 sprintf
100 "record[type[%s], rec_field_assignments[%s]]"
101 type_id rec_field_assignments
543d3420
SK
102 }
103 | lvalue
104 {
105 $1
106 }
107 | lvalue ASSIGN exp
108 {
109 sprintf "assign[%s := %s]" $1 $3
110 }
111 | STRING
112 {
113 sprintf "string[%S]" $1
114 }
b9397ef5 115 | ID LPAREN RPAREN
543d3420 116 {
29de275c
SK
117 let id = $1 in
118 sprintf "fun_call[%s, []]" id
119 }
120 | ID LPAREN fun_args RPAREN
121 {
122 let id = $1 in
123 let fun_args = $3 in
124 sprintf "fun_call[%s, %s]" id fun_args
543d3420
SK
125 }
126 | exp op exp
127 {
128 sprintf "op[%s %s %s]" $1 $2 $3
129 }
130 | IF exp THEN exp ELSE exp
131 {
132 let e1 = $2 in
133 let e2 = $4 in
134 let e3 = $6 in
135 sprintf "if_then_else[%s, then[%s], else[%s]]" e1 e2 e3
136 }
137 | IF exp THEN exp
138 {
139 sprintf "if_then[%s, then[%s]]" $2 $4
140 }
141 | WHILE exp DO exp
142 {
143 sprintf "while[%s, do[%s]]" $2 $4
144 }
ffff6f35 145 | FOR ID ASSIGN exp TO exp DO exp
543d3420
SK
146 {
147 let id = $2 in
148 let e1 = $4 in
149 let e2 = $6 in
150 let e3 = $8 in
151 sprintf "for[%s := %s, to[%s], do[%s]]" id e1 e2 e3
152 }
153 | BREAK
154 {
155 "break[]"
156 }
e7dfac93 157 | LPAREN exps RPAREN
543d3420 158 {
e7dfac93 159 sprintf "exps[%s]" $2
543d3420 160 }
e7dfac93 161 | LET decs IN exps END
543d3420
SK
162 {
163 let decs = $2 in
e7dfac93
SK
164 let exps = $4 in
165 sprintf "let[decs[%s], in[exps[%s]]]" decs exps
543d3420 166 }
b9397ef5 167 | LPAREN RPAREN
543d3420 168 {
b9397ef5
SK
169 (* Perhaps "void"? *)
170 "unit[]"
543d3420 171 }
a0db5523 172 ;
543d3420 173
b3c9d54d
SK
174rec_field_assignments:
175 | ID EQ exp
176 {
177 let id = $1 in
178 let exp = $3 in
179 sprintf "%S = %s" id exp
180 }
181 | ID EQ exp COMMA rec_field_assignments
182 {
183 let id = $1 in
184 let exp = $3 in
185 let rec_field_assignments = $5 in
186 sprintf "%S = %s, %s" id exp rec_field_assignments
187 }
a0db5523 188 ;
b3c9d54d 189
e7dfac93 190exps:
543d3420
SK
191 | exp
192 {
a0db5523
SK
193 let exp = $1 in
194 sprintf "%s" exp
543d3420 195 }
e7dfac93 196 | exp SEMICOLON exps
543d3420 197 {
a0db5523
SK
198 let exp = $1 in
199 let exps = $3 in
200 sprintf "%s; %s" exp exps
543d3420 201 }
a0db5523 202 ;
543d3420
SK
203
204decs:
205 | dec
206 {
207 sprintf "%s" $1
208 }
209 | dec decs
210 {
211 sprintf "%s %s" $1 $2
212 }
a0db5523 213 ;
543d3420
SK
214
215dec:
3fbeb7c1
SK
216 /* Tydec */
217 | TYPE ID EQ ID
ef945634 218 {
3fbeb7c1
SK
219 let type_id_new = $2 in
220 let type_id_orig = $4 in
221 sprintf "tydec_alias[from[%s], to[%s]]" type_id_new type_id_orig
ef945634 222 }
3fbeb7c1 223 | TYPE ID EQ LBRACE RBRACE
543d3420 224 {
3fbeb7c1
SK
225 let type_id = $2 in
226 sprintf "tydec_empty_record[%s]" type_id
543d3420 227 }
3fbeb7c1 228 | TYPE ID EQ LBRACE tyfields RBRACE
543d3420 229 {
3fbeb7c1
SK
230 let type_id = $2 in
231 let tyfields = $5 in
232 sprintf "tydec_record[%s, fields[%s]]" type_id tyfields
233 }
234 | TYPE ID EQ ARRAY OF ID
235 {
236 let type_id = $2 in
237 let element_type_id = $6 in
238 sprintf "tydec_array[%s, elements_of_type[%s]]" type_id element_type_id
543d3420
SK
239 }
240
3fbeb7c1 241 /* Vardec */
ffff6f35 242 | VAR ID ASSIGN exp
543d3420
SK
243 {
244 let id = $2 in
245 let exp = $4 in
246 sprintf "vardec[%s, exp[%s]]" id exp
247 }
ffff6f35 248 | VAR ID COLON ID ASSIGN exp
543d3420
SK
249 {
250 let id = $2 in
ef945634 251 let type_id = $4 in
543d3420 252 let exp = $6 in
ef945634 253 sprintf "vardec[%s, type_id[%s], exp[%s]]" id type_id exp
543d3420
SK
254 }
255
3fbeb7c1
SK
256 /* Fundec */
257 | FUNCTION ID LPAREN RPAREN EQ exp
543d3420 258 {
3fbeb7c1
SK
259 let id = $2 in
260 let exp = $6 in
261 sprintf "fundec[%s, arguments[], exp[%s]]" id exp
543d3420 262 }
3fbeb7c1 263 | FUNCTION ID LPAREN tyfields RPAREN EQ exp
543d3420 264 {
3fbeb7c1
SK
265 let id = $2 in
266 let tyfields = $4 in
267 let exp = $7 in
268 sprintf "fundec[%s, arguments[%s], exp[%s]]" id tyfields exp
543d3420 269 }
3fbeb7c1 270 | FUNCTION ID LPAREN tyfields RPAREN COLON ID EQ exp
543d3420 271 {
3fbeb7c1
SK
272 let id = $2 in
273 let tyfields = $4 in
274 let type_id = $7 in
275 let exp = $9 in
276 sprintf
277 "fundec[%s, tyfields[%s], type_id[%s], exp[%s]]"
278 id tyfields type_id exp
543d3420 279 }
a0db5523 280 ;
543d3420
SK
281
282tyfields:
a87678f0 283 | ID COLON ID
543d3420 284 {
a87678f0
SK
285 let id_1 = $1 in
286 let id_2 = $3 in
287 sprintf "%s : %s" id_1 id_2
543d3420 288 }
a87678f0 289 | ID COLON ID COMMA tyfields
543d3420 290 {
a87678f0
SK
291 let id_1 = $1 in
292 let id_2 = $3 in
293 let tyfield = sprintf "%s : %s" id_1 id_2 in
294 let tyfields = $5 in
295 sprintf "%s, %s" tyfield tyfields
543d3420 296 }
a0db5523 297 ;
543d3420 298
543d3420
SK
299fun_args:
300 | exp
301 {
302 $1
303 }
304 | exp COMMA fun_args
305 {
306 sprintf "%s, %s" $1 $3
307 }
a0db5523 308 ;
543d3420
SK
309
310op:
311 | PLUS {"+"}
312 | MINUS {"-"}
313 | TIMES {"*"}
314 | DIVIDE {"/"}
315 | EQ {"="}
316 | NEQ {"<>"}
317 | GT {">"}
318 | LT {"<"}
319 | GE {">="}
320 | LE {"<="}
321 | AND {"&"}
322 | OR {"|"}
a0db5523 323 ;
543d3420
SK
324
325lvalue:
a0db5523 326 | ID lvalue_part
543d3420 327 {
ffff6f35 328 let id = $1 in
a0db5523
SK
329 let part = $2 in
330 sprintf "lvalue[%s, part[%s]]" id part
543d3420 331 }
a0db5523
SK
332 ;
333
334lvalue_part:
335 | {"epsilon[]"}
336 | lvalue_subscript {$1}
337 | lvalue_field_access {$1}
338 ;
339
340lvalue_subscript:
341 | LBRACK exp RBRACK
543d3420 342 {
a0db5523
SK
343 let exp = $2 in
344 sprintf "subscript[%s]" exp
543d3420 345 }
a0db5523
SK
346 ;
347
348lvalue_field_access:
349 | DOT ID
543d3420 350 {
a0db5523
SK
351 let field = $2 in
352 sprintf "field_access[%s]" field
543d3420 353 }
a0db5523 354 ;
543d3420
SK
355
356%%
This page took 0.047724 seconds and 4 git commands to generate.