summaryrefslogtreecommitdiff
path: root/ast.c
diff options
context:
space:
mode:
Diffstat (limited to 'ast.c')
-rw-r--r--ast.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/ast.c b/ast.c
index 1334073..05f2755 100644
--- a/ast.c
+++ b/ast.c
@@ -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;