fix: bug in Any2String

This commit is contained in:
2023-11-09 18:17:20 +08:00
parent 5ad5615586
commit 9b8b23e738
4 changed files with 28 additions and 19 deletions

View File

@ -2,7 +2,7 @@
cmake_minimum_required(VERSION 3.15.2) cmake_minimum_required(VERSION 3.15.2)
project(python_interpreter) project(python_interpreter)
set(CMAKE_CXX_STANDARD 17) 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(/usr/include/antlr4-runtime/)
include_directories( include_directories(

View File

@ -176,9 +176,13 @@ std::any EvalVisitor::visitContinue_stmt(
} }
std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) { std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) {
// TODO if (!ctx->testlist()) return FlowType(RETURN, std::vector<std::any>());
throw FatalError("Not implemented in function visitReturn_stmt"); std::any val = visitTestlist(ctx->testlist());
return visitChildren(ctx); std::vector<std::any> *val_ptr = std::any_cast<std::vector<std::any>>(&val);
if (val_ptr) return FlowType(RETURN, *val_ptr);
std::vector<std::any> tmp;
tmp.push_back(val);
return FlowType(RETURN, tmp);
} }
std::any EvalVisitor::visitCompound_stmt( 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) { std::any EvalVisitor::visitAtom_expr(Python3Parser::Atom_exprContext *ctx) {
if (!ctx->trailer()) { if (!ctx->trailer()) {
auto val = visitAtom(ctx->atom()); auto val = visitAtom(ctx->atom());
std::cerr << "[Log] In func visitAtom_expr. The Atom returns : "; // std::cerr << "[Log] In func visitAtom_expr. The Atom returns : ";
if (auto ptr = std::any_cast<NoneType>(&val)) { // if (auto ptr = std::any_cast<NoneType>(&val)) {
std::cerr << "NoneType" << std::endl; // std::cerr << "NoneType" << std::endl;
} else if (auto ptr = std::any_cast<RawVarible>(&val)) { // } else if (auto ptr = std::any_cast<RawVarible>(&val)) {
std::cerr << "Variable Name=" << ptr->name // std::cerr << "Variable Name=" << ptr->name
<< " val=" << Any2String(Variables.ReadVariable(ptr->name)) // << " val=" << Any2String(Variables.ReadVariable(ptr->name))
<< std::endl; // << std::endl;
} else // } else
std::cerr << Any2String(val) << std::endl; // std::cerr << Any2String(val) << std::endl;
return val; return val;
} }
std::string func_name = ctx->atom()->NAME()->getText(); std::string func_name = ctx->atom()->NAME()->getText();

View File

@ -52,7 +52,7 @@ std::any FucntionContainer::CallFunction(
if (name == "print") { if (name == "print") {
bool is_first = true; bool is_first = true;
for (int i = 0; i < args.size(); i++) { for (int i = 0; i < args.size(); i++) {
if (is_first) std::cout << ' '; if (!is_first) std::cout << ' ';
is_first = false; is_first = false;
std::string buf = Any2String(args[i].value); std::string buf = Any2String(args[i].value);
std::cout << buf; std::cout << buf;
@ -125,10 +125,13 @@ std::any FucntionContainer::CallFunction(
std::any res = vis.visit(func.code_address); std::any res = vis.visit(func.code_address);
Variables.DestroyFrame(); Variables.DestroyFrame();
FlowType *flow = std::any_cast<FlowType>(&res); FlowType *flow = std::any_cast<FlowType>(&res);
if(!flow) if (!flow) {
{ if (flow->ReturnValueLists.size() == 0)
if(flow->ReturnValueLists.size()==1) return flow->ReturnValueLists[0]; return NoneType();
else return flow->ReturnValueLists; else if (flow->ReturnValueLists.size() == 1)
return flow->ReturnValueLists[0];
else
return flow->ReturnValueLists;
} }
return NoneType(); return NoneType();
} }

View File

@ -61,9 +61,11 @@ std::string Any2String(const std::any &value) {
buf << *ptr; buf << *ptr;
else if (auto ptr = std::any_cast<std::string>(&value)) else if (auto ptr = std::any_cast<std::string>(&value))
buf << *ptr; buf << *ptr;
else if (auto ptr = std::any_cast<NoneType>(&value))
buf << "None";
else else
throw FatalError("Any2String: unknown type"); throw FatalError("Any2String: unknown type");
buf >> res; std::getline(buf, res);
return res; return res;
} }