diff options
| author | Carson Fleming <cflems@cflems.net> | 2026-07-21 14:36:02 -0700 |
|---|---|---|
| committer | Carson Fleming <cflems@cflems.net> | 2026-07-21 14:36:02 -0700 |
| commit | 0cabbd2a0853c332c82af621b8716643741d758a (patch) | |
| tree | 4d1772e07ff1b81e00b563f877c6f1ead3305a8d /ast.c | |
| parent | f87e953223b7d498fc5401247952c08ab1e08f93 (diff) | |
| download | ccc-0cabbd2a0853c332c82af621b8716643741d758a.tar.gz | |
more faithful grammar
Diffstat (limited to 'ast.c')
| -rw-r--r-- | ast.c | 64 |
1 files changed, 43 insertions, 21 deletions
@@ -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_); |
