From 9f1f2ff307bb3da8bfc6809ae05be589e1e37ed9 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 26 Oct 2021 08:55:12 +0200 Subject: Add OP_DROP and improve error reporting --- src/bytecode/compiler.h | 1 + src/bytecode/debug.h | 2 ++ src/bytecode/errors.c | 20 ++++++++++++++++++++ src/bytecode/errors.h | 1 + src/bytecode/main.c | 20 ++------------------ src/bytecode/ops.h | 2 ++ src/bytecode/vm.h | 6 +++++- 7 files changed, 33 insertions(+), 19 deletions(-) (limited to 'src/bytecode') diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index 6dab1fe..9fefd2a 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -504,6 +504,7 @@ compile(Token *tokens) { Token start_tok = peek_token(&compiler); while (has_next_token(&compiler) && peek_token(&compiler).type != TOKEN_EOF) { parse_tree(chunk, &compiler); + add_code(chunk, OP_DROP, start_tok.line, start_tok.column); } add_code(chunk, OP_RETURN, start_tok.line, start_tok.column); return chunk; diff --git a/src/bytecode/debug.h b/src/bytecode/debug.h index 1e0d4d6..8c4a2eb 100755 --- a/src/bytecode/debug.h +++ b/src/bytecode/debug.h @@ -39,6 +39,8 @@ static const char* ops_str[] = { // Procedures. [OP_CALL] = "OP_CALL", [OP_RETURN] = "OP_RETURN", + // Clear stack after each statement. + [OP_DROP] = "OP_DROP", }; void diff --git a/src/bytecode/errors.c b/src/bytecode/errors.c index c2ab77f..b4595a1 100755 --- a/src/bytecode/errors.c +++ b/src/bytecode/errors.c @@ -29,3 +29,23 @@ error_push(Error error) { errors[errors_n++] = error; } } + +void +report_errors(char *file_name) { + for (size_t i = 0; i < errors_n; i++) { + Error err = errors[i]; + fprintf(stderr, "%s", file_name); + if (err.line != 0) { + fprintf(stderr, ":%ld:%ld", err.line, err.col); + } + switch (err.type) { + case ERR_TYPE_LEXER: { fprintf(stderr, ": [lexer]"); } break; + case ERR_TYPE_COMPILER: { fprintf(stderr, ": [compiler]"); } break; + case ERR_TYPE_RUNTIME: { fprintf(stderr, ": [runtime]"); } break; + case ERR_TYPE_PARSER: { fprintf(stderr, ": [parser]"); } break; + default: break; + } + fprintf(stderr, " %s\n", error_msgs[err.value]); + } + errors_n = 0; +} diff --git a/src/bytecode/errors.h b/src/bytecode/errors.h index 7b3446e..425c768 100755 --- a/src/bytecode/errors.h +++ b/src/bytecode/errors.h @@ -38,6 +38,7 @@ typedef struct Error { } Error; void error_push(Error error); +void report_errors(char *file_name); #define ERR_MAX_NUMBER 16 diff --git a/src/bytecode/main.c b/src/bytecode/main.c index 7cb0a2a..7f2042e 100755 --- a/src/bytecode/main.c +++ b/src/bytecode/main.c @@ -126,15 +126,7 @@ run_file(char *file_name) { // Check if there were any errors. if (errors_n != 0 && !supress_errors) { - for (size_t i = 0; i < errors_n; i++) { - Error err = errors[i]; - fprintf(stderr, "%s", file_name); - if (err.line != 0) { - fprintf(stderr, ":%ld:%ld", err.line, err.col); - } - fprintf(stderr, ": %s\n", error_msgs[err.value]); - } - errors_n = 0; + report_errors(file_name); } free(source); @@ -164,15 +156,7 @@ run_stdin(void) { // Check if there were any errors. if (errors_n != 0 && !supress_errors) { - for (size_t i = 0; i < errors_n; i++) { - Error err = errors[i]; - fprintf(stderr, "stdin"); - if (err.line != 0) { - fprintf(stderr, ":%ld:%ld", err.line, err.col); - } - fprintf(stderr, ": %s\n", error_msgs[err.value]); - } - errors_n = 0; + report_errors("stdin"); } array_free(source); diff --git a/src/bytecode/ops.h b/src/bytecode/ops.h index d046ca2..7a43b91 100755 --- a/src/bytecode/ops.h +++ b/src/bytecode/ops.h @@ -33,6 +33,8 @@ typedef enum Ops { // Procedures. OP_CALL, OP_RETURN, + // Clear stack after each statement. + OP_DROP, } Ops; #endif // BDL_OPS_H diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 63eedfa..d654e2c 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -64,7 +64,8 @@ vm_reset(VM *vm) { .value = ERR_WRONG_ARG_TYPE, \ .line = frame->chunk->lines[vm->pc - frame->chunk->code - 1].line, \ .col = frame->chunk->lines[vm->pc - frame->chunk->code - 1].col, \ - }) + }); \ + return #define SYMBOL_NOT_FOUND_ERR() \ error_push((Error){ \ @@ -268,6 +269,9 @@ vm_interpret(VM *vm) { array_head(vm->frames)->size--; frame = &vm->frames[array_size(vm->frames) - 1]; } break; + case OP_DROP: { + array_head(vm->stack)->size = 0; + } break; default: { error_push((Error){ .type = ERR_TYPE_RUNTIME, -- cgit v1.2.1