add util header, characters, stmts, etc
[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 unop {negate,inverse};
13 enum ast_type {
14 an_binop, an_bool, an_char, an_cons, an_fundecl, an_ident, an_if,
15 an_int, an_list, an_stmt_expr, an_unop, an_vardecl, an_while
16 };
17 struct ast {
18 enum ast_type type;
19 union {
20 bool an_bool;
21 struct {
22 struct ast *l;
23 enum binop op;
24 struct ast *r;
25 } an_binop;
26 char an_char;
27 struct {
28 struct ast *el;
29 struct ast *tail;
30 } an_cons;
31 struct {
32 char *ident;
33 int nargs;
34 char **args;
35 struct ast *body; // make struct ast **?
36 } an_fundecl;
37 struct {
38 struct ast *pred;
39 struct ast *then;
40 struct ast *els;
41 } an_if;
42 int an_int;
43 char *an_ident;
44 struct {
45 int n;
46 struct ast **ptr;
47 } an_list;
48 struct ast *an_stmt_expr;
49 struct {
50 enum unop op;
51 struct ast *l;
52 } an_unop;
53 struct {
54 char *ident;
55 struct ast *l;
56 } an_vardecl;
57 struct {
58 struct ast *pred;
59 struct ast *body;
60 } an_while;
61 } data;
62 };
63
64 struct ast *ast_bool(bool b);
65 struct ast *ast_binop(struct ast *l, enum binop op, struct ast *tail);
66 struct ast *ast_char(const char *c);
67 struct ast *ast_cons(struct ast *el, struct ast *tail);
68 struct ast *ast_fundecl(struct ast *ident, struct ast *args, struct ast *body);
69 struct ast *ast_if(struct ast *pred, struct ast *then, struct ast *els);
70 struct ast *ast_int(int integer);
71 struct ast *ast_ident(char *ident);
72 struct ast *ast_list(struct ast *llist);
73 struct ast *ast_stmt_expr(struct ast *expr);
74 struct ast *ast_unop(enum unop op, struct ast *l);
75 struct ast *ast_vardecl(struct ast *ident, struct ast *l);
76 struct ast *ast_while(struct ast *pred, struct ast *body);
77
78 int ast_llistlength(struct ast *list);
79
80 void ast_print(struct ast * ast, int indent, FILE *out);
81 void ast_free(struct ast *ast);
82
83 #endif