Parser.hpp: Prioritize missing conditions over missing body code
Signed-off-by: Username404 <w.iron.zombie@gmail.com>
This commit is contained in:
parent
c37f91caf3
commit
ddaf3a44d1
|
@ -101,28 +101,30 @@ namespace Parser {
|
||||||
parsingError(current, "unexpected \"" + current.toktext + "\" without preceding if statement");
|
parsingError(current, "unexpected \"" + current.toktext + "\" without preceding if statement");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const bool has_condition = next.toktype == LPAR and ((lexed.begin() + i - parametersDistance) + 2) < lexed.begin() + i;
|
||||||
|
if (not has_condition and not is_branch) parsingError(current, "missing condition after an \"" + current.toktext + "\" statement");
|
||||||
if (*(lexed.begin() + i + 1) != tok::LBRACE) parsingError(*(lexed.begin() + i), "missing statement body");
|
if (*(lexed.begin() + i + 1) != tok::LBRACE) parsingError(*(lexed.begin() + i), "missing statement body");
|
||||||
const auto body_end = find_corresponding(lexed.begin() + i + 2, lexed.end(), LBRACE, RBRACE);
|
const auto body_end = find_corresponding(lexed.begin() + i + 2, lexed.end(), LBRACE, RBRACE);
|
||||||
auto* statement = (is_branch or is_conditional_branch) ? dynamic_cast<Condition::Statement*>(parseTree[parseTree.size() - 1].get()) : nullptr;
|
auto* statement = (is_branch or is_conditional_branch) ? dynamic_cast<Condition::Statement*>(parseTree[parseTree.size() - 1].get()) : nullptr;
|
||||||
auto& else_branches = statement->else_branches;
|
auto& else_branches = statement->else_branches;
|
||||||
if ((is_conditional_branch or is_branch) and not statement->is_last_branch_conditional())
|
if ((is_conditional_branch or is_branch) and not statement->is_last_branch_conditional())
|
||||||
parsingError(current, "<- unexpected branch", true);
|
parsingError(current, "<- unexpected branch", true);
|
||||||
optional<Condition> condition;
|
Condition condition ((ParseTree()));
|
||||||
// TODO Check that the condition is valid
|
// TODO Check that the condition is valid
|
||||||
if (next.toktype == LPAR and ((lexed.begin() + i - parametersDistance) + 2) < lexed.begin() + i)
|
if (has_condition)
|
||||||
condition.emplace(parse((lexed.begin() + i - parametersDistance) + 2, lexed.begin() + i));
|
condition = Condition(parse((lexed.begin() + i - parametersDistance) + 2, lexed.begin() + i));
|
||||||
if (condition.has_value() or is_branch) {
|
if (has_condition or is_branch) {
|
||||||
if (is_conditional_branch or is_branch) {
|
if (is_conditional_branch or is_branch) {
|
||||||
auto branch = (condition.has_value() ? (Condition::Statement::Branch(move(condition.value()))) : Condition::Statement::Branch());
|
auto branch = (has_condition ? (Condition::Statement::Branch(move(condition))) : Condition::Statement::Branch());
|
||||||
branch.ParseTree::operator=(parse(lexed.begin() + i + 2, body_end));
|
branch.ParseTree::operator=(parse(lexed.begin() + i + 2, body_end));
|
||||||
else_branches << branch;
|
else_branches << branch;
|
||||||
} else {
|
} else {
|
||||||
Condition::Statement new_statement (move(condition.value()));
|
Condition::Statement new_statement (move(condition));
|
||||||
new_statement.ParseTree::operator=(parse(lexed.begin() + i + 2, body_end));
|
new_statement.ParseTree::operator=(parse(lexed.begin() + i + 2, body_end));
|
||||||
parseTree << new_statement;
|
parseTree << new_statement;
|
||||||
}
|
}
|
||||||
i += distance(lexed.begin() + i, body_end);
|
i += distance(lexed.begin() + i, body_end);
|
||||||
} else if (not is_branch) parsingError(current, "missing condition after an \"" + current.toktext + "\" statement");
|
}
|
||||||
continue;
|
continue;
|
||||||
} else if (nextAre({LCOMP, LCOMP, LBRACE})) {
|
} else if (nextAre({LCOMP, LCOMP, LBRACE})) {
|
||||||
Function function(current.toktext);
|
Function function(current.toktext);
|
||||||
|
|
Loading…
Reference in New Issue