add assign, nil
[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_assign, an_binop, an_bool, an_char, an_cons, an_funcall, an_fundecl,
15 an_ident, an_if, an_int, an_list, an_nil, an_return, an_stmt_expr,
16 an_unop, an_vardecl, an_while
17 };
18 struct ast {
19 enum ast_type type;
20 union {
21 struct {
22 char *ident;
23 struct ast *expr;
24 } an_assign;
25 bool an_bool;
26 struct {
27 struct ast *l;
28 enum binop op;
29 struct ast *r;
30 } an_binop;
31 char an_char;
32 struct {
33 struct ast *el;
34 struct ast *tail;
35 } an_cons;
36 struct {
37 char *ident;
38 int nargs;
39 struct ast **args;
40 } an_funcall;
41 struct {
42 char *ident;
43 int nargs;
44 char **args;
45 int nbody;
46 struct ast **body;
47 } an_fundecl;
48 struct {
49 struct ast *pred;
50 int nthen;
51 struct ast **then;
52 int nels;
53 struct ast **els;
54 } an_if;
55 int an_int;
56 char *an_ident;
57 struct {
58 int n;
59 struct ast **ptr;
60 } an_list;
61 //struct { } an_nil;
62 struct ast *an_return;
63 struct ast *an_stmt_expr;
64 struct {
65 enum unop op;
66 struct ast *l;
67 } an_unop;
68 struct {
69 char *ident;
70 struct ast *l;
71 } an_vardecl;
72 struct {
73 struct ast *pred;
74 int nbody;
75 struct ast **body;
76 } an_while;
77 } data;
78 };
79
80 struct ast *ast_assign(struct ast *ident, struct ast *expr);
81 struct ast *ast_binop(struct ast *l, enum binop op, struct ast *tail);
82 struct ast *ast_bool(bool b);
83 struct ast *ast_char(const char *c);
84 struct ast *ast_cons(struct ast *el, struct ast *tail);
85 struct ast *ast_funcall(struct ast *ident, struct ast *args);
86 struct ast *ast_fundecl(struct ast *ident, struct ast *args, struct ast *body);
87 struct ast *ast_if(struct ast *pred, struct ast *then, struct ast *els);
88 struct ast *ast_int(int integer);
89 struct ast *ast_ident(char *ident);
90 struct ast *ast_list(struct ast *llist);
91 struct ast *ast_nil();
92 struct ast *ast_return(struct ast *rtrn);
93 struct ast *ast_stmt_expr(struct ast *expr);
94 struct ast *ast_unop(enum unop op, struct ast *l);
95 struct ast *ast_vardecl(struct ast *ident, struct ast *l);
96 struct ast *ast_while(struct ast *pred, struct ast *body);
97
98 int ast_llistlength(struct ast *list);
99
100 void ast_print(struct ast * ast, int indent, FILE *out);
101 void ast_free(struct ast *ast);
102
103 #endif