upd: write loop
This commit is contained in:
@ -187,22 +187,39 @@ std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) {
|
|||||||
|
|
||||||
std::any EvalVisitor::visitCompound_stmt(
|
std::any EvalVisitor::visitCompound_stmt(
|
||||||
Python3Parser::Compound_stmtContext *ctx) {
|
Python3Parser::Compound_stmtContext *ctx) {
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitIf_stmt(Python3Parser::If_stmtContext *ctx) {
|
std::any EvalVisitor::visitIf_stmt(Python3Parser::If_stmtContext *ctx) {
|
||||||
// TODO
|
auto test_list = ctx->test();
|
||||||
return visitChildren(ctx);
|
auto suite_list = ctx->suite();
|
||||||
|
if (test_list.size() - suite_list.size() != 1 &&
|
||||||
|
test_list.size() - suite_list.size() != 0)
|
||||||
|
throw InterpretException("test and suite doesn't match in If_stmt");
|
||||||
|
for (int i = 0; i < test_list.size(); i++)
|
||||||
|
if (Any2Bool(DeQuate(visitTest(test_list[i]), Variables)))
|
||||||
|
return visitSuite(suite_list[i]);
|
||||||
|
if (test_list.size() - suite_list.size() == 1)
|
||||||
|
return visitSuite(suite_list[suite_list.size() - 1]);
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitWhile_stmt(Python3Parser::While_stmtContext *ctx) {
|
std::any EvalVisitor::visitWhile_stmt(Python3Parser::While_stmtContext *ctx) {
|
||||||
// TODO
|
auto test = ctx->test();
|
||||||
return visitChildren(ctx);
|
auto suite = ctx->suite();
|
||||||
|
while (Any2Bool(DeQuate(visitTest(test), Variables))) {
|
||||||
|
auto res = visitSuite(suite);
|
||||||
|
FlowType *res_ptr = std::any_cast<FlowType>(&res);
|
||||||
|
if (res_ptr) {
|
||||||
|
if (res_ptr->Status == BREAK) break;
|
||||||
|
if (res_ptr->Status == CONTINUE) continue;
|
||||||
|
if (res_ptr->Status == RETURN) return *res_ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitSuite(Python3Parser::SuiteContext *ctx) {
|
std::any EvalVisitor::visitSuite(Python3Parser::SuiteContext *ctx) {
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
std::any EvalVisitor::visitTestlist(Python3Parser::TestlistContext *ctx) {
|
std::any EvalVisitor::visitTestlist(Python3Parser::TestlistContext *ctx) {
|
||||||
|
Reference in New Issue
Block a user