work on type inference some more
[ccc.git] / ast.h
diff --git a/ast.h b/ast.h
index a001757..635d0c8 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -5,28 +5,44 @@
 #include <stdbool.h>
 
 #include "util.h"
+#include "type.h"
+struct ast;
+#include "parse.h"
 
+extern const char *fieldspec_str[];
+extern const char *binop_str[];
+extern const char *unop_str[];
 struct ast {
        int ndecls;
        struct decl **decls;
 };
 
 struct vardecl {
+       struct type *type;
        char *ident;
        struct expr *expr;
 };
+struct fundecl {
+       char *ident;
+       int nargs;
+       char **args;
+       int natypes;
+       struct type **atypes;
+       struct type *rtype;
+       int nbody;
+       struct stmt **body;
+};
 
 struct decl {
-       enum {dfundecl, dvardecl} type;
+       //NOTE: DON'T CHANGE THIS ORDER
+       enum {dcomp, dvardecl, dfundecl} type;
        union {
                struct {
-                       char *ident;
-                       int nargs;
-                       char **args;
-                       int nbody;
-                       struct stmt **body;
-               } dfun;
-               struct vardecl dvar;
+                       int ndecls;
+                       struct fundecl **decls;
+               } dcomp;
+               struct fundecl *dfun;
+               struct vardecl *dvar;
        } data;
 };
 
@@ -35,6 +51,8 @@ struct stmt {
        union {
                struct {
                        char *ident;
+                       int nfields;
+                       char **fields;
                        struct expr *expr;
                } sassign;
                struct {
@@ -44,9 +62,9 @@ struct stmt {
                        int nels;
                        struct stmt **els;
                } sif;
+               struct vardecl *svardecl;
                struct expr *sreturn;
                struct expr *sexpr;
-               struct vardecl svardecl;
                struct {
                        struct expr *pred;
                        int nbody;
@@ -63,7 +81,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 {
@@ -76,6 +94,8 @@ struct expr {
                        char *ident;
                        int nargs;
                        struct expr **args;
+                       int nfields;
+                       enum fieldspec *fields;
                } efuncall;
                int eint;
                struct {
@@ -87,6 +107,10 @@ struct expr {
                        struct expr *left;
                        struct expr *right;
                } etuple;
+               struct {
+                       int nchars;
+                       char *chars;
+               } estring;
                struct {
                        enum unop op;
                        struct expr *l;
@@ -96,34 +120,41 @@ struct expr {
 
 struct ast *ast(struct list *decls);
 
-struct vardecl vardecl(char *ident, struct expr *expr);
+struct vardecl *vardecl(struct type *type, char *ident, struct expr *expr);
+struct fundecl *fundecl(char *ident, struct list *args, struct list *atypes,
+       struct type *rtype, struct list *body);
 
-struct decl *decl_fun(char *ident, struct list *args, struct list *body);
-struct decl *decl_var(struct vardecl vardecl);
+struct decl *decl_fun(struct fundecl *fundecl);
+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);
-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();
 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);
 
 void ast_print(struct ast *, FILE *out);
-void decl_print(struct decl *ast, int indent, FILE *out);
+void vardecl_print(struct vardecl *decl, int indent, FILE *out);
+void fundecl_print(struct fundecl *decl, FILE *out);
+void decl_print(struct decl *ast, FILE *out);
 void stmt_print(struct stmt *ast, int indent, FILE *out);
 void expr_print(struct expr *ast, FILE *out);
 
 void ast_free(struct ast *);
+void vardecl_free(struct vardecl *decl);
+void fundecl_free(struct fundecl *fundecl);
 void decl_free(struct decl *ast);
 void stmt_free(struct stmt *ast);
 void expr_free(struct expr *ast);