aboutsummaryrefslogtreecommitdiff
path: root/compiler/syntax.c
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/syntax.c')
-rw-r--r--compiler/syntax.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/compiler/syntax.c b/compiler/syntax.c
index c19bf3b..cbb2fc7 100644
--- a/compiler/syntax.c
+++ b/compiler/syntax.c
@@ -10,10 +10,10 @@ void free_token(token* tk) {
}
void free_token_list(token_list* list) {
- if (list->rest) {
- free_token_list(list->rest);
- }
free_token(&list->elem);
+ if (list->rest)
+ free_token_list(list->rest);
+ free(list->rest);
}
unsigned empty_args_list(arg_list* list) {
@@ -135,19 +135,30 @@ void free_expression(expression* expr) {
case EXPR_APP:
free_expression(expr->var1);
free_expression(expr->var2);
+ free(expr->var1);
+ free(expr->var2);
break;
}
}
void free_arg_list(arg_list* list) {
+ free_expression(&list->elem);
if (list->rest)
free_arg_list(list->rest);
- free_expression(&list->elem);
+ free(list->rest);
}
void free_rewrite_rule(rewrite_rule* rule) {
free(rule->name);
if (rule->args)
free_arg_list(rule->args);
+ free(rule->args);
free_expression(&rule->rhs);
}
+
+void free_fuspel(fuspel* rules) {
+ free_rewrite_rule(&rules->rule);
+ if (rules->rest)
+ free_fuspel(rules->rest);
+ free(rules->rest);
+}