diff --git a/decompiled.txt b/decompiled.txt index a0f069d..6bf37e5 100644 --- a/decompiled.txt +++ b/decompiled.txt @@ -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 diff --git a/parser.cpp b/parser.cpp index 7a305d4..b86c581 100644 --- a/parser.cpp +++ b/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; diff --git a/test.vb b/test.vb index 72f7e2d..53ff69a 100644 --- a/test.vb +++ b/test.vb @@ -15,8 +15,10 @@ 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 + return 1 if local1 > 0 then var local1 as number = 1 + return local1 else var local3 as number = 2 end