diff options
Diffstat (limited to 'compiler/syntax.c')
-rw-r--r-- | compiler/syntax.c | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/compiler/syntax.c b/compiler/syntax.c index cbb2fc7..b4ff9dc 100644 --- a/compiler/syntax.c +++ b/compiler/syntax.c @@ -3,17 +3,18 @@ #include <stdlib.h> #include <string.h> +#include "mem.h" + void free_token(token* tk) { - if (tk->var) { - free(tk->var); - } + if (tk->var) + my_free(tk->var); } void free_token_list(token_list* list) { free_token(&list->elem); if (list->rest) free_token_list(list->rest); - free(list->rest); + my_free(list->rest); } unsigned empty_args_list(arg_list* list) { @@ -24,15 +25,11 @@ void cpy_expression(expression* dst, expression* src) { dst->kind = src->kind; switch (dst->kind) { case EXPR_INT: - dst->var1 = malloc(sizeof(int)); - if (!dst->var1) - error_no_mem(); + dst->var1 = my_calloc(1, sizeof(int)); *((int*) dst->var1) = *((int*) src->var1); break; case EXPR_NAME: - dst->var1 = malloc(strlen((char*) src->var1) + 1); - if (!dst->var1) - error_no_mem(); + dst->var1 = my_calloc(1, strlen((char*) src->var1) + 1); strcpy(dst->var1, src->var1); break; case EXPR_LIST: @@ -40,10 +37,8 @@ void cpy_expression(expression* dst, expression* src) { break; case EXPR_TUPLE: case EXPR_APP: - dst->var1 = malloc(sizeof(expression)); - dst->var2 = malloc(sizeof(expression)); - if (!dst->var1 || !dst->var2) - error_no_mem(); + dst->var1 = my_calloc(1, sizeof(expression)); + dst->var2 = my_calloc(1, sizeof(expression)); cpy_expression(dst->var1, src->var1); cpy_expression(dst->var2, src->var2); break; @@ -60,8 +55,8 @@ unsigned eq_expression(expression* a, expression* b) { case EXPR_TUPLE: case EXPR_LIST: case EXPR_APP: - if (!a->var1 && b->var1 || a->var1 && !b->var1 || - !a->var2 && b->var2 || a->var2 && b->var2) + if ((!a->var1 && b->var1) || (a->var1 && !b->var1) || + (!a->var2 && b->var2) || (a->var2 && b->var2)) return 0; if (a->var1 && !eq_expression(a->var1, b->var1)) return 0; @@ -69,6 +64,8 @@ unsigned eq_expression(expression* a, expression* b) { return 0; return 1; } + + return 0; } expression** flatten_app_args(expression* from) { @@ -80,7 +77,7 @@ expression** flatten_app_args(expression* from) { } len++; - expression** result = calloc(1, sizeof(expression*) * (len + 1)); + expression** result = my_calloc(1, sizeof(expression*) * (len + 1)); unsigned int i = 1; while (from->kind == EXPR_APP) { result[len - i] = from->var2; @@ -103,7 +100,7 @@ void concat_fuspel(fuspel* start, fuspel* end) { } fuspel* push_fuspel(fuspel* rules) { - fuspel* new_rules = calloc(1, sizeof(fuspel)); + fuspel* new_rules = my_calloc(1, sizeof(fuspel)); new_rules->rest = rules; return new_rules; } @@ -128,15 +125,15 @@ void free_expression(expression* expr) { switch (expr->kind) { case EXPR_INT: case EXPR_NAME: - free(expr->var1); + my_free(expr->var1); break; case EXPR_LIST: case EXPR_TUPLE: case EXPR_APP: free_expression(expr->var1); free_expression(expr->var2); - free(expr->var1); - free(expr->var2); + my_free(expr->var1); + my_free(expr->var2); break; } } @@ -145,14 +142,14 @@ void free_arg_list(arg_list* list) { free_expression(&list->elem); if (list->rest) free_arg_list(list->rest); - free(list->rest); + my_free(list->rest); } void free_rewrite_rule(rewrite_rule* rule) { - free(rule->name); + my_free(rule->name); if (rule->args) free_arg_list(rule->args); - free(rule->args); + my_free(rule->args); free_expression(&rule->rhs); } @@ -160,5 +157,5 @@ void free_fuspel(fuspel* rules) { free_rewrite_rule(&rules->rule); if (rules->rest) free_fuspel(rules->rest); - free(rules->rest); + my_free(rules->rest); } |