From 9e979a49b041a9d0e8ba6f8fee50bd11520169af Mon Sep 17 00:00:00 2001 From: hachem Date: Sun, 30 Aug 2026 13:24:29 +0200 Subject: add: parse expressions --- src/parser/ast.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'src/parser/ast.c') 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; -- cgit v1.3