|
@@ -48,84 +48,87 @@ program : decl*; EOF
|
|
|
{ Program ($1, LOC) }
|
|
{ Program ($1, LOC) }
|
|
|
|
|
|
|
|
decl : EXTERN; fun_header; SEMICOL
|
|
decl : EXTERN; fun_header; SEMICOL
|
|
|
- { let (t, n, p) = $2 in FunDec(t, n, p) }
|
|
|
|
|
|
|
+ { let (t, n, p) = $2 in FunDec(t, n, p, LOC) }
|
|
|
| boption(EXPORT); fun_header; LBRACE; fun_body; RBRACE
|
|
| boption(EXPORT); fun_header; LBRACE; fun_body; RBRACE
|
|
|
- { let (t, n, p) = $2 in FunDef ($1, t, n, p, $4) }
|
|
|
|
|
|
|
+ { let (t, n, p) = $2 in FunDef ($1, t, n, p, $4, LOC) }
|
|
|
|
|
|
|
|
| EXTERN; basic_type; ID; SEMICOL
|
|
| EXTERN; basic_type; ID; SEMICOL
|
|
|
- { GlobalDec ($2, $3) }
|
|
|
|
|
|
|
+ { GlobalDec ($2, $3, LOC) }
|
|
|
| EXTERN; t=basic_type; LBRACK; d=separated_list(COMMA, ID); RBRACK; n=ID; SEMICOL
|
|
| EXTERN; t=basic_type; LBRACK; d=separated_list(COMMA, ID); RBRACK; n=ID; SEMICOL
|
|
|
- { GlobalDec (ArrayDec (t, d), n) }
|
|
|
|
|
|
|
+ { GlobalDec (ArrayDec (t, d), n, LOC) }
|
|
|
|
|
|
|
|
| boption(EXPORT); basic_type; ID; SEMICOL
|
|
| boption(EXPORT); basic_type; ID; SEMICOL
|
|
|
- { GlobalDef ($1, $2, $3, None) }
|
|
|
|
|
|
|
+ { GlobalDef ($1, $2, $3, None, LOC) }
|
|
|
| boption(EXPORT); basic_type; ID; ASSIGN; expr; SEMICOL
|
|
| boption(EXPORT); basic_type; ID; ASSIGN; expr; SEMICOL
|
|
|
- { GlobalDef ($1, $2, $3, Some $5) }
|
|
|
|
|
|
|
+ { GlobalDef ($1, $2, $3, Some $5, LOC) }
|
|
|
|
|
|
|
|
- | e=boption(EXPORT); t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; SEMICOL
|
|
|
|
|
- { GlobalDef (e, ArrayDef (t, d), n, None) }
|
|
|
|
|
- | e=boption(EXPORT); t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; ASSIGN; v=expr; SEMICOL
|
|
|
|
|
- { GlobalDef (e, ArrayDef (t, d), n, Some v) }
|
|
|
|
|
|
|
+ | e=boption(EXPORT); t=basic_type; LBRACK; d=separated_list(COMMA, expr);
|
|
|
|
|
+ RBRACK; n=ID; SEMICOL
|
|
|
|
|
+ { GlobalDef (e, ArrayDef (t, d), n, None, LOC) }
|
|
|
|
|
+ | e=boption(EXPORT); t=basic_type; LBRACK; d=separated_list(COMMA, expr);
|
|
|
|
|
+ RBRACK; n=ID; ASSIGN; v=expr; SEMICOL
|
|
|
|
|
+ { GlobalDef (e, ArrayDef (t, d), n, Some v, LOC) }
|
|
|
|
|
|
|
|
fun_header : ret=basic_type; name=ID; LPAREN; params=separated_list(COMMA, param); RPAREN
|
|
fun_header : ret=basic_type; name=ID; LPAREN; params=separated_list(COMMA, param); RPAREN
|
|
|
{ (ret, name, params) }
|
|
{ (ret, name, params) }
|
|
|
| VOID; name=ID; LPAREN; params=separated_list(COMMA, param); RPAREN
|
|
| VOID; name=ID; LPAREN; params=separated_list(COMMA, param); RPAREN
|
|
|
{ (Void, name, params) }
|
|
{ (Void, name, params) }
|
|
|
|
|
|
|
|
-param : basic_type; ID { Param ($1, $2) }
|
|
|
|
|
|
|
+param : basic_type; ID { Param ($1, $2, LOC) }
|
|
|
|
|
|
|
|
fun_body : var_dec* local_fun_dec* statement* loption(return_statement)
|
|
fun_body : var_dec* local_fun_dec* statement* loption(return_statement)
|
|
|
{ $1 @ $2 @ $3 }
|
|
{ $1 @ $2 @ $3 }
|
|
|
|
|
|
|
|
local_fun_dec : fun_header; LBRACE; fun_body; RBRACE
|
|
local_fun_dec : fun_header; LBRACE; fun_body; RBRACE
|
|
|
- { let (t, n, p) = $1 in FunDef (false, t, n, p, $3) }
|
|
|
|
|
|
|
+ { let (t, n, p) = $1 in FunDef (false, t, n, p, $3, LOC) }
|
|
|
|
|
|
|
|
var_dec : basic_type; ID; SEMICOL
|
|
var_dec : basic_type; ID; SEMICOL
|
|
|
- { VarDec ($1, $2, None) }
|
|
|
|
|
|
|
+ { VarDec ($1, $2, None, LOC) }
|
|
|
| basic_type; ID; ASSIGN; expr; SEMICOL
|
|
| basic_type; ID; ASSIGN; expr; SEMICOL
|
|
|
- { VarDec ($1, $2, Some $4) }
|
|
|
|
|
|
|
+ { VarDec ($1, $2, Some $4, LOC) }
|
|
|
| t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; SEMICOL
|
|
| t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; SEMICOL
|
|
|
- { VarDec (ArrayDef (t, d), n, None) }
|
|
|
|
|
|
|
+ { VarDec (ArrayDef (t, d), n, None, LOC) }
|
|
|
| t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; ASSIGN; v=expr; SEMICOL
|
|
| t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; ASSIGN; v=expr; SEMICOL
|
|
|
- { VarDec (ArrayDef (t, d), n, Some v) }
|
|
|
|
|
|
|
+ { VarDec (ArrayDef (t, d), n, Some v, LOC) }
|
|
|
|
|
|
|
|
statement : ID; ASSIGN; expr; SEMICOL
|
|
statement : ID; ASSIGN; expr; SEMICOL
|
|
|
- { Assign ($1, $3) }
|
|
|
|
|
|
|
+ { Assign ($1, $3, LOC) }
|
|
|
| name=ID; LPAREN; params=separated_list(COMMA, expr); RPAREN; SEMICOL
|
|
| name=ID; LPAREN; params=separated_list(COMMA, expr); RPAREN; SEMICOL
|
|
|
- { Expr (FunCall (name, params)) }
|
|
|
|
|
|
|
+ { Expr (FunCall (name, params, LOC)) }
|
|
|
| IF; LPAREN; expr; RPAREN; block
|
|
| IF; LPAREN; expr; RPAREN; block
|
|
|
- { If ($3, $5) } %prec IF
|
|
|
|
|
|
|
+ { If ($3, $5, LOC) } %prec IF
|
|
|
| IF; LPAREN; expr; RPAREN; block; ELSE; block
|
|
| IF; LPAREN; expr; RPAREN; block; ELSE; block
|
|
|
- { IfElse ($3, $5, $7) } %prec ELSE
|
|
|
|
|
|
|
+ { IfElse ($3, $5, $7, LOC) } %prec ELSE
|
|
|
| WHILE; LPAREN; expr; RPAREN; block
|
|
| WHILE; LPAREN; expr; RPAREN; block
|
|
|
- { While ($3, $5) }
|
|
|
|
|
|
|
+ { While ($3, $5, LOC) }
|
|
|
| DO; block; WHILE; LPAREN; expr; RPAREN; SEMICOL
|
|
| DO; block; WHILE; LPAREN; expr; RPAREN; SEMICOL
|
|
|
- { DoWhile ($5, $2) }
|
|
|
|
|
|
|
+ { DoWhile ($5, $2, LOC) }
|
|
|
| FOR; LPAREN; INT; id=ID; ASSIGN; start=expr; COMMA; stop=expr; RPAREN; body=block
|
|
| FOR; LPAREN; INT; id=ID; ASSIGN; start=expr; COMMA; stop=expr; RPAREN; body=block
|
|
|
- { For (id, start, stop, IntConst 1, body) }
|
|
|
|
|
- | FOR; LPAREN; INT; id=ID; ASSIGN; start=expr; COMMA; stop=expr; COMMA; step=expr; RPAREN; body=block
|
|
|
|
|
- { For (id, start, stop, step, body) }
|
|
|
|
|
|
|
+ { For (id, start, stop, IntConst (1, noloc), body, LOC) }
|
|
|
|
|
+ | FOR; LPAREN; INT; id=ID; ASSIGN; start=expr; COMMA; stop=expr;
|
|
|
|
|
+ COMMA; step=expr; RPAREN; body=block
|
|
|
|
|
+ { For (id, start, stop, step, body, LOC) }
|
|
|
|
|
|
|
|
-return_statement : RETURN; expr; SEMICOL { [Return ($2)] }
|
|
|
|
|
|
|
+return_statement : RETURN; expr; SEMICOL { [Return ($2, LOC)] }
|
|
|
|
|
|
|
|
block : LBRACE; statement*; RBRACE { $2 }
|
|
block : LBRACE; statement*; RBRACE { $2 }
|
|
|
| statement { [$1] }
|
|
| statement { [$1] }
|
|
|
|
|
|
|
|
expr : LPAREN; expr; RPAREN { $2 }
|
|
expr : LPAREN; expr; RPAREN { $2 }
|
|
|
| name=ID; LPAREN; params=separated_list(COMMA, expr); RPAREN
|
|
| name=ID; LPAREN; params=separated_list(COMMA, expr); RPAREN
|
|
|
- { FunCall (name, params) }
|
|
|
|
|
- | ID { Var $1 }
|
|
|
|
|
- | l=expr; op=binop; r=expr { Binop (op, l, r) }
|
|
|
|
|
- | SUB; expr { Monop (Neg, $2) } %prec NEG
|
|
|
|
|
- | NOT; expr { Monop (Not, $2) }
|
|
|
|
|
- | LPAREN; basic_type; RPAREN; expr { TypeCast ($2, $4) } %prec CAST
|
|
|
|
|
- | FLOAT_CONST { FloatConst $1 }
|
|
|
|
|
- | INT_CONST { IntConst $1 }
|
|
|
|
|
- | BOOL_CONST { BoolConst $1 }
|
|
|
|
|
- | ID; array_const { Deref ($1, $2) }
|
|
|
|
|
- | array_const { ArrayConst $1 }
|
|
|
|
|
-
|
|
|
|
|
-array_const : LBRACK; values=separated_list(COMMA, expr); RBRACK { values }
|
|
|
|
|
|
|
+ { FunCall (name, params, LOC) }
|
|
|
|
|
+ | ID { Var ($1, LOC) }
|
|
|
|
|
+ | l=expr; op=binop; r=expr { Binop (op, l, r, LOC) }
|
|
|
|
|
+ | SUB; expr { Monop (Neg, $2, LOC) } %prec NEG
|
|
|
|
|
+ | NOT; expr { Monop (Not, $2, LOC) }
|
|
|
|
|
+ | LPAREN; basic_type; RPAREN; expr { TypeCast ($2, $4, LOC) } %prec CAST
|
|
|
|
|
+ | FLOAT_CONST { FloatConst ($1, LOC) }
|
|
|
|
|
+ | INT_CONST { IntConst ($1, LOC) }
|
|
|
|
|
+ | BOOL_CONST { BoolConst ($1, LOC) }
|
|
|
|
|
+ | ID; array_const { Deref ($1, $2, LOC) }
|
|
|
|
|
+ | array_const { ArrayConst ($1, LOC) }
|
|
|
|
|
+
|
|
|
|
|
+array_const : LBRACK; values=separated_list(COMMA, expr); RBRACK { values }
|
|
|
|
|
|
|
|
%inline binop : ADD { Add }
|
|
%inline binop : ADD { Add }
|
|
|
| SUB { Sub }
|
|
| SUB { Sub }
|