summaryrefslogtreecommitdiff
path: root/decls_cgen.c
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2019-10-09 20:49:41 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2019-10-09 20:49:41 -0400
commit076ea231f9d33d20066916ac8aa8506e91d3f9ea (patch)
treeaf48293918b15750e6cd01c893be443b721f557d /decls_cgen.c
parenta2f5cd5069df70436228c8f6cb6ed82edcdcaae8 (diff)
more cgen
Diffstat (limited to 'decls_cgen.c')
-rw-r--r--decls_cgen.c31
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;
}