aboutsummaryrefslogtreecommitdiff
path: root/src/parser/ast.c
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-30 13:24:29 +0200
committerhachem <im@hachem.wtf>2026-08-30 13:24:29 +0200
commit9e979a49b041a9d0e8ba6f8fee50bd11520169af (patch)
treef0e5cc0047cfc9c6b11a83175a4e07b7b0917ea7 /src/parser/ast.c
parent53946c982cb3290a25f7c8529ef1399f0635ef37 (diff)
add: parse expressions
Diffstat (limited to 'src/parser/ast.c')
-rw-r--r--src/parser/ast.c41
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;