20 enum {dfundecl
, dvardecl
} type
;
34 enum {sassign
, sif
, sreturn
, sexpr
, svardecl
, swhile
} type
;
49 struct vardecl svardecl
;
59 binor
, binand
, eq
, neq
, leq
, le
, geq
, ge
, cons
, plus
, minus
, times
,
60 divide
, modulo
, power
,
62 enum fieldspec
{fst
,snd
,hd
,tl
};
63 enum unop
{negate
,inverse
};
65 enum {ebinop
, ebool
, echar
, efuncall
, eident
, eint
, enil
, etuple
,
84 enum fieldspec
*fields
;
97 struct ast
*ast(struct list
*decls
);
99 struct vardecl
vardecl(char *ident
, struct expr
*expr
);
101 struct decl
*decl_fun(char *ident
, struct list
*args
, struct list
*body
);
102 struct decl
*decl_var(struct vardecl vardecl
);
104 struct stmt
*stmt_assign(char *ident
, struct expr
*expr
);
105 struct stmt
*stmt_if(struct expr
*pred
, struct list
*then
, struct list
*els
);
106 struct stmt
*stmt_return(struct expr
*rtrn
);
107 struct stmt
*stmt_expr(struct expr
*expr
);
108 struct stmt
*stmt_vardecl(struct vardecl vardecl
);
109 struct stmt
*stmt_while(struct expr
*pred
, struct list
*body
);
111 struct expr
*expr_binop(struct expr
*l
, enum binop op
, struct expr
*r
);
112 struct expr
*expr_bool(bool b
);
113 struct expr
*expr_char(const char *c
);
114 struct expr
*expr_funcall(char *ident
, struct list
*args
);
115 struct expr
*expr_int(int integer
);
116 struct expr
*expr_ident(char *ident
, struct list
*fields
);
117 struct expr
*expr_nil();
118 struct expr
*expr_tuple(struct expr
*left
, struct expr
*right
);
119 struct expr
*expr_unop(enum unop op
, struct expr
*l
);
121 void ast_print(struct ast
*, FILE *out
);
122 void decl_print(struct decl
*ast
, int indent
, FILE *out
);
123 void stmt_print(struct stmt
*ast
, int indent
, FILE *out
);
124 void expr_print(struct expr
*ast
, FILE *out
);
126 void ast_free(struct ast
*);
127 void decl_free(struct decl
*ast
);
128 void stmt_free(struct stmt
*ast
);
129 void expr_free(struct expr
*ast
);