diff options
| author | hachem <im@hachem.wtf> | 2026-09-04 20:00:52 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-04 20:00:52 +0200 |
| commit | 9283b46a08a1c58c321b6c7ebad1353725c3bc47 (patch) | |
| tree | 5fba917f42bdbaf86f27abc01577b3c1b232e409 /src/parser/ast.c | |
| parent | 56ba8b2a373dd1386950592bda9c68ff9f25c203 (diff) | |
feat: add if/else blocks
if now guards a { } block or bare statement with an optional else (and
now else-if chaining). The branch body becomes a statement list; a bare
guarded statement is a list of length one.
Diffstat (limited to 'src/parser/ast.c')
| -rw-r--r-- | src/parser/ast.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/parser/ast.c b/src/parser/ast.c index a387533..9c78d1f 100644 --- a/src/parser/ast.c +++ b/src/parser/ast.c @@ -26,7 +26,7 @@ void free_expr(struct Expr* expr) free(expr); } -static void free_statement(struct Statement* statement) +void free_statement(struct Statement* statement) { switch (statement->kind) { @@ -36,8 +36,12 @@ static void free_statement(struct Statement* statement) case STATEMENT_IF: free_expr(statement->branch.left); free_expr(statement->branch.right); - free_statement(statement->branch.body); + for (size_t i = 0; i < statement->branch.body_count; i += 1) + free_statement(&statement->branch.body[i]); free(statement->branch.body); + for (size_t i = 0; i < statement->branch.else_count; i += 1) + free_statement(&statement->branch.else_body[i]); + free(statement->branch.else_body); break; case STATEMENT_CALL: for (size_t i = 0; i < statement->call.arg_count; i += 1) |
