diff options
Diffstat (limited to 'interpreter/print.c')
-rw-r--r-- | interpreter/print.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/interpreter/print.c b/interpreter/print.c new file mode 100644 index 0000000..a71e71f --- /dev/null +++ b/interpreter/print.c @@ -0,0 +1,102 @@ +#include "print.h" + +#include <stdio.h> + +#include "log.h" + +void print_token(token* tk) { + char c; + switch (tk->kind) { + case TOKEN_SEMICOLON: c = ';'; break; + case TOKEN_COLON: c = ':'; break; + case TOKEN_OPEN_P: c = '('; break; + case TOKEN_CLOSE_P: c = ')'; break; + case TOKEN_OPEN_SQ: c = '['; break; + case TOKEN_CLOSE_SQ: c = ']'; break; + case TOKEN_EQUALS: c = '='; break; + case TOKEN_COMMA: c = ','; break; + case TOKEN_NAME: + printf("%s", (char*) tk->var); + return; + case TOKEN_INT: + printf("%d", *((int*) tk->var)); + return; + } + printf("%c", c); +} + +void print_token_list(token_list* list) { + print_token(&list->elem); + if (list->rest) { + printf(list->elem.kind == TOKEN_SEMICOLON ? "\n" : " "); + print_token_list(list->rest); + } +} + +void print_expression(expression* expr) { + switch (expr->kind) { + case EXPR_INT: + printf("%d", *((int*) expr->var1)); + break; + case EXPR_NAME: + printf("%s", (char*) expr->var1); + break; + case EXPR_LIST: + if (!expr->var1) { + printf("[]"); + } else { + printf("["); + print_expression(expr->var1); + printf(":"); + print_expression(expr->var2); + printf("]"); + } + break; + case EXPR_TUPLE: + printf("("); + print_expression(expr->var1); + printf(","); + print_expression(expr->var2); + printf(")"); + break; + case EXPR_APP: + if (((expression*) expr->var1)->kind == EXPR_APP) + printf("("); + print_expression(expr->var1); + if (((expression*) expr->var1)->kind == EXPR_APP) + printf(")"); + printf(" "); + if (((expression*) expr->var2)->kind == EXPR_APP) + printf("("); + print_expression(expr->var2); + if (((expression*) expr->var2)->kind == EXPR_APP) + printf(")"); + break; + } +} + +void print_arg_list(arg_list* args) { + if (!args) + return; + + print_expression(&args->elem); + printf(" "); + if (args->rest) + print_arg_list(args->rest); +} + +void print_rewrite_rule(rewrite_rule* rule) { + printf("%s ", rule->name); + print_arg_list(rule->args); + printf("= "); + print_expression(&rule->rhs); + printf(";"); +} + +void print_fuspel(fuspel* rules) { + print_rewrite_rule(&rules->rule); + if (rules->rest) { + printf("\n"); + print_fuspel(rules->rest); + } +} |