From 0cabbd2a0853c332c82af621b8716643741d758a Mon Sep 17 00:00:00 2001 From: Carson Fleming Date: Tue, 21 Jul 2026 14:36:02 -0700 Subject: more faithful grammar --- ast.c | 64 +++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 21 deletions(-) (limited to 'ast.c') diff --git a/ast.c b/ast.c index 7c7432b..50470de 100644 --- a/ast.c +++ b/ast.c @@ -5,17 +5,16 @@ static void expr_destroy(struct expr_node* node); static void stmt_destroy(struct stmt_node* node); -static void lval_destroy(struct lval_node* node) { - switch (node->type) { - case LVAL_VAR_DECL: - break; - case LVAL_VAR_REF: - break; +static void var_decl_destroy(struct var_decl_node* node) { + if (node->initial_value != NULL) { + expr_destroy(node->initial_value); + free(node->initial_value); } } static void assign_destroy(struct assign_node* node) { - lval_destroy(&node->lval); + expr_destroy(node->lval); + free(node->lval); expr_destroy(node->rval); free(node->rval); } @@ -33,16 +32,21 @@ static void group_destroy(struct group_node* node) { free(node->scope); } -static void args_decl_destroy(struct args_decl_node* node) { - if (node != NULL) { - free(node->decl); - args_decl_destroy(node->next); +static void decl_list_destroy(struct decl_list_node* node) { + var_decl_destroy(node->decl); + free(node->decl); + + if (node->next != NULL) { + decl_list_destroy(node->next); + free(node->next); } } static void fn_decl_destroy(struct fn_decl_node* node) { - args_decl_destroy(node->args); - free(node->args); + if (node->args != NULL) { + decl_list_destroy(node->args); + free(node->args); + } group_destroy(&node->body); @@ -61,17 +65,21 @@ static void str_lit_destroy(struct str_lit_node* node) { free(node->val); } -static void args_list_destroy(struct args_eval_node* node) { - if (node != NULL) { - expr_destroy(node->expr); - free(node->expr); - args_list_destroy(node->next); +static void expr_list_destroy(struct expr_list_node* node) { + expr_destroy(node->expr); + free(node->expr); + + if (node->next != NULL) { + expr_list_destroy(node->next); + free(node->next); } } static void call_destroy(struct call_node* node) { - args_list_destroy(node->args); - free(node->args); + if (node->args != NULL) { + expr_list_destroy(node->args); + free(node->args); + } } static void unary_destroy(struct unary_node* node) { @@ -129,9 +137,22 @@ static void if_destroy(struct if_node* node) { free(node->scope); } +static void loop_init_destroy(struct loop_init_node* node) { + switch (node->type) { + case INIT_EXPR_LIST: + expr_list_destroy(node->expr_list); + free(node->expr_list); + break; + case INIT_DECL: + var_decl_destroy(node->decl); + free(node->decl); + break; + } +} + static void loop_destroy(struct loop_node* node) { if (node->init != NULL) { - expr_destroy(node->init); + loop_init_destroy(node->init); free(node->init); } if (node->cond != NULL) { @@ -158,6 +179,7 @@ static void stmt_destroy(struct stmt_node* node) { expr_destroy(&node->inner.expr); break; case STMT_VAR_DECL: + var_decl_destroy(&node->inner.var_decl); break; case STMT_RETURN: return_destroy(&node->inner.return_); -- cgit v1.2.3