10 const char *binop_str
[] = {
11 [binor
] = "||", [binand
] = "&&", [eq
] = "==", [neq
] = "!=",
12 [leq
] = "<=", [le
] = "<", [geq
] = ">=", [ge
] = ">", [cons
] = ":",
13 [plus
] = "+", [minus
] = "-", [times
] = "*", [divide
] = "/",
14 [modulo
] = "%", [power
] = "^",
16 const char *fieldspec_str
[] = {
17 [fst
] = "fst", [snd
] = "snd", [hd
] = "hd", [tl
] = "tl"};
18 const char *unop_str
[] = { [inverse
] = "!", [negate
] = "-", };
19 static const char *basictype_str
[] = {
20 [btbool
] = "Bool", [btchar
] = "Char", [btint
] = "Int",
24 struct ast
*ast(struct list
*decls
)
26 struct ast
*res
= safe_malloc(sizeof(struct ast
));
27 res
->decls
= (struct decl
**)list_to_array(decls
, &res
->ndecls
, true);
31 struct vardecl
*vardecl(struct type
*type
, char *ident
, struct expr
*expr
)
33 struct vardecl
*res
= safe_malloc(sizeof(struct vardecl
));
40 struct decl
*decl_fun(char *ident
, struct list
*args
, struct list
*atypes
,
41 struct type
*rtype
, struct list
*body
)
43 struct decl
*res
= safe_malloc(sizeof(struct decl
));
45 res
->data
.dfun
.ident
= ident
;
46 res
->data
.dfun
.args
= (char **)
47 list_to_array(args
, &res
->data
.dfun
.nargs
, true);
48 res
->data
.dfun
.atypes
= (struct type
**)
49 list_to_array(atypes
, &res
->data
.dfun
.natypes
, true);
50 res
->data
.dfun
.rtype
= rtype
;
51 res
->data
.dfun
.body
= (struct stmt
**)
52 list_to_array(body
, &res
->data
.dfun
.nbody
, true);
56 struct decl
*decl_var(struct vardecl
*vardecl
)
58 struct decl
*res
= safe_malloc(sizeof(struct decl
));
60 res
->data
.dvar
= vardecl
;
64 struct stmt
*stmt_assign(char *ident
, struct list
*fields
, struct expr
*expr
)
66 struct stmt
*res
= safe_malloc(sizeof(struct stmt
));
68 res
->data
.sassign
.ident
= ident
;
69 res
->data
.sassign
.fields
= (char **)
70 list_to_array(fields
, &res
->data
.sassign
.nfields
, true);
71 res
->data
.sassign
.expr
= expr
;
75 struct stmt
*stmt_if(struct expr
*pred
, struct list
*then
, struct list
*els
)
77 struct stmt
*res
= safe_malloc(sizeof(struct stmt
));
79 res
->data
.sif
.pred
= pred
;
80 res
->data
.sif
.then
= (struct stmt
**)
81 list_to_array(then
, &res
->data
.sif
.nthen
, true);
82 res
->data
.sif
.els
= (struct stmt
**)
83 list_to_array(els
, &res
->data
.sif
.nels
, true);
87 struct stmt
*stmt_return(struct expr
*rtrn
)
89 struct stmt
*res
= safe_malloc(sizeof(struct stmt
));
91 res
->data
.sreturn
= rtrn
;
95 struct stmt
*stmt_expr(struct expr
*expr
)
97 struct stmt
*res
= safe_malloc(sizeof(struct stmt
));
99 res
->data
.sexpr
= expr
;
103 struct stmt
*stmt_vardecl(struct vardecl
*vardecl
)
105 struct stmt
*res
= safe_malloc(sizeof(struct stmt
));
106 res
->type
= svardecl
;
107 res
->data
.svardecl
= vardecl
;
111 struct stmt
*stmt_while(struct expr
*pred
, struct list
*body
)
113 struct stmt
*res
= safe_malloc(sizeof(struct stmt
));
115 res
->data
.swhile
.pred
= pred
;
116 res
->data
.swhile
.body
= (struct stmt
**)
117 list_to_array(body
, &res
->data
.swhile
.nbody
, true);
121 struct expr
*expr_binop(struct expr
*l
, enum binop op
, struct expr
*r
)
123 struct expr
*res
= safe_malloc(sizeof(struct expr
));
125 res
->data
.ebinop
.l
= l
;
126 res
->data
.ebinop
.op
= op
;
127 res
->data
.ebinop
.r
= r
;
131 struct expr
*expr_bool(bool b
)
133 struct expr
*res
= safe_malloc(sizeof(struct expr
));
139 struct expr
*expr_char(char *c
)
141 struct expr
*res
= safe_malloc(sizeof(struct expr
));
143 res
->data
.echar
= unescape_char(c
)[0];
147 static void set_fields(enum fieldspec
**farray
, int *n
, struct list
*fields
)
149 void **els
= list_to_array(fields
, n
, true);
150 *farray
= (enum fieldspec
*)safe_malloc(*n
*sizeof(enum fieldspec
));
151 for (int i
= 0; i
<*n
; i
++) {
153 if (strcmp(t
, "fst") == 0)
155 else if (strcmp(t
, "snd") == 0)
157 else if (strcmp(t
, "hd") == 0)
159 else if (strcmp(t
, "tl") == 0)
167 struct expr
*expr_funcall(char *ident
, struct list
*args
, struct list
*fields
)
169 struct expr
*res
= safe_malloc(sizeof(struct expr
));
170 res
->type
= efuncall
;
171 res
->data
.efuncall
.ident
= ident
;
172 res
->data
.efuncall
.args
= (struct expr
**)
173 list_to_array(args
, &res
->data
.efuncall
.nargs
, true);
174 set_fields(&res
->data
.efuncall
.fields
,
175 &res
->data
.efuncall
.nfields
, fields
);
179 struct expr
*expr_int(int integer
)
181 struct expr
*res
= safe_malloc(sizeof(struct expr
));
183 res
->data
.eint
= integer
;
187 struct expr
*expr_ident(char *ident
, struct list
*fields
)
189 struct expr
*res
= safe_malloc(sizeof(struct expr
));
191 res
->data
.eident
.ident
= ident
;
192 set_fields(&res
->data
.eident
.fields
, &res
->data
.eident
.nfields
, fields
);
196 struct expr
*expr_nil()
198 struct expr
*res
= safe_malloc(sizeof(struct expr
));
203 struct expr
*expr_tuple(struct expr
*left
, struct expr
*right
)
205 struct expr
*res
= safe_malloc(sizeof(struct expr
));
207 res
->data
.etuple
.left
= left
;
208 res
->data
.etuple
.right
= right
;
212 struct expr
*expr_string(char *str
)
214 struct expr
*res
= safe_malloc(sizeof(struct expr
));
216 res
->data
.estring
.nchars
= 0;
217 res
->data
.estring
.chars
= safe_malloc(strlen(str
)+1);
218 char *p
= res
->data
.estring
.chars
;
219 while(*str
!= '\0') {
220 str
= unescape_char(str
);
222 res
->data
.estring
.nchars
++;
228 struct expr
*expr_unop(enum unop op
, struct expr
*l
)
230 struct expr
*res
= safe_malloc(sizeof(struct expr
));
232 res
->data
.eunop
.op
= op
;
233 res
->data
.eunop
.l
= l
;
237 struct type
*type_basic(enum basictype type
)
239 struct type
*res
= safe_malloc(sizeof(struct type
));
241 res
->data
.tbasic
= type
;
245 struct type
*type_list(struct type
*type
)
247 struct type
*res
= safe_malloc(sizeof(struct type
));
249 res
->data
.tlist
= type
;
253 struct type
*type_tuple(struct type
*l
, struct type
*r
)
255 struct type
*res
= safe_malloc(sizeof(struct type
));
257 res
->data
.ttuple
.l
= l
;
258 res
->data
.ttuple
.r
= r
;
262 struct type
*type_var(char *ident
)
264 struct type
*res
= safe_malloc(sizeof(struct type
));
265 if (strcmp(ident
, "Int") == 0) {
267 res
->data
.tbasic
= btint
;
269 } else if (strcmp(ident
, "Char") == 0) {
271 res
->data
.tbasic
= btchar
;
273 } else if (strcmp(ident
, "Bool") == 0) {
275 res
->data
.tbasic
= btbool
;
277 } else if (strcmp(ident
, "Void") == 0) {
279 res
->data
.tbasic
= btvoid
;
283 res
->data
.tvar
= ident
;
288 void ast_print(struct ast
*ast
, FILE *out
)
292 for (int i
= 0; i
<ast
->ndecls
; i
++)
293 decl_print(ast
->decls
[i
], out
);
296 void vardecl_print(struct vardecl
*decl
, int indent
, FILE *out
)
298 pindent(indent
, out
);
299 if (decl
->type
== NULL
)
300 safe_fprintf(out
, "var");
302 type_print(decl
->type
, out
);
303 safe_fprintf(out
, " %s = ", decl
->ident
);
304 expr_print(decl
->expr
, out
);
305 safe_fprintf(out
, ";\n");
308 void decl_print(struct decl
*decl
, FILE *out
)
314 safe_fprintf(out
, "%s (", decl
->data
.dfun
.ident
);
315 for (int i
= 0; i
<decl
->data
.dfun
.nargs
; i
++) {
316 safe_fprintf(out
, "%s", decl
->data
.dfun
.args
[i
]);
317 if (i
< decl
->data
.dfun
.nargs
- 1)
318 safe_fprintf(out
, ", ");
320 safe_fprintf(out
, ")");
321 if (decl
->data
.dfun
.rtype
!= NULL
) {
322 safe_fprintf(out
, " :: ");
323 for (int i
= 0; i
<decl
->data
.dfun
.natypes
; i
++) {
324 type_print(decl
->data
.dfun
.atypes
[i
], out
);
325 safe_fprintf(out
, " ");
327 safe_fprintf(out
, "-> ");
328 type_print(decl
->data
.dfun
.rtype
, out
);
330 safe_fprintf(out
, " {\n");
331 for (int i
= 0; i
<decl
->data
.dfun
.nbody
; i
++)
332 stmt_print(decl
->data
.dfun
.body
[i
], 1, out
);
333 safe_fprintf(out
, "}\n");
336 vardecl_print(decl
->data
.dvar
, 0, out
);
339 for (int i
= 0; i
<decl
->data
.dcomponent
.ndecls
; i
++)
340 decl_print(decl
, out
);
343 die("Unsupported decl node\n");
347 void stmt_print(struct stmt
*stmt
, int indent
, FILE *out
)
353 pindent(indent
, out
);
354 fprintf(out
, "%s", stmt
->data
.sassign
.ident
);
355 for (int i
= 0; i
<stmt
->data
.sassign
.nfields
; i
++)
356 fprintf(out
, ".%s", stmt
->data
.sassign
.fields
[i
]);
357 safe_fprintf(out
, " = ");
358 expr_print(stmt
->data
.sassign
.expr
, out
);
359 safe_fprintf(out
, ";\n");
362 pindent(indent
, out
);
363 safe_fprintf(out
, "if (");
364 expr_print(stmt
->data
.sif
.pred
, out
);
365 safe_fprintf(out
, ") {\n");
366 for (int i
= 0; i
<stmt
->data
.sif
.nthen
; i
++)
367 stmt_print(stmt
->data
.sif
.then
[i
], indent
+1, out
);
368 pindent(indent
, out
);
369 safe_fprintf(out
, "} else {\n");
370 for (int i
= 0; i
<stmt
->data
.sif
.nels
; i
++)
371 stmt_print(stmt
->data
.sif
.els
[i
], indent
+1, out
);
372 pindent(indent
, out
);
373 safe_fprintf(out
, "}\n");
376 pindent(indent
, out
);
377 safe_fprintf(out
, "return ");
378 expr_print(stmt
->data
.sreturn
, out
);
379 safe_fprintf(out
, ";\n");
382 pindent(indent
, out
);
383 expr_print(stmt
->data
.sexpr
, out
);
384 safe_fprintf(out
, ";\n");
387 vardecl_print(stmt
->data
.svardecl
, indent
, out
);
390 pindent(indent
, out
);
391 safe_fprintf(out
, "while (");
392 expr_print(stmt
->data
.swhile
.pred
, out
);
393 safe_fprintf(out
, ") {\n");
394 for (int i
= 0; i
<stmt
->data
.swhile
.nbody
; i
++)
395 stmt_print(stmt
->data
.swhile
.body
[i
], indent
+1, out
);
396 pindent(indent
, out
);
397 safe_fprintf(out
, "}\n");
400 die("Unsupported stmt node\n");
404 void expr_print(struct expr
*expr
, FILE *out
)
408 char buf
[] = "\\xff";
411 safe_fprintf(out
, "(");
412 expr_print(expr
->data
.ebinop
.l
, out
);
413 safe_fprintf(out
, "%s", binop_str
[expr
->data
.ebinop
.op
]);
414 expr_print(expr
->data
.ebinop
.r
, out
);
415 safe_fprintf(out
, ")");
418 safe_fprintf(out
, "%s", expr
->data
.ebool
? "true" : "false");
421 safe_fprintf(out
, "'%s'",
422 escape_char(expr
->data
.echar
, buf
, false));
425 safe_fprintf(out
, "%s(", expr
->data
.efuncall
.ident
);
426 for(int i
= 0; i
<expr
->data
.efuncall
.nargs
; i
++) {
427 expr_print(expr
->data
.efuncall
.args
[i
], out
);
428 if (i
+1 < expr
->data
.efuncall
.nargs
)
429 safe_fprintf(out
, ", ");
431 safe_fprintf(out
, ")");
432 for (int i
= 0; i
<expr
->data
.efuncall
.nfields
; i
++)
434 fieldspec_str
[expr
->data
.efuncall
.fields
[i
]]);
437 safe_fprintf(out
, "%d", expr
->data
.eint
);
440 fprintf(out
, "%s", expr
->data
.eident
.ident
);
441 for (int i
= 0; i
<expr
->data
.eident
.nfields
; i
++)
443 fieldspec_str
[expr
->data
.eident
.fields
[i
]]);
446 safe_fprintf(out
, "[]");
449 safe_fprintf(out
, "(");
450 expr_print(expr
->data
.etuple
.left
, out
);
451 safe_fprintf(out
, ", ");
452 expr_print(expr
->data
.etuple
.right
, out
);
453 safe_fprintf(out
, ")");
456 safe_fprintf(out
, "\"");
457 for (int i
= 0; i
<expr
->data
.estring
.nchars
; i
++)
458 safe_fprintf(out
, "%s", escape_char(
459 expr
->data
.estring
.chars
[i
], buf
, true));
460 safe_fprintf(out
, "\"");
463 safe_fprintf(out
, "(%s", unop_str
[expr
->data
.eunop
.op
]);
464 expr_print(expr
->data
.eunop
.l
, out
);
465 safe_fprintf(out
, ")");
468 die("Unsupported expr node\n");
472 void type_print(struct type
*type
, FILE *out
)
476 switch (type
->type
) {
478 safe_fprintf(out
, "%s", basictype_str
[type
->data
.tbasic
]);
481 safe_fprintf(out
, "[");
482 type_print(type
->data
.tlist
, out
);
483 safe_fprintf(out
, "]");
486 safe_fprintf(out
, "(");
487 type_print(type
->data
.ttuple
.l
, out
);
488 safe_fprintf(out
, ",");
489 type_print(type
->data
.ttuple
.r
, out
);
490 safe_fprintf(out
, ")");
493 safe_fprintf(out
, "%s", type
->data
.tvar
);
496 die("Unsupported type node\n");
500 void ast_free(struct ast
*ast
)
504 for (int i
= 0; i
<ast
->ndecls
; i
++)
505 decl_free(ast
->decls
[i
]);
510 void vardecl_free(struct vardecl
*decl
)
512 type_free(decl
->type
);
514 expr_free(decl
->expr
);
518 void decl_free(struct decl
*decl
)
524 for (int i
= 0; i
<decl
->data
.dcomponent
.ndecls
; i
++)
525 decl_free(decl
->data
.dcomponent
.decls
[i
]);
526 free(decl
->data
.dcomponent
.decls
);
529 free(decl
->data
.dfun
.ident
);
530 for (int i
= 0; i
<decl
->data
.dfun
.nargs
; i
++)
531 free(decl
->data
.dfun
.args
[i
]);
532 free(decl
->data
.dfun
.args
);
533 for (int i
= 0; i
<decl
->data
.dfun
.natypes
; i
++)
534 type_free(decl
->data
.dfun
.atypes
[i
]);
535 free(decl
->data
.dfun
.atypes
);
536 type_free(decl
->data
.dfun
.rtype
);
537 for (int i
= 0; i
<decl
->data
.dfun
.nbody
; i
++)
538 stmt_free(decl
->data
.dfun
.body
[i
]);
539 free(decl
->data
.dfun
.body
);
542 vardecl_free(decl
->data
.dvar
);
545 die("Unsupported decl node\n");
550 void stmt_free(struct stmt
*stmt
)
556 free(stmt
->data
.sassign
.ident
);
557 for (int i
= 0; i
<stmt
->data
.sassign
.nfields
; i
++)
558 free(stmt
->data
.sassign
.fields
[i
]);
559 free(stmt
->data
.sassign
.fields
);
560 expr_free(stmt
->data
.sassign
.expr
);
563 expr_free(stmt
->data
.sif
.pred
);
564 for (int i
= 0; i
<stmt
->data
.sif
.nthen
; i
++)
565 stmt_free(stmt
->data
.sif
.then
[i
]);
566 free(stmt
->data
.sif
.then
);
567 for (int i
= 0; i
<stmt
->data
.sif
.nels
; i
++)
568 stmt_free(stmt
->data
.sif
.els
[i
]);
569 free(stmt
->data
.sif
.els
);
572 expr_free(stmt
->data
.sreturn
);
575 expr_free(stmt
->data
.sexpr
);
578 expr_free(stmt
->data
.swhile
.pred
);
579 for (int i
= 0; i
<stmt
->data
.swhile
.nbody
; i
++)
580 stmt_free(stmt
->data
.swhile
.body
[i
]);
581 free(stmt
->data
.swhile
.body
);
584 vardecl_free(stmt
->data
.svardecl
);
587 die("Unsupported stmt node\n");
592 void expr_free(struct expr
*expr
)
598 expr_free(expr
->data
.ebinop
.l
);
599 expr_free(expr
->data
.ebinop
.r
);
606 free(expr
->data
.efuncall
.ident
);
607 for (int i
= 0; i
<expr
->data
.efuncall
.nargs
; i
++)
608 expr_free(expr
->data
.efuncall
.args
[i
]);
609 free(expr
->data
.efuncall
.fields
);
610 free(expr
->data
.efuncall
.args
);
615 free(expr
->data
.eident
.ident
);
616 free(expr
->data
.eident
.fields
);
621 expr_free(expr
->data
.etuple
.left
);
622 expr_free(expr
->data
.etuple
.right
);
625 free(expr
->data
.estring
.chars
);
628 expr_free(expr
->data
.eunop
.l
);
631 die("Unsupported expr node\n");
636 void type_free(struct type
*type
)
640 switch (type
->type
) {
644 type_free(type
->data
.tlist
);
647 type_free(type
->data
.ttuple
.l
);
648 type_free(type
->data
.ttuple
.r
);
651 free(type
->data
.tvar
);
654 die("Unsupported type node\n");