aboutsummaryrefslogtreecommitdiff
path: root/compiler/syntax.c
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/syntax.c')
-rw-r--r--compiler/syntax.c163
1 files changed, 0 insertions, 163 deletions
diff --git a/compiler/syntax.c b/compiler/syntax.c
deleted file mode 100644
index 0f80461..0000000
--- a/compiler/syntax.c
+++ /dev/null
@@ -1,163 +0,0 @@
-#include "syntax.h"
-
-#include <string.h>
-
-#include "mem.h"
-
-void free_token(token* tk) {
- 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);
- my_free(list->rest);
-}
-
-unsigned empty_args_list(arg_list* list) {
- return !list;
-}
-
-void cpy_expression(expression* dst, expression* src) {
- free_expression(dst);
- dst->kind = src->kind;
- switch (dst->kind) {
- case EXPR_INT:
- dst->var1 = my_calloc(1, sizeof(int));
- *((int*) dst->var1) = *((int*) src->var1);
- break;
- case EXPR_NAME:
- dst->var1 = my_calloc(1, strlen((char*) src->var1) + 1);
- strcpy(dst->var1, src->var1);
- break;
- case EXPR_LIST:
- if (!src->var1)
- break;
- case EXPR_TUPLE:
- case EXPR_APP:
- 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;
- }
-}
-
-unsigned eq_expression(expression* a, expression* b) {
- if (a->kind != b->kind)
- return 0;
-
- switch (a->kind) {
- case EXPR_INT: return *((int*) a->var1) == *((int*) b->var1);
- case EXPR_NAME: return !strcmp(a->var1, b->var1);
- 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))
- return 0;
- if (a->var1 && !eq_expression(a->var1, b->var1))
- return 0;
- if (a->var2 && !eq_expression(a->var2, b->var2))
- return 0;
- return 1;
- }
-
- return 0;
-}
-
-expression** flatten_app_args(expression* from) {
- unsigned char len = 0;
- expression* _from = from;
- while (_from->kind == EXPR_APP) {
- len++;
- _from = _from->var1;
- }
- len++;
-
- expression** result = my_calloc(1, sizeof(expression*) * (len + 1));
- unsigned int i = 1;
- while (from->kind == EXPR_APP) {
- result[len - i] = from->var2;
- from = from->var1;
- i++;
- }
- result[0] = from;
- result[len] = NULL;
- return result;
-}
-
-void concat_fuspel(fuspel* start, fuspel* end) {
- do {
- if (!start->rest) {
- start->rest = end;
- return;
- }
- start = start->rest;
- } while (start);
-}
-
-fuspel* push_fuspel(fuspel* rules) {
- fuspel* new_rules = my_calloc(1, sizeof(fuspel));
- new_rules->rest = rules;
- return new_rules;
-}
-
-fuspel* pop_fuspel(fuspel* rules) {
- free_rewrite_rule(&rules->rule);
- return rules->rest;
-}
-
-fuspel* popn_fuspel(fuspel* rules, unsigned char n) {
- while (n > 0) {
- rules = pop_fuspel(rules);
- n--;
- }
- return rules;
-}
-
-void free_expression(expression* expr) {
- if (!expr)
- return;
-
- switch (expr->kind) {
- case EXPR_INT:
- case EXPR_NAME:
- my_free(expr->var1);
- break;
- case EXPR_LIST:
- case EXPR_TUPLE:
- case EXPR_APP:
- free_expression(expr->var1);
- free_expression(expr->var2);
- my_free(expr->var1);
- my_free(expr->var2);
- break;
- }
-
- expr->var1 = expr->var2 = NULL;
-}
-
-void free_arg_list(arg_list* list) {
- free_expression(&list->elem);
- if (list->rest)
- free_arg_list(list->rest);
- my_free(list->rest);
-}
-
-void free_rewrite_rule(rewrite_rule* rule) {
- my_free(rule->name);
- if (rule->args)
- free_arg_list(rule->args);
- my_free(rule->args);
- free_expression(&rule->rhs);
-}
-
-void free_fuspel(fuspel* rules) {
- free_rewrite_rule(&rules->rule);
- if (rules->rest)
- free_fuspel(rules->rest);
- my_free(rules->rest);
-}