work on type inference some more
[ccc.git] / ast.c
diff --git a/ast.c b/ast.c
index bb8a541..1e93a71 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -4,6 +4,7 @@
 
 #include "util.h"
 #include "ast.h"
+#include "type.h"
 #include "list.h"
 #include "parse.h"
 
@@ -16,10 +17,6 @@ const char *binop_str[] = {
 const char *fieldspec_str[] = {
        [fst] = "fst", [snd] = "snd", [hd] = "hd", [tl] = "tl"};
 const char *unop_str[] = { [inverse] = "!", [negate] = "-", };
-static const char *basictype_str[] = {
-       [btbool] = "Bool", [btchar] = "Char", [btint] = "Int",
-       [btvoid] = "Void",
-};
 
 struct ast *ast(struct list *decls)
 {
@@ -237,57 +234,6 @@ struct expr *expr_unop(enum unop op, struct expr *l)
        return res;
 }
 
-struct type *type_basic(enum basictype type)
-{
-       struct type *res = safe_malloc(sizeof(struct type));
-       res->type = tbasic;
-       res->data.tbasic = type;
-       return res;
-}
-
-struct type *type_list(struct type *type)
-{
-       struct type *res = safe_malloc(sizeof(struct type));
-       res->type = tlist;
-       res->data.tlist = type;
-       return res;
-}
-
-struct type *type_tuple(struct type *l, struct type *r)
-{
-       struct type *res = safe_malloc(sizeof(struct type));
-       res->type = ttuple;
-       res->data.ttuple.l = l;
-       res->data.ttuple.r = r;
-       return res;
-}
-
-struct type *type_var(char *ident)
-{
-       struct type *res = safe_malloc(sizeof(struct type));
-       if (strcmp(ident, "Int") == 0) {
-               res->type = tbasic;
-               res->data.tbasic = btint;
-               free(ident);
-       } else if (strcmp(ident, "Char") == 0) {
-               res->type = tbasic;
-               res->data.tbasic = btchar;
-               free(ident);
-       } else if (strcmp(ident, "Bool") == 0) {
-               res->type = tbasic;
-               res->data.tbasic = btbool;
-               free(ident);
-       } else if (strcmp(ident, "Void") == 0) {
-               res->type = tbasic;
-               res->data.tbasic = btvoid;
-               free(ident);
-       } else {
-               res->type = tvar;
-               res->data.tvar = ident;
-       }
-       return res;
-}
-
 void ast_print(struct ast *ast, FILE *out)
 {
        if (ast == NULL)
@@ -479,34 +425,6 @@ void expr_print(struct expr *expr, FILE *out)
        }
 }
 
-void type_print(struct type *type, FILE *out)
-{
-       if (type == NULL)
-               return;
-       switch (type->type) {
-       case tbasic:
-               safe_fprintf(out, "%s", basictype_str[type->data.tbasic]);
-               break;
-       case tlist:
-               safe_fprintf(out, "[");
-               type_print(type->data.tlist, out);
-               safe_fprintf(out, "]");
-               break;
-       case ttuple:
-               safe_fprintf(out, "(");
-               type_print(type->data.ttuple.l, out);
-               safe_fprintf(out, ",");
-               type_print(type->data.ttuple.r, out);
-               safe_fprintf(out, ")");
-               break;
-       case tvar:
-               safe_fprintf(out, "%s", type->data.tvar);
-               break;
-       default:
-               die("Unsupported type node\n");
-       }
-}
-
 void ast_free(struct ast *ast)
 {
        if (ast == NULL)
@@ -648,26 +566,3 @@ void expr_free(struct expr *expr)
        }
        free(expr);
 }
-
-void type_free(struct type *type)
-{
-       if (type == NULL)
-               return;
-       switch (type->type) {
-       case tbasic:
-               break;
-       case tlist:
-               type_free(type->data.tlist);
-               break;
-       case ttuple:
-               type_free(type->data.ttuple.l);
-               type_free(type->data.ttuple.r);
-               break;
-       case tvar:
-               free(type->data.tvar);
-               break;
-       default:
-               die("Unsupported type node\n");
-       }
-       free(type);
-}