make parser more robuust, add string literals and escapes
[ccc.git] / parse.y
diff --git a/parse.y b/parse.y
index dc85dac..ee3a55a 100644 (file)
--- a/parse.y
+++ b/parse.y
@@ -81,21 +81,23 @@ funtype
        : /* 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; }
@@ -132,6 +134,7 @@ stmt
        | 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
@@ -152,7 +155,7 @@ 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