diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d06c33..42d3f2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.15.2) project(python_interpreter) set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Ofast") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") include_directories(/usr/include/antlr4-runtime/) include_directories( diff --git a/src/Evalvisitor.cpp b/src/Evalvisitor.cpp index 5abbeeb..195bd88 100644 --- a/src/Evalvisitor.cpp +++ b/src/Evalvisitor.cpp @@ -176,9 +176,13 @@ std::any EvalVisitor::visitContinue_stmt( } std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) { - // TODO - throw FatalError("Not implemented in function visitReturn_stmt"); - return visitChildren(ctx); + if (!ctx->testlist()) return FlowType(RETURN, std::vector()); + std::any val = visitTestlist(ctx->testlist()); + std::vector *val_ptr = std::any_cast>(&val); + if (val_ptr) return FlowType(RETURN, *val_ptr); + std::vector tmp; + tmp.push_back(val); + return FlowType(RETURN, tmp); } std::any EvalVisitor::visitCompound_stmt( @@ -332,15 +336,15 @@ 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; + // 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; } std::string func_name = ctx->atom()->NAME()->getText(); diff --git a/src/names.cpp b/src/names.cpp index 06c1210..cfea34f 100644 --- a/src/names.cpp +++ b/src/names.cpp @@ -52,7 +52,7 @@ std::any FucntionContainer::CallFunction( if (name == "print") { bool is_first = true; for (int i = 0; i < args.size(); i++) { - if (is_first) std::cout << ' '; + if (!is_first) std::cout << ' '; is_first = false; std::string buf = Any2String(args[i].value); std::cout << buf; @@ -125,10 +125,13 @@ std::any FucntionContainer::CallFunction( std::any res = vis.visit(func.code_address); Variables.DestroyFrame(); FlowType *flow = std::any_cast(&res); - if(!flow) - { - if(flow->ReturnValueLists.size()==1) return flow->ReturnValueLists[0]; - else return flow->ReturnValueLists; + if (!flow) { + if (flow->ReturnValueLists.size() == 0) + return NoneType(); + else if (flow->ReturnValueLists.size() == 1) + return flow->ReturnValueLists[0]; + else + return flow->ReturnValueLists; } return NoneType(); } \ No newline at end of file diff --git a/src/utils.cpp b/src/utils.cpp index 3ec51d1..7b1a776 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -61,9 +61,11 @@ std::string Any2String(const std::any &value) { buf << *ptr; else if (auto ptr = std::any_cast(&value)) buf << *ptr; + else if (auto ptr = std::any_cast(&value)) + buf << "None"; else throw FatalError("Any2String: unknown type"); - buf >> res; + std::getline(buf, res); return res; }