make parser more robuust, add string literals and escapes
[ccc.git] / ast.h
diff --git a/ast.h b/ast.h
index 37ac2d5..0332e84 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -53,7 +53,7 @@ struct decl {
 };
 
 struct stmt {
-       enum {sassign, sif, sreturn, sexpr, swhile} type;
+       enum {sassign, sif, sreturn, sexpr, svardecl, swhile} type;
        union {
                struct {
                        char *ident;
@@ -68,6 +68,7 @@ struct stmt {
                        int nels;
                        struct stmt **els;
                } sif;
+               struct vardecl *svardecl;
                struct expr *sreturn;
                struct expr *sexpr;
                struct {
@@ -99,6 +100,8 @@ struct expr {
                        char *ident;
                        int nargs;
                        struct expr **args;
+                       int nfields;
+                       enum fieldspec *fields;
                } efuncall;
                int eint;
                struct {
@@ -110,7 +113,10 @@ struct expr {
                        struct expr *left;
                        struct expr *right;
                } etuple;
-               char *estring;
+               struct {
+                       int nchar;
+                       char *chars;
+               } estring;
                struct {
                        enum unop op;
                        struct expr *l;
@@ -130,13 +136,13 @@ struct stmt *stmt_assign(char *ident, struct list *fields, struct expr *expr);
 struct stmt *stmt_if(struct expr *pred, struct list *then, struct list *els);
 struct stmt *stmt_return(struct expr *rtrn);
 struct stmt *stmt_expr(struct expr *expr);
-struct stmt *stmt_vardecl(struct vardecl vardecl);
+struct stmt *stmt_vardecl(struct vardecl *vardecl);
 struct stmt *stmt_while(struct expr *pred, struct list *body);
 
 struct expr *expr_binop(struct expr *l, enum binop op, struct expr *r);
 struct expr *expr_bool(bool b);
-struct expr *expr_char(const char *c);
-struct expr *expr_funcall(char *ident, struct list *args);
+struct expr *expr_char(char *c);
+struct expr *expr_funcall(char *ident, struct list *args, struct list *fields);
 struct expr *expr_int(int integer);
 struct expr *expr_ident(char *ident, struct list *fields);
 struct expr *expr_nil();