#define AST_H
#include <stdio.h>
+#include <stdbool.h>
enum binop {
binor,binand,
cons,plus,minus,times,divide,modulo,power
};
enum unop {negate,inverse};
-enum ast_type {an_binop, an_cons, an_int, an_unop};
+enum ast_type {
+ an_binop, an_bool, an_char, an_cons, an_fundecl, an_ident, an_if,
+ an_int, an_list, an_stmt_expr, an_unop, an_vardecl, an_while
+};
struct ast {
enum ast_type type;
union {
+ bool an_bool;
struct {
struct ast *l;
enum binop op;
struct ast *r;
} an_binop;
+ char an_char;
struct {
struct ast *el;
struct ast *tail;
} an_cons;
+ struct {
+ char *ident;
+ int nargs;
+ char **args;
+ struct ast *body; // make struct ast **?
+ } an_fundecl;
+ struct {
+ struct ast *pred;
+ struct ast *then;
+ struct ast *els;
+ } an_if;
int an_int;
+ char *an_ident;
+ struct {
+ int n;
+ struct ast **ptr;
+ } an_list;
+ struct ast *an_stmt_expr;
struct {
enum unop op;
struct ast *l;
} an_unop;
-
+ struct {
+ char *ident;
+ struct ast *l;
+ } an_vardecl;
+ struct {
+ struct ast *pred;
+ struct ast *body;
+ } an_while;
} data;
};
-struct ast *ast_cons(struct ast *el, struct ast *tail);
+struct ast *ast_bool(bool b);
struct ast *ast_binop(struct ast *l, enum binop op, struct ast *tail);
+struct ast *ast_char(const char *c);
+struct ast *ast_cons(struct ast *el, struct ast *tail);
+struct ast *ast_fundecl(struct ast *ident, struct ast *args, struct ast *body);
+struct ast *ast_if(struct ast *pred, struct ast *then, struct ast *els);
struct ast *ast_int(int integer);
+struct ast *ast_ident(char *ident);
+struct ast *ast_list(struct ast *llist);
+struct ast *ast_stmt_expr(struct ast *expr);
struct ast *ast_unop(enum unop op, struct ast *l);
+struct ast *ast_vardecl(struct ast *ident, struct ast *l);
+struct ast *ast_while(struct ast *pred, struct ast *body);
+
+int ast_llistlength(struct ast *list);
-void ast_print(struct ast * ast, FILE *out);
+void ast_print(struct ast * ast, int indent, FILE *out);
void ast_free(struct ast *ast);
#endif