From 835cae35bb76e5d40daf457e35ba8c1f2b2c08b1 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Wed, 5 May 2021 16:11:49 +0200 Subject: [PATCH] Working on making sure functions return a value --- error.cpp | 2 +- function.cpp | 4 ++-- parser.cpp | 13 ++++++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/error.cpp b/error.cpp index 13ae601..ec39e5a 100644 --- a/error.cpp +++ b/error.cpp @@ -9,7 +9,7 @@ static bool raised = false; void error_raise(const char* msg) { if (!raised) { raised = true; - sprintf(errormsg, "ERROR AT SOURCE:%s at %d:%d.", msg, tkn_get_line() + 1, tkn_get_row() + 1); + sprintf(errormsg, "ERROR AT SOURCE:%s at %d:%d.\n", msg, tkn_get_line() + 1, tkn_get_row() + 1); } } diff --git a/function.cpp b/function.cpp index d77213c..1d23be4 100644 --- a/function.cpp +++ b/function.cpp @@ -10,7 +10,7 @@ struct t_parameter { struct t_function { std::string name; uint32_t address; - uint32_t type; + int type; std::vector parameters; }; @@ -19,7 +19,7 @@ static int current_function = -1; const bool function_register(const std::string name, const uint32_t address) { for (auto f : functions) if (f.name == name) return false; - functions.push_back({name, address}); + functions.push_back({name, address, -1}); current_function = functions.size()-1; return true; } diff --git a/parser.cpp b/parser.cpp index 39d1c7d..7a305d4 100644 --- a/parser.cpp +++ b/parser.cpp @@ -183,7 +183,7 @@ static const std::string generate_anonymous_labelname() { /****************************************************************************************/ static void parse_expression(); -static void parse_statements(); +static const bool parse_statements(); /* XXX [RZC 27/04/2021] No usat en JailBasic //static void parse_strleft(); @@ -466,6 +466,7 @@ static void parse_struct() { } static void parse_function() { + if (!global_closed) { emmit(OP_RET); global_closed = true; @@ -508,7 +509,7 @@ static void parse_function() { function_set_type(type_num); tkn_next(); } - parse_statements(); + if (!parse_statements() && (function_get_type() != -1)) HALT("Function must return a value"); scope_close_local(); EXPECT(TOKEN_END, "Expected statement or 'end'"); tkn_next(); @@ -756,7 +757,8 @@ static void parse_call() { } } */ -static void parse_statements() { +static const bool parse_statements() { + bool return_called = false; while (!parser_finished) { current_line = tkn_get_line(); switch (tkn_get_token()) { @@ -775,7 +777,7 @@ static void parse_statements() { tkn_next(); parse_continue(); break; */ case TOKEN_RETURN: - tkn_next(); parse_return(); break; + tkn_next(); parse_return(); return_called = true; break; case TOKEN_REM: tkn_next(); break; @@ -787,9 +789,10 @@ static void parse_statements() { parse_let(); break; */ default: - return; + return return_called; } } + return return_called; } static void parse_global_statements() {