diff --git a/src/Evalvisitor.cpp b/src/Evalvisitor.cpp index 9fd6de4..2cb96e7 100644 --- a/src/Evalvisitor.cpp +++ b/src/Evalvisitor.cpp @@ -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 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(&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(&val)) { - // std::cerr << "NoneType" << std::endl; - // } else if (auto ptr = std::any_cast(&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 args = std::any_cast>( diff --git a/src/names.cpp b/src/names.cpp index cfea34f..79747ff 100644 --- a/src/names.cpp +++ b/src/names.cpp @@ -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(&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"<