add field specifiers
[ccc.git] / ast.h
1 #ifndef AST_H
2 #define AST_H
3
4 #include <stdio.h>
5 #include <stdbool.h>
6
7 enum binop {
8 binor,binand,
9 eq,neq,leq,le,geq,ge,
10 cons,plus,minus,times,divide,modulo,power
11 };
12 enum fieldspec {fst,snd,hd,tl};
13 enum unop {negate,inverse};
14 enum ast_type {
15 an_assign, an_binop, an_bool, an_char, an_cons, an_funcall, an_fundecl,
16 an_ident, an_if, an_int, an_list, an_nil, an_return, an_stmt_expr,
17 an_unop, an_vardecl, an_while
18 };
19 struct ast {
20 enum ast_type type;
21 union {
22 struct {
23 struct ast *ident;
24 struct ast *expr;
25 } an_assign;
26 bool an_bool;
27 struct {
28 struct ast *l;
29 enum binop op;
30 struct ast *r;
31 } an_binop;
32 char an_char;
33 struct {
34 struct ast *el;
35 struct ast *tail;
36 } an_cons;
37 struct {
38 char *ident;
39 int nargs;
40 struct ast **args;
41 } an_funcall;
42 struct {
43 char *ident;
44 int nargs;
45 char **args;
46 int nbody;
47 struct ast **body;
48 } an_fundecl;
49 struct {
50 struct ast *pred;
51 int nthen;
52 struct ast **then;
53 int nels;
54 struct ast **els;
55 } an_if;
56 int an_int;
57 struct {
58 char *ident;
59 int nfields;
60 enum fieldspec *fields;
61 } an_ident;
62 struct {
63 int n;
64 struct ast **ptr;
65 } an_list;
66 //struct { } an_nil;
67 struct ast *an_return;
68 struct ast *an_stmt_expr;
69 struct {
70 enum unop op;
71 struct ast *l;
72 } an_unop;
73 struct {
74 char *ident;
75 struct ast *l;
76 } an_vardecl;
77 struct {
78 struct ast *pred;
79 int nbody;
80 struct ast **body;
81 } an_while;
82 } data;
83 };
84
85 struct ast *ast_assign(struct ast *ident, struct ast *expr);
86 struct ast *ast_binop(struct ast *l, enum binop op, struct ast *tail);
87 struct ast *ast_bool(bool b);
88 struct ast *ast_char(const char *c);
89 struct ast *ast_cons(struct ast *el, struct ast *tail);
90 struct ast *ast_funcall(struct ast *ident, struct ast *args);
91 struct ast *ast_fundecl(struct ast *ident, struct ast *args, struct ast *body);
92 struct ast *ast_if(struct ast *pred, struct ast *then, struct ast *els);
93 struct ast *ast_int(int integer);
94 struct ast *ast_identc(char *ident);
95 struct ast *ast_ident(struct ast *ident, struct ast *fields);
96 struct ast *ast_list(struct ast *llist);
97 struct ast *ast_nil();
98 struct ast *ast_return(struct ast *rtrn);
99 struct ast *ast_stmt_expr(struct ast *expr);
100 struct ast *ast_unop(enum unop op, struct ast *l);
101 struct ast *ast_vardecl(struct ast *ident, struct ast *l);
102 struct ast *ast_while(struct ast *pred, struct ast *body);
103
104 int ast_llistlength(struct ast *list);
105
106 void ast_print(struct ast * ast, int indent, FILE *out);
107 void ast_free(struct ast *ast);
108
109 #endif