#include "ast.h"
-#define gdie(msg) { fprintf(stderr, "%s", msg); return 1; }
-
-int expr_genc(struct expr *expr, FILE *cout);
+void expr_genc(struct expr *expr, FILE *cout);
void binop_genc(char *fun, struct expr *l, struct expr *r, FILE *cout)
{
safe_fprintf(cout, ")");
}
-int expr_genc(struct expr *expr, FILE *cout)
+void expr_genc(struct expr *expr, FILE *cout)
{
- int r = 0;
char buf[] = "\\x55";
if (expr == NULL)
- return 0;
+ return;
switch(expr->type) {
case ebinop:
if (expr->type == ebinop && expr->data.ebinop.op == cons) {
default:
die("Unknown expression node\n");
}
- return r;
}
-int type_genc(struct type *type, FILE *cout)
+void type_genc(struct type *type, FILE *cout)
{
- if (type == NULL) {
+ if (type == NULL)
+ die("unresolved var type\n");
+ switch(type->type) {
+ case tbasic:
fprintf(cout, "WORD ");
- } else {
- switch(type->type) {
- case tbasic:
- fprintf(cout, "WORD ");
- break;
- case tlist:
- fprintf(cout, "struct splc_list *");
- break;
- case ttuple:
- fprintf(cout, "struct splc_tuple *");
- break;
- case tvar:
- fprintf(cout, "WORD ");
- break;
- default:
- die("Unsupported type node\n");
- }
+ break;
+ case tlist:
+ fprintf(cout, "struct splc_list *");
+ break;
+ case ttuple:
+ fprintf(cout, "struct splc_tuple *");
+ break;
+ case tvar:
+ fprintf(cout, "WORD ");
+ break;
+ default:
+ die("Unsupported type node\n");
}
- return 0;
}
-int vardecl_genc(struct vardecl *vardecl, int indent, FILE *cout)
+void vardecl_genc(struct vardecl *vardecl, int indent, FILE *cout)
{
- int r = 0;
if (vardecl == NULL)
- return 0;
+ return;
pindent(indent, cout);
type_genc(vardecl->type, cout);
fprintf(cout, "%s = ", vardecl->ident);
- r = expr_genc(vardecl->expr, cout);
+ expr_genc(vardecl->expr, cout);
fprintf(cout, ";\n");
- return r;
}
void stmt_genc(struct stmt *stmt, int indent, FILE *cout)
}
}
-int decl_genc(struct decl *decl, FILE *cout)
+void decl_genc(struct decl *decl, FILE *cout)
{
switch (decl->type) {
+ case dcomponent:
+ //TODO generate prototypes?
+ for (int i = 0; i<decl->data.dcomponent.ndecls; i++)
+ decl_genc(decl->data.dcomponent.decls[i], cout);
+ break;
case dfundecl:
type_genc(decl->data.dfun.rtype, cout);
safe_fprintf(cout, "%s (", decl->data.dfun.ident);
for (int i = 0; i<decl->data.dfun.nargs; i++) {
if (i < decl->data.dfun.natypes)
- type_genc(decl->data.dfun.atypes[i], cout);
+ die("function with unmatched type\n");
safe_fprintf(cout, "%s", decl->data.dfun.args[i]);
if (i < decl->data.dfun.nargs - 1)
safe_fprintf(cout, ", ");
safe_fprintf(cout, "}\n");
break;
case dvardecl:
- return vardecl_genc(decl->data.dvar, 0, cout);
+ vardecl_genc(decl->data.dvar, 0, cout);
+ break;
}
- return 0;
}
-int genc(struct ast *ast, FILE *cout)
+void genc(struct ast *ast, FILE *cout)
{
fprintf(cout,
"#include <stdint.h>\n"
"\treturn res;\n"
"}\n"
);
- int r = 0;
- for (int i = 0; i<ast->ndecls && r == 0; i++) {
+ for (int i = 0; i<ast->ndecls; i++) {
fprintf(cout, "\n");
- r = decl_genc(ast->decls[i], cout);
+ decl_genc(ast->decls[i], cout);
}
- return r;
}