summaryrefslogtreecommitdiff
path: root/ast.c
diff options
context:
space:
mode:
authorCarson Fleming <[email protected]>2026-03-28 09:42:44 -1000
committerCarson Fleming <[email protected]>2026-03-28 09:42:44 -1000
commit33d10c0a684eaacb59102e2e2c2494ef54113aa1 (patch)
tree230b1f1cfc4a6cde3285e2fac35c7f9a7a414e17 /ast.c
parent55929c155f929a886a0fe72c1c16a7913830350a (diff)
downloadccc-33d10c0a684eaacb59102e2e2c2494ef54113aa1.tar.gz
we got assignments bois
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;