upd: fix some bugs
This commit is contained in:
@ -48,19 +48,23 @@ std::any EvalVisitor::visitTypedargslist(
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitTfpdef(Python3Parser::TfpdefContext *ctx) {
|
||||
return visitChildren(ctx);
|
||||
return ctx->NAME()->getText();
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitStmt(Python3Parser::StmtContext *ctx) {
|
||||
return visitChildren(ctx);
|
||||
if (ctx->compound_stmt()) return visitCompound_stmt(ctx->compound_stmt());
|
||||
return visitSimple_stmt(ctx->simple_stmt());
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitSimple_stmt(Python3Parser::Simple_stmtContext *ctx) {
|
||||
return visitChildren(ctx);
|
||||
return visitSmall_stmt(ctx->small_stmt());
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitSmall_stmt(Python3Parser::Small_stmtContext *ctx) {
|
||||
return visitChildren(ctx);
|
||||
if (ctx->expr_stmt())
|
||||
return visitExpr_stmt(ctx->expr_stmt());
|
||||
else
|
||||
return visitFlow_stmt(ctx->flow_stmt());
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitExpr_stmt(Python3Parser::Expr_stmtContext *ctx) {
|
||||
@ -163,7 +167,9 @@ std::any EvalVisitor::visitAugassign(Python3Parser::AugassignContext *ctx) {
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitFlow_stmt(Python3Parser::Flow_stmtContext *ctx) {
|
||||
return visitChildren(ctx);
|
||||
if (ctx->break_stmt()) return visitBreak_stmt(ctx->break_stmt());
|
||||
if (ctx->continue_stmt()) return visitContinue_stmt(ctx->continue_stmt());
|
||||
if (ctx->return_stmt()) return visitReturn_stmt(ctx->return_stmt());
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitBreak_stmt(Python3Parser::Break_stmtContext *ctx) {
|
||||
@ -182,12 +188,15 @@ std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) {
|
||||
if (val_ptr) return FlowType(RETURN, *val_ptr);
|
||||
std::vector<std::any> tmp;
|
||||
tmp.push_back(val);
|
||||
// std::cerr << "ready to send return value" << Any2String(val) << std::endl;
|
||||
return FlowType(RETURN, tmp);
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitCompound_stmt(
|
||||
Python3Parser::Compound_stmtContext *ctx) {
|
||||
return visitChildren(ctx);
|
||||
if (ctx->if_stmt()) return visitIf_stmt(ctx->if_stmt());
|
||||
if (ctx->while_stmt()) return visitWhile_stmt(ctx->while_stmt());
|
||||
if (ctx->funcdef()) return visitFuncdef(ctx->funcdef());
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitIf_stmt(Python3Parser::If_stmtContext *ctx) {
|
||||
@ -220,7 +229,15 @@ std::any EvalVisitor::visitWhile_stmt(Python3Parser::While_stmtContext *ctx) {
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitSuite(Python3Parser::SuiteContext *ctx) {
|
||||
return visitChildren(ctx);
|
||||
if (ctx->simple_stmt()) return visitSimple_stmt(ctx->simple_stmt());
|
||||
auto stmt_list = ctx->stmt();
|
||||
std::any res;
|
||||
for (int i = 0; i < stmt_list.size(); i++) {
|
||||
res = visitStmt(stmt_list[i]);
|
||||
FlowType *res_ptr = std::any_cast<FlowType>(&res);
|
||||
if (res_ptr) return res;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
std::any EvalVisitor::visitTestlist(Python3Parser::TestlistContext *ctx) {
|
||||
auto test_list = ctx->test();
|
||||
@ -232,7 +249,7 @@ std::any EvalVisitor::visitTestlist(Python3Parser::TestlistContext *ctx) {
|
||||
return res;
|
||||
}
|
||||
std::any EvalVisitor::visitTest(Python3Parser::TestContext *ctx) {
|
||||
return visitChildren(ctx);
|
||||
return visitOr_test(ctx->or_test());
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitOr_test(Python3Parser::Or_testContext *ctx) {
|
||||
@ -351,19 +368,7 @@ std::any EvalVisitor::visitFactor(Python3Parser::FactorContext *ctx) {
|
||||
}
|
||||
|
||||
std::any EvalVisitor::visitAtom_expr(Python3Parser::Atom_exprContext *ctx) {
|
||||
if (!ctx->trailer()) {
|
||||
auto val = visitAtom(ctx->atom());
|
||||
// std::cerr << "[Log] In func visitAtom_expr. The Atom returns : ";
|
||||
// if (auto ptr = std::any_cast<NoneType>(&val)) {
|
||||
// std::cerr << "NoneType" << std::endl;
|
||||
// } else if (auto ptr = std::any_cast<RawVarible>(&val)) {
|
||||
// std::cerr << "Variable Name=" << ptr->name
|
||||
// << " val=" << Any2String(Variables.ReadVariable(ptr->name))
|
||||
// << std::endl;
|
||||
// } else
|
||||
// std::cerr << Any2String(val) << std::endl;
|
||||
return val;
|
||||
}
|
||||
if (!ctx->trailer()) return visitAtom(ctx->atom());
|
||||
std::string func_name = ctx->atom()->NAME()->getText();
|
||||
std::vector<ParaArguItemType> args =
|
||||
std::any_cast<std::vector<ParaArguItemType>>(
|
||||
|
@ -109,6 +109,7 @@ std::any FucntionContainer::CallFunction(
|
||||
if (i >= func.para_list.size()) break;
|
||||
Variables.WriteVariable(func.para_list[i].name, args[p_src].value, true);
|
||||
args_with_data.insert(func.para_list[i].name);
|
||||
p_src++;
|
||||
}
|
||||
for (int i = 0; i < func.para_list.size(); i++) {
|
||||
while (i < func.para_list.size() &&
|
||||
@ -124,8 +125,9 @@ std::any FucntionContainer::CallFunction(
|
||||
EvalVisitor vis;
|
||||
std::any res = vis.visit(func.code_address);
|
||||
Variables.DestroyFrame();
|
||||
// std::cerr << "function called " << std::endl;
|
||||
FlowType *flow = std::any_cast<FlowType>(&res);
|
||||
if (!flow) {
|
||||
if (flow) {
|
||||
if (flow->ReturnValueLists.size() == 0)
|
||||
return NoneType();
|
||||
else if (flow->ReturnValueLists.size() == 1)
|
||||
@ -133,5 +135,6 @@ std::any FucntionContainer::CallFunction(
|
||||
else
|
||||
return flow->ReturnValueLists;
|
||||
}
|
||||
// std::cerr<<"Return value isn't FlowType"<<std::endl;
|
||||
return NoneType();
|
||||
}
|
Reference in New Issue
Block a user