diff options
author | Camil Staps | 2018-04-03 20:32:40 +0200 |
---|---|---|
committer | Camil Staps | 2018-04-03 20:32:40 +0200 |
commit | 27971f8bb01eff8037d3897f7b8d5cde99dce4f0 (patch) | |
tree | 08eeef55992f2afa6a5c95ae15a8eaf666c8b5a2 | |
parent | Add fix and scan_iterate examples (diff) |
Resolve #11: print end result as soon as it is in HNF
-rw-r--r-- | interpreter/eval.c | 60 | ||||
-rw-r--r-- | interpreter/eval.h | 4 | ||||
-rw-r--r-- | interpreter/fuspel.c | 7 |
3 files changed, 63 insertions, 8 deletions
diff --git a/interpreter/eval.c b/interpreter/eval.c index b82f9b2..b86c32f 100644 --- a/interpreter/eval.c +++ b/interpreter/eval.c @@ -344,7 +344,58 @@ void eval(struct fuspel *rules, struct node **node, bool to_rnf) { my_free(repls); } -struct expression *eval_main(struct fuspel *rules +void print_eval(FILE *out, struct fuspel *rules, struct node **node) { + eval(rules, node, true); + + switch ((*node)->kind) { + case NODE_INT: + fprintf(out, "%d", *(int*)(*node)->var1); + break; + case NODE_NAME: + fprintf(out, "%s", (char*)(*node)->var1); + break; + case EXPR_CODE: + fprintf(out, "code [%p, %d args]", + (void*)(*node)->var1, *((unsigned char*)(*node)->var2)); + break; + case NODE_LIST: + if (!(*node)->var1) { + fprintf(out, "[]"); + } else { + fprintf(out, "["); + fflush(out); + print_eval(out, rules, (struct node**) &(*node)->var1); + if (((struct node*)(*node)->var2)->var1) { + struct node *tl = (*node)->var2; + while (tl->var1) { + fprintf(out, ","); + fflush(out); + eval(rules, &tl, true); + print_eval(out, rules, (struct node**) &tl->var1); + tl = (struct node*) tl->var2; + } + } + fprintf(out, "]"); + } + break; + case NODE_TUPLE: + fprintf(out, "("); + fflush(out); + print_eval(out, rules, (struct node**) &(*node)->var1); + fprintf(out, ","); + fflush(out); + print_eval(out, rules, (struct node**) &(*node)->var2); + fprintf(out, ")"); + break; + default: + fprintf(out, "<unimplemented:%d>", (*node)->kind); + break; + } + + fflush(out); +} + +struct expression *eval_main(FILE *out, struct fuspel *rules #ifdef FUSPEL_DEBUG , bool debug_graphs_enabled #endif @@ -362,7 +413,12 @@ struct expression *eval_main(struct fuspel *rules main_node->var1 = my_calloc(1, 5); strcpy(main_node->var1, "main"); - eval(rules, &main_node, 0); + if (!out) { + eval(rules, &main_node, false); + } else { + print_eval(out, rules, &main_node); + fprintf(out, "\n"); + } cpy_node_to_expression(expr, main_node); diff --git a/interpreter/eval.h b/interpreter/eval.h index 121f3be..9dd1ce0 100644 --- a/interpreter/eval.h +++ b/interpreter/eval.h @@ -1,9 +1,11 @@ #ifndef _H_FUSPEL_EVAL #define _H_FUSPEL_EVAL +#include <stdio.h> + #include "syntax.h" -struct expression *eval_main(struct fuspel* +struct expression *eval_main(FILE *out, struct fuspel* #ifdef FUSPEL_DEBUG , bool debug_graphs #endif diff --git a/interpreter/fuspel.c b/interpreter/fuspel.c index 93e31db..e622d18 100644 --- a/interpreter/fuspel.c +++ b/interpreter/fuspel.c @@ -126,14 +126,11 @@ int main(int argc, char *argv[]) { } #ifdef FUSPEL_DEBUG - result = eval_main(env.program, env.debugGraphs); + result = eval_main(stdout, env.program, env.debugGraphs); #else - result = eval_main(env.program); + result = eval_main(stdout, env.program); #endif if (result) { - print_expression(result); - printf("\n"); - free_expression(result); my_free(result); } |