};
enum unop {negate,inverse};
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
+ an_assign, an_binop, an_bool, an_char, an_cons, an_funcall, an_fundecl,
+ an_ident, an_if, an_int, an_list, an_nil, an_return, an_stmt_expr,
+ an_unop, an_vardecl, an_while
};
struct ast {
enum ast_type type;
union {
+ struct {
+ char *ident;
+ struct ast *expr;
+ } an_assign;
bool an_bool;
struct {
struct ast *l;
struct ast *el;
struct ast *tail;
} an_cons;
+ struct {
+ char *ident;
+ int nargs;
+ struct ast **args;
+ } an_funcall;
struct {
char *ident;
int nargs;
char **args;
- struct ast *body; // make struct ast **?
+ int nbody;
+ struct ast **body;
} an_fundecl;
struct {
struct ast *pred;
- struct ast *then;
- struct ast *els;
+ int nthen;
+ struct ast **then;
+ int nels;
+ struct ast **els;
} an_if;
int an_int;
char *an_ident;
int n;
struct ast **ptr;
} an_list;
+ //struct { } an_nil;
+ struct ast *an_return;
struct ast *an_stmt_expr;
struct {
enum unop op;
} an_vardecl;
struct {
struct ast *pred;
- struct ast *body;
+ int nbody;
+ struct ast **body;
} an_while;
} data;
};
-struct ast *ast_bool(bool b);
+struct ast *ast_assign(struct ast *ident, struct ast *expr);
struct ast *ast_binop(struct ast *l, enum binop op, struct ast *tail);
+struct ast *ast_bool(bool b);
struct ast *ast_char(const char *c);
struct ast *ast_cons(struct ast *el, struct ast *tail);
+struct ast *ast_funcall(struct ast *ident, struct ast *args);
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_nil();
+struct ast *ast_return(struct ast *rtrn);
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);