fix: bug in Any2String
This commit is contained in:
@ -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(
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user