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