: /* empty */ { $$ = NULL; }
| funtype ftype { $$ = list_cons($2, $1); }
;
-ftype
+/* don't allow vardecls to be fully polymorph, this complicates parsing a lot */
+type
: BOPEN ftype COMMA ftype BCLOSE { $$ = type_tuple($2, $4); }
| SOPEN ftype SCLOSE { $$ = type_list($2); }
| TBOOL { $$ = type_basic(btbool); }
| TCHAR { $$ = type_basic(btchar); }
| TINT { $$ = type_basic(btint); }
| TVOID { $$ = type_basic(btvoid); }
- | IDENT { $$ = type_var($1); }
-type
- : BOPEN type COMMA type BCLOSE { $$ = type_tuple($2, $4); }
- | SOPEN type SCLOSE { $$ = type_list($2); }
+ ;
+ftype
+ : BOPEN ftype COMMA ftype BCLOSE { $$ = type_tuple($2, $4); }
+ | SOPEN ftype SCLOSE { $$ = type_list($2); }
| TBOOL { $$ = type_basic(btbool); }
| TCHAR { $$ = type_basic(btchar); }
| TINT { $$ = type_basic(btint); }
| TVOID { $$ = type_basic(btvoid); }
+ | IDENT { $$ = type_var($1); }
;
args
: /* empty */ { $$ = NULL; }
| IDENT field ASSIGN expr SEMICOLON { $$ = stmt_assign($1, $2, $4); }
| RETURN expr SEMICOLON { $$ = stmt_return($2); }
| RETURN SEMICOLON { $$ = stmt_return(NULL); }
+ | vardecl { $$ = stmt_vardecl($1); }
| expr SEMICOLON { $$ = stmt_expr($1); }
;
expr
| expr POWER expr { $$ = expr_binop($1, power, $3); }
| MINUS expr %prec TIMES { $$ = expr_unop(negate, $2); }
| INVERSE expr %prec TIMES { $$ = expr_unop(inverse, $2); }
- | IDENT BOPEN fargs BCLOSE { $$ = expr_funcall($1, $3); }
+ | IDENT BOPEN fargs BCLOSE field { $$ = expr_funcall($1, $3, $5); }
| BOPEN expr COMMA expr BCLOSE { $$ = expr_tuple($2, $4); }
| BOPEN expr BCLOSE { $$ = $2; }
| INTEGER