add assign, nil
[ccc.git] / ast.h
diff --git a/ast.h b/ast.h
index 66a23fe..1bb93cb 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -11,12 +11,17 @@ enum binop {
 };
 enum unop {negate,inverse};
 enum ast_type {
-       an_binop, an_bool, an_char, an_cons, an_fundecl, an_ident, an_if,
-       an_int, an_list, an_stmt_expr, an_unop, an_vardecl, an_while
+       an_assign, an_binop, an_bool, an_char, an_cons, an_funcall, an_fundecl,
+       an_ident, an_if, an_int, an_list, an_nil, an_return, an_stmt_expr,
+       an_unop, an_vardecl, an_while
 };
 struct ast {
        enum ast_type type;
        union {
+               struct {
+                       char *ident;
+                       struct ast *expr;
+               } an_assign;
                bool an_bool;
                struct {
                        struct ast *l;
@@ -28,16 +33,24 @@ struct ast {
                        struct ast *el;
                        struct ast *tail;
                } an_cons;
+               struct {
+                       char *ident;
+                       int nargs;
+                       struct ast **args;
+               } an_funcall;
                struct {
                        char *ident;
                        int nargs;
                        char **args;
-                       struct ast *body; // make struct ast **?
+                       int nbody;
+                       struct ast **body;
                } an_fundecl;
                struct {
                        struct ast *pred;
-                       struct ast *then;
-                       struct ast *els;
+                       int nthen;
+                       struct ast **then;
+                       int nels;
+                       struct ast **els;
                } an_if;
                int an_int;
                char *an_ident;
@@ -45,6 +58,8 @@ struct ast {
                        int n;
                        struct ast **ptr;
                } an_list;
+               //struct { } an_nil;
+               struct ast *an_return;
                struct ast *an_stmt_expr;
                struct {
                        enum unop op;
@@ -56,20 +71,25 @@ struct ast {
                } an_vardecl;
                struct {
                        struct ast *pred;
-                       struct ast *body;
+                       int nbody;
+                       struct ast **body;
                } an_while;
        } data;
 };
 
-struct ast *ast_bool(bool b);
+struct ast *ast_assign(struct ast *ident, struct ast *expr);
 struct ast *ast_binop(struct ast *l, enum binop op, struct ast *tail);
+struct ast *ast_bool(bool b);
 struct ast *ast_char(const char *c);
 struct ast *ast_cons(struct ast *el, struct ast *tail);
+struct ast *ast_funcall(struct ast *ident, struct ast *args);
 struct ast *ast_fundecl(struct ast *ident, struct ast *args, struct ast *body);
 struct ast *ast_if(struct ast *pred, struct ast *then, struct ast *els);
 struct ast *ast_int(int integer);
 struct ast *ast_ident(char *ident);
 struct ast *ast_list(struct ast *llist);
+struct ast *ast_nil();
+struct ast *ast_return(struct ast *rtrn);
 struct ast *ast_stmt_expr(struct ast *expr);
 struct ast *ast_unop(enum unop op, struct ast *l);
 struct ast *ast_vardecl(struct ast *ident, struct ast *l);