summaryrefslogtreecommitdiff
path: root/ast.c
diff options
context:
space:
mode:
Diffstat (limited to 'ast.c')
-rw-r--r--ast.c64
1 files changed, 43 insertions, 21 deletions
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_);