2 module Ast = Tiger_absyn
3 module Sym = Tiger_symbol
6 Tiger_position.of_lexing_positions
7 ~pos_start:(Parsing.symbol_start_pos ())
8 ~pos_end:(Parsing.symbol_end_pos ())
49 %token <string> STRING
57 /* from lowest precedence */
65 %nonassoc EQ NEQ GT LT GE LE
69 /* to highest precedence */
71 %type <Tiger_absyn.t> program
77 program: exp EOF { $1 };
84 | MINUS exp %prec HIGHEST
93 | lvalue LBRACK exp RBRACK OF exp
96 | Ast.SimpleVar {symbol=typ; _} ->
103 | Ast.SubscriptVar _ | Ast.FieldVar _ ->
106 | ID LBRACE rec_fields_bind RBRACE
110 let typ = Sym.of_string type_id in
112 Ast.RecordExp {fields; typ; pos}
121 Ast.AssignExp {var; exp; pos}
124 { Ast.StringExp {string = $1; pos = pos ()} }
125 | ID LPAREN fun_args RPAREN
128 { func = Sym.of_string $1
164 ; oper = Ast.DivideOp
230 ; else' = Some (Ast.IntExp 0)
240 ; then' = Ast.IntExp 1
245 | IF exp THEN exp ELSE exp
278 | FOR ID ASSIGN exp TO exp DO exp
285 { var = Sym.of_string var
294 { Ast.BreakExp (pos ()) }
297 | LET decs IN exps END
301 Ast.LetExp {decs; body = Ast.SeqExp exps; pos = pos ()}
307 | exp { ($1, pos ()) :: [] }
308 | exp SEMICOLON exps { ($1, pos ()) :: $3 }
312 | ID EQ exp { (Sym.of_string $1, $3, pos ()) :: [] }
313 | ID EQ exp COMMA rec_fields_bind { (Sym.of_string $1, $3, pos ()) :: $5 }
318 | dec decs { $1 :: $2 }
323 | typ_decs %prec LOWEST { Ast.TypeDecs $1 }
324 | fun_decs %prec LOWEST { Ast.FunDecs $1 }
328 | typ_dec { $1 :: [] }
329 | typ_dec typ_decs %prec LOWEST { $1 :: $2 }
335 let type_id_left = $2 in
336 let type_id_right = $4 in
337 let pos = pos () in (* FIXME: rhs id should have its own pos, no? *)
339 { name = Sym.of_string type_id_left
340 ; ty = Ast.NameTy {symbol = Sym.of_string type_id_right; pos}
344 | TYPE ID EQ LBRACE type_fields RBRACE
347 let type_fields = $5 in
349 { name = Sym.of_string type_id
350 ; ty = Ast.RecordTy type_fields
354 | TYPE ID EQ ARRAY OF ID
356 let type_id = Sym.of_string $2 in
357 let element_type_id = Sym.of_string $6 in
361 ; ty = Ast.ArrayTy {symbol = element_type_id; pos}
368 | VAR ID maybe_type_sig ASSIGN exp
370 let var_id = Sym.of_string $2 in
371 let maybe_type_sig = $3 in
377 ; typ = maybe_type_sig
385 | fun_dec { $1 :: [] }
386 | fun_dec fun_decs %prec LOWEST { $1 :: $2 }
390 | FUNCTION ID LPAREN type_fields RPAREN maybe_type_sig EQ exp
392 let name = Sym.of_string $2 in
397 Ast.FunDec {name; params; result; body; pos}
403 | COLON ID { Some (Sym.of_string $2, pos ()) }
413 { name = Sym.of_string $1
415 ; typ = Sym.of_string $3
421 | ID COLON ID COMMA type_fields
425 { name = Sym.of_string $1
427 ; typ = Sym.of_string $3
438 | exp COMMA fun_args { $1 :: $3 }
445 { symbol = Sym.of_string $1
449 | lvalue LBRACK exp RBRACK
461 ; symbol = Sym.of_string $3