diff options
Diffstat (limited to 'ast.c')
| -rw-r--r-- | ast.c | 23 |
1 files changed, 22 insertions, 1 deletions
@@ -18,6 +18,23 @@ static void var_ref_destroy(struct var_ref_node* node) { free(node->ident); } +static void lval_destroy(struct lval_node* node) { + switch (node->type) { + case LVAL_VAR_DECL: + var_decl_destroy(&node->as._var_decl); + break; + case LVAL_VAR_REF: + var_ref_destroy(&node->as._var_ref); + break; + } +} + +static void assign_destroy(struct assign_node* node) { + lval_destroy(&node->lval); + expr_destroy(node->rval); + free(node->rval); +} + static void group_destroy(struct group_node* node) { struct stmt_node* body_node = node->body_head; while (body_node != NULL) { @@ -53,17 +70,21 @@ static void return_destroy(struct return_node* node) { static void expr_destroy(struct expr_node* node) { switch (node->type) { - case EXPR_EMPTY: case EXPR_INT_LIT: break; case EXPR_VAR_REF: var_ref_destroy(&node->as._var_ref); break; + case EXPR_ASSIGN: + assign_destroy(&node->as._assign); + break; } } static void stmt_destroy(struct stmt_node* node) { switch (node->type) { + case STMT_EMPTY: + break; case STMT_EXPR: expr_destroy(&node->as._expr); break; |
