fix minor memory leak
[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
9 struct ast {
10 int ndecls;
11 struct decl **decls;
12 };
13
14 struct vardecl {
15 char *ident;
16 struct expr *expr;
17 };
18
19 struct decl {
20 enum {dfundecl, dvardecl} type;
21 union {
22 struct {
23 char *ident;
24 int nargs;
25 char **args;
26 int nbody;
27 struct stmt **body;
28 } dfun;
29 struct vardecl dvar;
30 } data;
31 };
32
33 struct stmt {
34 enum {sassign, sif, sreturn, sexpr, svardecl, swhile} type;
35 union {
36 struct {
37 char *ident;
38 struct expr *expr;
39 } sassign;
40 struct {
41 struct expr *pred;
42 int nthen;
43 struct stmt **then;
44 int nels;
45 struct stmt **els;
46 } sif;
47 struct expr *sreturn;
48 struct expr *sexpr;
49 struct vardecl svardecl;
50 struct {
51 struct expr *pred;
52 int nbody;
53 struct stmt **body;
54 } swhile;
55 } data;
56 };
57
58 enum binop {
59 binor, binand, eq, neq, leq, le, geq, ge, cons, plus, minus, times,
60 divide, modulo, power,
61 };
62 enum fieldspec {fst,snd,hd,tl};
63 enum unop {negate,inverse};
64 struct expr {
65 enum {ebinop, ebool, echar, efuncall, eident, eint, enil, etuple,
66 eunop} type;
67 union {
68 bool ebool;
69 struct {
70 struct expr *l;
71 enum binop op;
72 struct expr *r;
73 } ebinop;
74 char echar;
75 struct {
76 char *ident;
77 int nargs;
78 struct expr **args;
79 } efuncall;
80 int eint;
81 struct {
82 char *ident;
83 int nfields;
84 enum fieldspec *fields;
85 } eident;
86 struct {
87 struct expr *left;
88 struct expr *right;
89 } etuple;
90 struct {
91 enum unop op;
92 struct expr *l;
93 } eunop;
94 } data;
95 };
96
97 struct ast *ast(struct list *decls);
98
99 struct decl *decl_fun(char *ident, struct list *args, struct list *body);
100 struct decl *decl_var(struct vardecl vardecl);
101
102 struct stmt *stmt_assign(char *ident, struct expr *expr);
103 struct stmt *stmt_if(struct expr *pred, struct list *then, struct list *els);
104 struct stmt *stmt_return(struct expr *rtrn);
105 struct stmt *stmt_expr(struct expr *expr);
106 struct stmt *stmt_vardecl(struct vardecl vardecl);
107 struct stmt *stmt_while(struct expr *pred, struct list *body);
108
109 struct expr *expr_binop(struct expr *l, enum binop op, struct expr *r);
110 struct expr *expr_bool(bool b);
111 struct expr *expr_char(const char *c);
112 struct expr *expr_funcall(char *ident, struct list *args);
113 struct expr *expr_int(int integer);
114 struct expr *expr_ident(char *ident, struct list *fields);
115 struct expr *expr_nil();
116 struct expr *expr_tuple(struct expr *left, struct expr *right);
117 struct expr *expr_unop(enum unop op, struct expr *l);
118
119 void ast_print(struct ast *, FILE *out);
120 void decl_print(struct decl *ast, int indent, FILE *out);
121 void stmt_print(struct stmt *ast, int indent, FILE *out);
122 void expr_print(struct expr *ast, FILE *out);
123
124 void ast_free(struct ast *);
125 void decl_free(struct decl *ast);
126 void stmt_free(struct stmt *ast);
127 void expr_free(struct expr *ast);
128
129 #endif