diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2019-10-09 20:49:41 -0400 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2019-10-09 20:49:41 -0400 |
commit | 076ea231f9d33d20066916ac8aa8506e91d3f9ea (patch) | |
tree | af48293918b15750e6cd01c893be443b721f557d /decls_cgen.c | |
parent | a2f5cd5069df70436228c8f6cb6ed82edcdcaae8 (diff) |
more cgen
Diffstat (limited to 'decls_cgen.c')
-rw-r--r-- | decls_cgen.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/decls_cgen.c b/decls_cgen.c index bce26c7..881240c 100644 --- a/decls_cgen.c +++ b/decls_cgen.c @@ -1,17 +1,42 @@ -static void cgen_decls_stmt(CGenerator *g, Statement *s) { +static bool cgen_decls_expr(CGenerator *g, Expression *e) { +} + +static bool cgen_decls_block(CGenerator *g, Block *b) { +} + +static bool cgen_decls_decl(CGenerator *g, Declaration *d) { + if ((d->flags & DECL_FLAG_HAS_EXPR) && d->expr.kind == EXPR_FN && arr_len(d->idents) == 1) { + d->expr.fn.name = d->idents[0]; + if (!cgen_fn_header(g, &d->expr.fn)) + return false; + cgen_write(g, ";"); + if (!cgen_decls_block(g, &d->expr.fn.body)) + return false; + } else if (d->flags & DECL_FLAG_HAS_EXPR) { + if (!cgen_decls_expr(g, &d->expr)) + return false; + } +} + +static bool cgen_decls_stmt(CGenerator *g, Statement *s) { switch (s->kind) { case STMT_DECL: + if (!cgen_decls_decl(g, &s->decl)) + return false; break; case STMT_EXPR: break; case STMT_RET: break; } + return true; } -static void cgen_decls_file(CGenerator *g, ParsedFile *f) { +static bool cgen_decls_file(CGenerator *g, ParsedFile *f) { cgen_write(g, "/* declarations */\n"); arr_foreach(f->stmts, Statement, s) { - cgen_decls_stmt(g, s); + if (!cgen_decls_stmt(g, s)) + return false; } + return true; } |