summaryrefslogtreecommitdiff
path: root/ast.c
diff options
context:
space:
mode:
authorCarson Fleming <cflems@cflems.net>2026-07-29 23:35:15 -0400
committerCarson Fleming <cflems@cflems.net>2026-07-29 23:35:15 -0400
commit29510d33cab6e86b28b12c6246bca58acdab26e2 (patch)
tree8513245e730aa68fb119e88932ab658fea1dc169 /ast.c
parent4f9d0247549b06ddb25b76bb425541190105cb48 (diff)
downloadccc-29510d33cab6e86b28b12c6246bca58acdab26e2.tar.gz
support for comma-separated expression lists where valid
Diffstat (limited to 'ast.c')
-rw-r--r--ast.c69
1 files changed, 43 insertions, 26 deletions
diff --git a/ast.c b/ast.c
index df3b7f6..f224e72 100644
--- a/ast.c
+++ b/ast.c
@@ -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_);