[FEAT] Typed functions must return a value
This commit is contained in:
@@ -9,12 +9,18 @@
|
||||
0024: RET
|
||||
0025: STL 4
|
||||
0030: STL 0
|
||||
0035: LDL 8
|
||||
0040: PUSH 0
|
||||
0045: GT
|
||||
0046: JNT 66
|
||||
0051: PUSH 1
|
||||
0056: STL 12
|
||||
0061: JMP 76
|
||||
0066: PUSH 2
|
||||
0071: STL 16
|
||||
0035: PUSH 1
|
||||
0040: RET
|
||||
0041: LDL 8
|
||||
0046: PUSH 0
|
||||
0051: GT
|
||||
0052: JNT 78
|
||||
0057: PUSH 1
|
||||
0062: STL 12
|
||||
0067: LDL 8
|
||||
0072: RET
|
||||
0073: JMP 94
|
||||
0078: PUSH 2
|
||||
0083: STL 16
|
||||
0088: PUSH 1
|
||||
0093: RET
|
||||
|
||||
16
parser.cpp
16
parser.cpp
@@ -509,7 +509,7 @@ static void parse_function() {
|
||||
function_set_type(type_num);
|
||||
tkn_next();
|
||||
}
|
||||
if (!parse_statements() && (function_get_type() != -1)) HALT("Function must return a value");
|
||||
if (!parse_statements() && (function_get_type() != -1)) HALT("Not all paths return a value");
|
||||
scope_close_local();
|
||||
EXPECT(TOKEN_END, "Expected statement or 'end'");
|
||||
tkn_next();
|
||||
@@ -606,10 +606,11 @@ static void parse_dec() {
|
||||
}*/
|
||||
|
||||
|
||||
static void parse_if() {
|
||||
static const bool parse_if() {
|
||||
bool ret_at_else = true;
|
||||
const std::string previous_breaklabel = breaklabel;
|
||||
parse_expression();
|
||||
EXPECT(TOKEN_THEN, "Expected 'THEN'");
|
||||
EXPECT2(TOKEN_THEN, "Expected 'THEN'");
|
||||
tkn_next();
|
||||
emmit(OP_JNT);
|
||||
const std::string elselabel = generate_anonymous_labelname();
|
||||
@@ -618,7 +619,7 @@ static void parse_if() {
|
||||
bool else_visited = false;
|
||||
emmit_dw(get_label_address(elselabel));
|
||||
scope_open_block();
|
||||
parse_statements();
|
||||
const bool ret_at_then = parse_statements();
|
||||
scope_close_block();
|
||||
if (tkn_get_token() == TOKEN_ELSE) {
|
||||
else_visited = true;
|
||||
@@ -627,7 +628,7 @@ static void parse_if() {
|
||||
register_label_address(elselabel);
|
||||
tkn_next();
|
||||
scope_open_block();
|
||||
parse_statements();
|
||||
ret_at_else = parse_statements();
|
||||
scope_close_block();
|
||||
}
|
||||
if (tkn_get_token() == TOKEN_END) {
|
||||
@@ -635,10 +636,11 @@ static void parse_if() {
|
||||
register_label_address(endlabel);
|
||||
tkn_next();
|
||||
breaklabel = previous_breaklabel;
|
||||
return;
|
||||
return ret_at_else && ret_at_then;
|
||||
}
|
||||
parser_finished = true;
|
||||
if (!else_visited) error_raise("Expected 'ELSE', 'END' or a statement"); else error_raise("Expected 'END' or a statement");
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
static void parse_for() {
|
||||
@@ -767,7 +769,7 @@ static const bool parse_statements() {
|
||||
case TOKEN_VAR:
|
||||
tkn_next(); parse_var(); break;
|
||||
case TOKEN_IF:
|
||||
tkn_next(); parse_if(); break;
|
||||
tkn_next(); if (parse_if()) { return_called = true; } break;
|
||||
/*
|
||||
case TOKEN_FOR:
|
||||
tkn_next(); parse_for(); break;
|
||||
|
||||
Reference in New Issue
Block a user