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) {
|
void error_raise(const char* msg) {
|
||||||
if (!raised) {
|
if (!raised) {
|
||||||
raised = true;
|
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 {
|
struct t_function {
|
||||||
std::string name;
|
std::string name;
|
||||||
uint32_t address;
|
uint32_t address;
|
||||||
uint32_t type;
|
int type;
|
||||||
std::vector<t_parameter> parameters;
|
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) {
|
const bool function_register(const std::string name, const uint32_t address) {
|
||||||
for (auto f : functions) if (f.name == name) return false;
|
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;
|
current_function = functions.size()-1;
|
||||||
return true;
|
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_expression();
|
||||||
static void parse_statements();
|
static const bool parse_statements();
|
||||||
|
|
||||||
/* XXX [RZC 27/04/2021] No usat en JailBasic
|
/* XXX [RZC 27/04/2021] No usat en JailBasic
|
||||||
//static void parse_strleft();
|
//static void parse_strleft();
|
||||||
@@ -466,6 +466,7 @@ static void parse_struct() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void parse_function() {
|
static void parse_function() {
|
||||||
|
|
||||||
if (!global_closed) {
|
if (!global_closed) {
|
||||||
emmit(OP_RET);
|
emmit(OP_RET);
|
||||||
global_closed = true;
|
global_closed = true;
|
||||||
@@ -508,7 +509,7 @@ static void parse_function() {
|
|||||||
function_set_type(type_num);
|
function_set_type(type_num);
|
||||||
tkn_next();
|
tkn_next();
|
||||||
}
|
}
|
||||||
parse_statements();
|
if (!parse_statements() && (function_get_type() != -1)) HALT("Function must return a value");
|
||||||
scope_close_local();
|
scope_close_local();
|
||||||
EXPECT(TOKEN_END, "Expected statement or 'end'");
|
EXPECT(TOKEN_END, "Expected statement or 'end'");
|
||||||
tkn_next();
|
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) {
|
while (!parser_finished) {
|
||||||
current_line = tkn_get_line();
|
current_line = tkn_get_line();
|
||||||
switch (tkn_get_token()) {
|
switch (tkn_get_token()) {
|
||||||
@@ -775,7 +777,7 @@ static void parse_statements() {
|
|||||||
tkn_next(); parse_continue(); break;
|
tkn_next(); parse_continue(); break;
|
||||||
*/
|
*/
|
||||||
case TOKEN_RETURN:
|
case TOKEN_RETURN:
|
||||||
tkn_next(); parse_return(); break;
|
tkn_next(); parse_return(); return_called = true; break;
|
||||||
case TOKEN_REM:
|
case TOKEN_REM:
|
||||||
tkn_next(); break;
|
tkn_next(); break;
|
||||||
|
|
||||||
@@ -787,9 +789,10 @@ static void parse_statements() {
|
|||||||
parse_let(); break;
|
parse_let(); break;
|
||||||
*/
|
*/
|
||||||
default:
|
default:
|
||||||
return;
|
return return_called;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return return_called;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_global_statements() {
|
static void parse_global_statements() {
|
||||||
|
|||||||
Reference in New Issue
Block a user