diff --git a/.gitignore b/.gitignore index c07acba..4d42b4a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .vscode *.exe jb +decompiled.txt diff --git a/decompiled.txt b/decompiled.txt deleted file mode 100644 index 9a3b8c4..0000000 --- a/decompiled.txt +++ /dev/null @@ -1,24 +0,0 @@ -0000: NOP -0001: NOP -0002: PUSH 4 -0007: LD 72 -0012: LD 60 -0017: MUL -0018: SUB -0019: ST 144 -0024: RET -0025: STL 4 -0030: STL 0 -0035: LDL 8 -0040: PUSH 0 -0045: GT -0046: JNT 72 -0051: LDL 8 -0056: RET -0057: PUSH 1 -0062: STL 12 -0067: JMP 82 -0072: PUSH 2 -0077: STL 16 -0082: PUSH 1 -0087: RET diff --git a/error.cpp b/error.cpp index ec39e5a..701e6e2 100644 --- a/error.cpp +++ b/error.cpp @@ -1,18 +1,25 @@ #include "error.h" #include +#include #include "tokenizer.h" static char errormsg[255]; static bool raised = false; - +static std::string warning_msg = ""; void error_raise(const char* msg) { if (!raised) { raised = true; - sprintf(errormsg, "ERROR AT SOURCE:%s at %d:%d.\n", msg, tkn_get_line() + 1, tkn_get_row() + 1); + sprintf(errormsg, "ERROR: %s at %d:%d.\n", msg, tkn_get_line() + 1, tkn_get_row() + 1); } } +void error_warning(const char *msg) { + char warningmsg[255]; + sprintf(warningmsg, "WARNING: %s at %d:%d.\n", msg, tkn_get_line() + 1, tkn_get_row() + 1); + warning_msg += warningmsg; +} + bool error_raised() { return raised; } void error_print(unsigned char* mem) { @@ -20,3 +27,8 @@ void error_print(unsigned char* mem) { //while (*msg != 0) *mem++ = *msg++; printf("%s", errormsg); } + +void error_print_warnings() { + if (warning_msg == "") warning_msg = "Compilation OK.\n"; + printf("%s", warning_msg.c_str()); +} \ No newline at end of file diff --git a/error.h b/error.h index b753dfe..48aff55 100644 --- a/error.h +++ b/error.h @@ -1,5 +1,7 @@ #pragma once void error_raise(const char* msg); +void error_warning(const char* msg); bool error_raised(); void error_print(unsigned char* mem); +void error_print_warnings(); diff --git a/parser.cpp b/parser.cpp index a0c2371..b45a2f8 100644 --- a/parser.cpp +++ b/parser.cpp @@ -762,22 +762,23 @@ static void parse_call() { static const bool parse_statements() { bool return_called = false; bool local_return = false; + bool already_warned = false; while (!parser_finished) { current_line = tkn_get_line(); switch (tkn_get_token()) { case TOKEN_CONST: tkn_next(); - if (local_return) HALT2("Unreachable code"); + if (local_return && !already_warned) { error_warning("Unreachable code"); already_warned = true; } parse_const(); break; case TOKEN_VAR: tkn_next(); - if (local_return) HALT2("Unreachable code"); + if (local_return && !already_warned) { error_warning("Unreachable code"); already_warned = true; } parse_var(); break; case TOKEN_IF: tkn_next(); - if (local_return) HALT2("Unreachable code"); + if (local_return && !already_warned) { error_warning("Unreachable code"); already_warned = true; } if (parse_if()) { return_called = true; } break; /* case TOKEN_FOR: @@ -789,7 +790,7 @@ static const bool parse_statements() { */ case TOKEN_RETURN: tkn_next(); - if (local_return) HALT2("Unreachable code"); + if (local_return && !already_warned) { error_warning("Unreachable code"); already_warned = true; } parse_return(); local_return = return_called = true; break; @@ -875,6 +876,7 @@ void parser_parse(const char* buffer, byte* mem) { //emmit(OP_JMP); //emmit_w(0xA000); } else { + error_print_warnings(); decompiler_save(code, codepos); } diff --git a/test.vb b/test.vb index 27bd477..b73a963 100644 --- a/test.vb +++ b/test.vb @@ -16,8 +16,8 @@ const perico as number = 4-peiv[1].a.x * peiv[0].c.y[2] function tarari(a as number, b as number) as number var local1 as number if local1 > 0 then - return local1 var local1 as number = 1 + return local1 else var local3 as number = 2 end