Working on making sure functions return a value
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ struct t_parameter {
|
||||
struct t_function {
|
||||
std::string name;
|
||||
uint32_t address;
|
||||
uint32_t type;
|
||||
int type;
|
||||
std::vector<t_parameter> 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;
|
||||
}
|
||||
|
||||
13
parser.cpp
13
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() {
|
||||
|
||||
Reference in New Issue
Block a user