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