edgecases
[ccc.git] / ast.h
diff --git a/ast.h b/ast.h
index 6b31e0f..37ac2d5 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -57,6 +57,8 @@ struct stmt {
        union {
                struct {
                        char *ident;
+                       int nfield;
+                       char **fields;
                        struct expr *expr;
                } sassign;
                struct {
@@ -84,7 +86,7 @@ enum fieldspec {fst,snd,hd,tl};
 enum unop {negate,inverse};
 struct expr {
        enum {ebinop, ebool, echar, efuncall, eident, eint, enil, etuple,
-               eunop} type;
+               estring, eunop} type;
        union {
                bool ebool;
                struct {
@@ -108,6 +110,7 @@ struct expr {
                        struct expr *left;
                        struct expr *right;
                } etuple;
+               char *estring;
                struct {
                        enum unop op;
                        struct expr *l;
@@ -123,7 +126,7 @@ struct decl *decl_fun(char *ident, struct list *args, struct list *atypes,
        struct type *rtype, struct list *vars, struct list *body);
 struct decl *decl_var(struct vardecl *vardecl);
 
-struct stmt *stmt_assign(char *ident, struct expr *expr);
+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);
@@ -138,6 +141,7 @@ struct expr *expr_int(int integer);
 struct expr *expr_ident(char *ident, struct list *fields);
 struct expr *expr_nil();
 struct expr *expr_tuple(struct expr *left, struct expr *right);
+struct expr *expr_string(char *str);
 struct expr *expr_unop(enum unop op, struct expr *l);
 
 struct type *type_basic(enum basictype type);