aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2018-04-03 20:32:40 +0200
committerCamil Staps2018-04-03 20:32:40 +0200
commit27971f8bb01eff8037d3897f7b8d5cde99dce4f0 (patch)
tree08eeef55992f2afa6a5c95ae15a8eaf666c8b5a2
parentAdd fix and scan_iterate examples (diff)
Resolve #11: print end result as soon as it is in HNF
-rw-r--r--interpreter/eval.c60
-rw-r--r--interpreter/eval.h4
-rw-r--r--interpreter/fuspel.c7
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);
}