add util header, characters, stmts, etc
[ccc.git] / ast.h
diff --git a/ast.h b/ast.h
index 872e25c..66a23fe 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -2,6 +2,7 @@
 #define AST_H
 
 #include <stdio.h>
+#include <stdbool.h>
 
 enum binop {
        binor,binand,
@@ -9,34 +10,74 @@ enum binop {
        cons,plus,minus,times,divide,modulo,power
 };
 enum unop {negate,inverse};
-enum ast_type {an_binop, an_cons, an_int, an_unop};
+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
+};
 struct ast {
        enum ast_type type;
        union {
+               bool an_bool;
                struct {
                        struct ast *l;
                        enum binop op;
                        struct ast *r;
                } an_binop;
+               char an_char;
                struct {
                        struct ast *el;
                        struct ast *tail;
                } an_cons;
+               struct {
+                       char *ident;
+                       int nargs;
+                       char **args;
+                       struct ast *body; // make struct ast **?
+               } an_fundecl;
+               struct {
+                       struct ast *pred;
+                       struct ast *then;
+                       struct ast *els;
+               } an_if;
                int an_int;
+               char *an_ident;
+               struct {
+                       int n;
+                       struct ast **ptr;
+               } an_list;
+               struct ast *an_stmt_expr;
                struct {
                        enum unop op;
                        struct ast *l;
                } an_unop;
-
+               struct {
+                       char *ident;
+                       struct ast *l;
+               } an_vardecl;
+               struct {
+                       struct ast *pred;
+                       struct ast *body;
+               } an_while;
        } data;
 };
 
-struct ast *ast_cons(struct ast *el, struct ast *tail);
+struct ast *ast_bool(bool b);
 struct ast *ast_binop(struct ast *l, enum binop op, struct ast *tail);
+struct ast *ast_char(const char *c);
+struct ast *ast_cons(struct ast *el, struct ast *tail);
+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_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);
+struct ast *ast_while(struct ast *pred, struct ast *body);
+
+int ast_llistlength(struct ast *list);
 
-void ast_print(struct ast * ast, FILE *out);
+void ast_print(struct ast * ast, int indent, FILE *out);
 void ast_free(struct ast *ast);
 
 #endif