summaryrefslogtreecommitdiff
path: root/ast.c
diff options
context:
space:
mode:
authorCarson Fleming <cflems@cflems.net>2026-07-21 14:36:02 -0700
committerCarson Fleming <cflems@cflems.net>2026-07-21 14:36:02 -0700
commit0cabbd2a0853c332c82af621b8716643741d758a (patch)
tree4d1772e07ff1b81e00b563f877c6f1ead3305a8d /ast.c
parentf87e953223b7d498fc5401247952c08ab1e08f93 (diff)
downloadccc-0cabbd2a0853c332c82af621b8716643741d758a.tar.gz
more faithful grammar
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_);