work on type inference some more
[ccc.git] / ast.h
1 #ifndef AST_H
2 #define AST_H
3
4 #include <stdio.h>
5 #include <stdbool.h>
6
7 #include "util.h"
8 #include "type.h"
9 struct ast;
10 #include "parse.h"
11
12 extern const char *fieldspec_str[];
13 extern const char *binop_str[];
14 extern const char *unop_str[];
15 struct ast {
16 int ndecls;
17 struct decl **decls;
18 };
19
20 struct vardecl {
21 struct type *type;
22 char *ident;
23 struct expr *expr;
24 };
25 struct fundecl {
26 char *ident;
27 int nargs;
28 char **args;
29 int natypes;
30 struct type **atypes;
31 struct type *rtype;
32 int nbody;
33 struct stmt **body;
34 };
35
36 struct decl {
37 //NOTE: DON'T CHANGE THIS ORDER
38 enum {dcomp, dvardecl, dfundecl} type;
39 union {
40 struct {
41 int ndecls;
42 struct fundecl **decls;
43 } dcomp;
44 struct fundecl *dfun;
45 struct vardecl *dvar;
46 } data;
47 };
48
49 struct stmt {
50 enum {sassign, sif, sreturn, sexpr, svardecl, swhile} type;
51 union {
52 struct {
53 char *ident;
54 int nfields;
55 char **fields;
56 struct expr *expr;
57 } sassign;
58 struct {
59 struct expr *pred;
60 int nthen;
61 struct stmt **then;
62 int nels;
63 struct stmt **els;
64 } sif;
65 struct vardecl *svardecl;
66 struct expr *sreturn;
67 struct expr *sexpr;
68 struct {
69 struct expr *pred;
70 int nbody;
71 struct stmt **body;
72 } swhile;
73 } data;
74 };
75
76 enum binop {
77 binor, binand, eq, neq, leq, le, geq, ge, cons, plus, minus, times,
78 divide, modulo, power,
79 };
80 enum fieldspec {fst,snd,hd,tl};
81 enum unop {negate,inverse};
82 struct expr {
83 enum {ebinop, ebool, echar, efuncall, eident, eint, enil, etuple,
84 estring, eunop} type;
85 union {
86 bool ebool;
87 struct {
88 struct expr *l;
89 enum binop op;
90 struct expr *r;
91 } ebinop;
92 char echar;
93 struct {
94 char *ident;
95 int nargs;
96 struct expr **args;
97 int nfields;
98 enum fieldspec *fields;
99 } efuncall;
100 int eint;
101 struct {
102 char *ident;
103 int nfields;
104 enum fieldspec *fields;
105 } eident;
106 struct {
107 struct expr *left;
108 struct expr *right;
109 } etuple;
110 struct {
111 int nchars;
112 char *chars;
113 } estring;
114 struct {
115 enum unop op;
116 struct expr *l;
117 } eunop;
118 } data;
119 };
120
121 struct ast *ast(struct list *decls);
122
123 struct vardecl *vardecl(struct type *type, char *ident, struct expr *expr);
124 struct fundecl *fundecl(char *ident, struct list *args, struct list *atypes,
125 struct type *rtype, struct list *body);
126
127 struct decl *decl_fun(struct fundecl *fundecl);
128 struct decl *decl_var(struct vardecl *vardecl);
129
130 struct stmt *stmt_assign(char *ident, struct list *fields, struct expr *expr);
131 struct stmt *stmt_if(struct expr *pred, struct list *then, struct list *els);
132 struct stmt *stmt_return(struct expr *rtrn);
133 struct stmt *stmt_expr(struct expr *expr);
134 struct stmt *stmt_vardecl(struct vardecl *vardecl);
135 struct stmt *stmt_while(struct expr *pred, struct list *body);
136
137 struct expr *expr_binop(struct expr *l, enum binop op, struct expr *r);
138 struct expr *expr_bool(bool b);
139 struct expr *expr_char(char *c);
140 struct expr *expr_funcall(char *ident, struct list *args, struct list *fields);
141 struct expr *expr_int(int integer);
142 struct expr *expr_ident(char *ident, struct list *fields);
143 struct expr *expr_nil();
144 struct expr *expr_tuple(struct expr *left, struct expr *right);
145 struct expr *expr_string(char *str);
146 struct expr *expr_unop(enum unop op, struct expr *l);
147
148 void ast_print(struct ast *, FILE *out);
149 void vardecl_print(struct vardecl *decl, int indent, FILE *out);
150 void fundecl_print(struct fundecl *decl, FILE *out);
151 void decl_print(struct decl *ast, FILE *out);
152 void stmt_print(struct stmt *ast, int indent, FILE *out);
153 void expr_print(struct expr *ast, FILE *out);
154
155 void ast_free(struct ast *);
156 void vardecl_free(struct vardecl *decl);
157 void fundecl_free(struct fundecl *fundecl);
158 void decl_free(struct decl *ast);
159 void stmt_free(struct stmt *ast);
160 void expr_free(struct expr *ast);
161
162 #endif