diff options
Diffstat (limited to 'ast.c')
| -rw-r--r-- | ast.c | 69 |
1 files changed, 43 insertions, 26 deletions
@@ -5,11 +5,28 @@ static void expr_destroy(struct expr_node* node); static void stmt_destroy(struct stmt_node* node); -static void var_decl_destroy(struct var_decl_node* node) { +static void decl_destroy(struct decl_node* node) { if (node->initial_value != NULL) { expr_destroy(node->initial_value); free(node->initial_value); } + + if (node->next != NULL) { + decl_destroy(node->next); + free(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); + } + + if (node->resolved_type != NULL) free(node->resolved_type); } static void assign_destroy(struct assign_node* node) { @@ -33,18 +50,20 @@ static void group_destroy(struct group_node* node) { } static void decl_list_destroy(struct decl_list_node* node) { - var_decl_destroy(node->decl); - free(node->decl); + decl_destroy(node->head); + free(node->head); +} +static void fn_arg_destroy(struct arg_decl_node* node) { if (node->next != NULL) { - decl_list_destroy(node->next); + fn_arg_destroy(node->next); free(node->next); } } static void fn_decl_destroy(struct fn_decl_node* node) { if (node->args != NULL) { - decl_list_destroy(node->args); + fn_arg_destroy(node->args); free(node->args); } @@ -56,7 +75,7 @@ static void fn_decl_destroy(struct fn_decl_node* node) { static void return_destroy(struct return_node* node) { if (node->ret_val != NULL) { - expr_destroy(node->ret_val); + expr_list_destroy(node->ret_val); free(node->ret_val); } } @@ -65,16 +84,6 @@ static void str_lit_destroy(struct str_lit_node* node) { free(node->val); } -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) { if (node->args != NULL) { expr_list_destroy(node->args); @@ -95,6 +104,11 @@ static void binary_destroy(struct binary_node* node) { free(node->rhs); } +static void paren_destroy(struct paren_node* node) { + expr_list_destroy(node->expr_list); + free(node->expr_list); +} + static void expr_destroy(struct expr_node* node) { switch (node->type) { case EXPR_INT_LIT: @@ -118,13 +132,16 @@ static void expr_destroy(struct expr_node* node) { case EXPR_BINARY: binary_destroy(&node->inner.binary); break; + case EXPR_PAREN: + paren_destroy(&node->inner.paren); + break; } if (node->resolved_type != NULL) free(node->resolved_type); } static void if_destroy(struct if_node* node) { - expr_destroy(node->cond); + expr_list_destroy(node->cond); free(node->cond); stmt_destroy(node->true_branch); @@ -145,9 +162,9 @@ static void loop_init_destroy(struct loop_init_node* node) { expr_list_destroy(node->expr_list); free(node->expr_list); break; - case INIT_DECL: - var_decl_destroy(node->decl); - free(node->decl); + case INIT_DECL_LIST: + decl_list_destroy(node->decl_list); + free(node->decl_list); break; } } @@ -158,11 +175,11 @@ static void loop_destroy(struct loop_node* node) { free(node->init); } if (node->cond != NULL) { - expr_destroy(node->cond); + expr_list_destroy(node->cond); free(node->cond); } if (node->incr != NULL) { - expr_destroy(node->incr); + expr_list_destroy(node->incr); free(node->incr); } @@ -177,11 +194,11 @@ static void stmt_destroy(struct stmt_node* node) { switch (node->type) { case STMT_EMPTY: break; - case STMT_EXPR: - expr_destroy(&node->inner.expr); + case STMT_EXPR_LIST: + expr_list_destroy(&node->inner.expr_list); break; - case STMT_VAR_DECL: - var_decl_destroy(&node->inner.var_decl); + case STMT_DECL_LIST: + decl_list_destroy(&node->inner.decl_list); break; case STMT_RETURN: return_destroy(&node->inner.return_); |
