db69333e81967d8c464a1c9a958d509c54b2bfa9
11 extern const char *fieldspec_str
[];
12 extern const char *binop_str
[];
13 extern const char *unop_str
[];
35 enum basictype
{btbool
, btchar
, btint
, btvoid
};
37 enum {tbasic
,tlist
,ttuple
,tvar
} type
;
39 enum basictype tbasic
;
50 //NOTE: DON'T CHANGE THIS ORDER
51 enum {dcomp
, dvardecl
, dfundecl
} type
;
55 struct fundecl
**decls
;
63 enum {sassign
, sif
, sreturn
, sexpr
, svardecl
, swhile
} type
;
78 struct vardecl
*svardecl
;
90 binor
, binand
, eq
, neq
, leq
, le
, geq
, ge
, cons
, plus
, minus
, times
,
91 divide
, modulo
, power
,
93 enum fieldspec
{fst
,snd
,hd
,tl
};
94 enum unop
{negate
,inverse
};
96 enum {ebinop
, ebool
, echar
, efuncall
, eident
, eint
, enil
, etuple
,
111 enum fieldspec
*fields
;
117 enum fieldspec
*fields
;
134 struct ast
*ast(struct list
*decls
);
136 struct vardecl
*vardecl(struct type
*type
, char *ident
, struct expr
*expr
);
137 struct fundecl
*fundecl(char *ident
, struct list
*args
, struct list
*atypes
,
138 struct type
*rtype
, struct list
*body
);
140 struct decl
*decl_fun(struct fundecl
*fundecl
);
141 struct decl
*decl_var(struct vardecl
*vardecl
);
143 struct stmt
*stmt_assign(char *ident
, struct list
*fields
, struct expr
*expr
);
144 struct stmt
*stmt_if(struct expr
*pred
, struct list
*then
, struct list
*els
);
145 struct stmt
*stmt_return(struct expr
*rtrn
);
146 struct stmt
*stmt_expr(struct expr
*expr
);
147 struct stmt
*stmt_vardecl(struct vardecl
*vardecl
);
148 struct stmt
*stmt_while(struct expr
*pred
, struct list
*body
);
150 struct expr
*expr_binop(struct expr
*l
, enum binop op
, struct expr
*r
);
151 struct expr
*expr_bool(bool b
);
152 struct expr
*expr_char(char *c
);
153 struct expr
*expr_funcall(char *ident
, struct list
*args
, struct list
*fields
);
154 struct expr
*expr_int(int integer
);
155 struct expr
*expr_ident(char *ident
, struct list
*fields
);
156 struct expr
*expr_nil();
157 struct expr
*expr_tuple(struct expr
*left
, struct expr
*right
);
158 struct expr
*expr_string(char *str
);
159 struct expr
*expr_unop(enum unop op
, struct expr
*l
);
161 struct type
*type_basic(enum basictype type
);
162 struct type
*type_list(struct type
*type
);
163 struct type
*type_tuple(struct type
*l
, struct type
*r
);
164 struct type
*type_var(char *ident
);
166 void ast_print(struct ast
*, FILE *out
);
167 void vardecl_print(struct vardecl
*decl
, int indent
, FILE *out
);
168 void fundecl_print(struct fundecl
*decl
, FILE *out
);
169 void decl_print(struct decl
*ast
, FILE *out
);
170 void stmt_print(struct stmt
*ast
, int indent
, FILE *out
);
171 void expr_print(struct expr
*ast
, FILE *out
);
172 void type_print(struct type
*type
, FILE *out
);
174 void ast_free(struct ast
*);
175 void vardecl_free(struct vardecl
*decl
);
176 void fundecl_free(struct fundecl
*fundecl
);
177 void decl_free(struct decl
*ast
);
178 void stmt_free(struct stmt
*ast
);
179 void expr_free(struct expr
*ast
);
180 void type_free(struct type
*type
);