upd: write loop

This commit is contained in:
2023-11-09 18:44:24 +08:00
parent 8f209bff2b
commit b423649d7b

View File

@ -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) {