diff options
| author | hachem <im@hachem.wtf> | 2026-08-30 13:24:29 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-08-30 13:24:29 +0200 |
| commit | 9e979a49b041a9d0e8ba6f8fee50bd11520169af (patch) | |
| tree | f0e5cc0047cfc9c6b11a83175a4e07b7b0917ea7 /src/parser/ast.c | |
| parent | 53946c982cb3290a25f7c8529ef1399f0635ef37 (diff) | |
add: parse expressions
Diffstat (limited to 'src/parser/ast.c')
| -rw-r--r-- | src/parser/ast.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/src/parser/ast.c b/src/parser/ast.c index 4f10915..97cdb6d 100644 --- a/src/parser/ast.c +++ b/src/parser/ast.c @@ -2,6 +2,42 @@ #include "parser/ast.h" +void free_expr(struct Expr* expr) +{ + if (expr == NULL) + return; + + switch (expr->kind) + { + case EXPR_PRIMARY: + break; + case EXPR_BINARY: + free_expr(expr->binary.left); + free_expr(expr->binary.right); + break; + case EXPR_MEMBER: + free_expr(expr->member.object); + break; + } + + free(expr); +} + +static void free_statement(struct Statement* statement) +{ + if (statement->kind == STATEMENT_ASSIGN) + free_expr(statement->assign.value); +} + +void free_proc(struct ProcDecl* proc) +{ + free(proc->params); + + for (size_t i = 0; i < proc->body_count; i += 1) + free_statement(&proc->body[i]); + free(proc->body); +} + struct Program create_program(void) { struct Program program; @@ -23,10 +59,7 @@ void free_program(struct Program* program) free(program->data_decls); for (size_t i = 0; i < program->proc_count; i += 1) - { - free(program->procs[i].params); - free(program->procs[i].body); - } + free_proc(&program->procs[i]); free(program->procs); program->consts = NULL; |
