From af372e9cb20abdd4645a3b4987589e30cc44bcf3 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 12 Oct 2021 17:26:26 +0200 Subject: Add ast building and display to processing func --- src/bootstrap/main.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c index 7323629..e6155b4 100755 --- a/src/bootstrap/main.c +++ b/src/bootstrap/main.c @@ -10,6 +10,7 @@ #include "errors.c" #include "lexer.c" #include "objects.c" +#include "parser.c" void init(void) { @@ -17,6 +18,7 @@ init(void) { obj_nil = alloc_object(OBJ_TYPE_NIL); obj_true = alloc_object(OBJ_TYPE_BOOL); obj_false = alloc_object(OBJ_TYPE_BOOL); + obj_err = alloc_object(OBJ_TYPE_ERR); } void @@ -29,10 +31,19 @@ process_source(const StringView *source) { return; } - // Print tokens. - for (size_t i = 0; i < tokens.size; i++) { - Token tok = tokens.buf[i]; - print_token(tok); + Visitor visitor = (Visitor){ + .tokens = tokens, + .current = 0, + }; + while (has_next_token(&visitor) && peek_token(&visitor).type != TOKEN_EOF) { + Object *root = parse_tree(&visitor); + if (root == obj_err || errors_n != 0) { + free_objects(root); + break; + } + display(root); + printf("\n"); + free_objects(root); } if (tokens.buf != NULL) { @@ -69,7 +80,6 @@ run_repl(void) { errors_n = 0; continue; } - if (sv.n != 0) { printf("\n"); } @@ -104,11 +114,11 @@ run_file(char *file_name) { if (errors_n != 0) { for (size_t i = 0; i < errors_n; i++) { Error err = errors[i]; - printf("%s", file_name); + fprintf(stderr, "%s", file_name); if (err.line != 0) { - printf(":%ld:%ld", err.line, err.col); + fprintf(stderr, ":%ld:%ld: ", err.line, err.col); } - printf("%s\n", error_msgs[err.value]); + fprintf(stderr, "%s\n", error_msgs[err.value]); } errors_n = 0; } @@ -146,11 +156,11 @@ run_stdin(void) { if (errors_n != 0) { for (size_t i = 0; i < errors_n; i++) { Error err = errors[i]; - printf("stdin"); + fprintf(stderr, "stdin"); if (err.line != 0) { - printf(":%ld:%ld: ", err.line, err.col); + fprintf(stderr, ":%ld:%ld: ", err.line, err.col); } - printf("%s\n", error_msgs[err.value]); + fprintf(stderr, "%s\n", error_msgs[err.value]); } errors_n = 0; } -- cgit v1.2.1