upd: main struct established
This commit is contained in:
@ -66,6 +66,10 @@ struct ParaArguItemType {
|
|||||||
struct FunctionItem {
|
struct FunctionItem {
|
||||||
Python3Parser::SuiteContext *code_address;
|
Python3Parser::SuiteContext *code_address;
|
||||||
std::vector<ParaArguItemType> para_list;
|
std::vector<ParaArguItemType> para_list;
|
||||||
|
FunctionItem() {}
|
||||||
|
FunctionItem(Python3Parser::SuiteContext *code_address,
|
||||||
|
const std::vector<ParaArguItemType> ¶_list)
|
||||||
|
: code_address(code_address), para_list(para_list) {}
|
||||||
};
|
};
|
||||||
class FucntionContainer {
|
class FucntionContainer {
|
||||||
std::unordered_map<std::string, FunctionItem> FunctionIndex;
|
std::unordered_map<std::string, FunctionItem> FunctionIndex;
|
||||||
@ -84,4 +88,28 @@ class VariableContainer {
|
|||||||
void WriteVariable(const std::string &name, const std::any &value);
|
void WriteVariable(const std::string &name, const std::any &value);
|
||||||
};
|
};
|
||||||
std::any DeQuate(std::any val,VariableContainer &Variables);
|
std::any DeQuate(std::any val,VariableContainer &Variables);
|
||||||
|
|
||||||
|
std::any Add(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfAdd(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Sub(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfSub(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Mul(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfMul(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Div(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfDiv(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Mod(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfMod(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Neg(const std::any &a);
|
||||||
|
|
||||||
|
bool Greater(const std::any &a, const std::any &b);
|
||||||
|
bool Less(const std::any &a, const std::any &b);
|
||||||
|
bool Equal(const std::any &a, const std::any &b);
|
||||||
|
bool NotEqual(const std::any &a, const std::any &b);
|
||||||
|
bool GreaterEqual(const std::any &a, const std::any &b);
|
||||||
|
bool LessEqual(const std::any &a, const std::any &b);
|
||||||
#endif
|
#endif
|
@ -16,38 +16,50 @@ std::any EvalVisitor::visitFile_input(Python3Parser::File_inputContext *ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitFuncdef(Python3Parser::FuncdefContext *ctx) {
|
std::any EvalVisitor::visitFuncdef(Python3Parser::FuncdefContext *ctx) {
|
||||||
// TODO
|
std::vector<ParaArguItemType> paraVec =
|
||||||
return visitChildren(ctx);
|
std::any_cast<std::vector<ParaArguItemType>>(
|
||||||
|
visitParameters(ctx->parameters()));
|
||||||
|
std::string name = ctx->NAME()->getText();
|
||||||
|
Functions.AddFunction(name, FunctionItem(ctx->suite(), paraVec));
|
||||||
|
return NoneType();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitParameters(Python3Parser::ParametersContext *ctx) {
|
std::any EvalVisitor::visitParameters(Python3Parser::ParametersContext *ctx) {
|
||||||
// TODO
|
if (!ctx->typedargslist())
|
||||||
return visitChildren(ctx);
|
return std::vector<ParaArguItemType>();
|
||||||
|
else
|
||||||
|
return visitTypedargslist(ctx->typedargslist());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitTypedargslist(
|
std::any EvalVisitor::visitTypedargslist(
|
||||||
Python3Parser::TypedargslistContext *ctx) {
|
Python3Parser::TypedargslistContext *ctx) {
|
||||||
// TODO
|
auto tfpdef_list = ctx->tfpdef();
|
||||||
return visitChildren(ctx);
|
auto default_value_list = ctx->test();
|
||||||
|
const int lenght_delta = tfpdef_list.size() - default_value_list.size();
|
||||||
|
std::vector<ParaArguItemType> res;
|
||||||
|
res.reserve(tfpdef_list.size());
|
||||||
|
for (int i = 0; i < lenght_delta; i++)
|
||||||
|
res.emplace_back(tfpdef_list[i]->NAME()->getText(), nullptr);
|
||||||
|
for (int i = lenght_delta; i < tfpdef_list.size(); i++)
|
||||||
|
res.emplace_back(tfpdef_list[i]->NAME()->getText(),
|
||||||
|
DeQuate(visitTest(default_value_list[i - lenght_delta]),
|
||||||
|
Variables));
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitTfpdef(Python3Parser::TfpdefContext *ctx) {
|
std::any EvalVisitor::visitTfpdef(Python3Parser::TfpdefContext *ctx) {
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitStmt(Python3Parser::StmtContext *ctx) {
|
std::any EvalVisitor::visitStmt(Python3Parser::StmtContext *ctx) {
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitSimple_stmt(Python3Parser::Simple_stmtContext *ctx) {
|
std::any EvalVisitor::visitSimple_stmt(Python3Parser::Simple_stmtContext *ctx) {
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitSmall_stmt(Python3Parser::Small_stmtContext *ctx) {
|
std::any EvalVisitor::visitSmall_stmt(Python3Parser::Small_stmtContext *ctx) {
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,6 +86,7 @@ std::any EvalVisitor::visitContinue_stmt(
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) {
|
std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) {
|
||||||
|
// TODO
|
||||||
throw FatalError("Not implemented in function visitReturn_stmt");
|
throw FatalError("Not implemented in function visitReturn_stmt");
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
@ -98,7 +111,10 @@ std::any EvalVisitor::visitSuite(Python3Parser::SuiteContext *ctx) {
|
|||||||
// TODO
|
// TODO
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
|
std::any EvalVisitor::visitTestlist(Python3Parser::TestlistContext *ctx) {
|
||||||
|
// TODO
|
||||||
|
return visitChildren(ctx);
|
||||||
|
}
|
||||||
std::any EvalVisitor::visitTest(Python3Parser::TestContext *ctx) {
|
std::any EvalVisitor::visitTest(Python3Parser::TestContext *ctx) {
|
||||||
// TODO
|
// TODO
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
@ -169,15 +185,37 @@ std::any EvalVisitor::visitAtom_expr(Python3Parser::Atom_exprContext *ctx) {
|
|||||||
std::cerr << Any2String(val) << std::endl;
|
std::cerr << Any2String(val) << std::endl;
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
throw FatalError("Not implemented in function visitAtom_expr: function call");
|
std::string func_name = ctx->atom()->NAME()->getText();
|
||||||
// TODO
|
std::vector<ParaArguItemType> args =
|
||||||
|
std::any_cast<std::vector<ParaArguItemType>>(
|
||||||
|
visitTrailer(ctx->trailer()));
|
||||||
|
return Functions.CallFunction(func_name, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::any EvalVisitor::visitTrailer(Python3Parser::TrailerContext *ctx) {
|
std::any EvalVisitor::visitTrailer(Python3Parser::TrailerContext *ctx) {
|
||||||
// TODO
|
if (!ctx->arglist()) return std::vector<ParaArguItemType>();
|
||||||
return visitChildren(ctx);
|
return visitArglist(ctx->arglist());
|
||||||
|
}
|
||||||
|
std::any EvalVisitor::visitArglist(Python3Parser::ArglistContext *ctx) {
|
||||||
|
auto argument_list = ctx->argument();
|
||||||
|
std::vector<ParaArguItemType> resolved_args;
|
||||||
|
for (auto item : argument_list) {
|
||||||
|
resolved_args.push_back(
|
||||||
|
std::any_cast<ParaArguItemType>(visitArgument(item)));
|
||||||
|
}
|
||||||
|
return resolved_args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::any EvalVisitor::visitArgument(Python3Parser::ArgumentContext *ctx) {
|
||||||
|
auto arg_list = ctx->test();
|
||||||
|
if (arg_list.size() != 1 && arg_list.size() != 2)
|
||||||
|
throw FatalError("visitArgument: arg_list.size()!=1&&arg_list!=2");
|
||||||
|
if (arg_list.size() == 1)
|
||||||
|
return ParaArguItemType("", DeQuate(visitTest(arg_list[0]), Variables));
|
||||||
|
else
|
||||||
|
return ParaArguItemType(arg_list[0]->getText(),
|
||||||
|
DeQuate(visitTest(arg_list[1]), Variables));
|
||||||
|
}
|
||||||
std::any EvalVisitor::visitAtom(Python3Parser::AtomContext *ctx) {
|
std::any EvalVisitor::visitAtom(Python3Parser::AtomContext *ctx) {
|
||||||
if (ctx->NONE())
|
if (ctx->NONE())
|
||||||
return NoneType();
|
return NoneType();
|
||||||
@ -205,19 +243,4 @@ std::any EvalVisitor::visitAtom(Python3Parser::AtomContext *ctx) {
|
|||||||
// std::cerr<<"[Log] The string is : "<<res<<std::endl;
|
// std::cerr<<"[Log] The string is : "<<res<<std::endl;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
std::any EvalVisitor::visitTestlist(Python3Parser::TestlistContext *ctx) {
|
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::any EvalVisitor::visitArglist(Python3Parser::ArglistContext *ctx) {
|
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::any EvalVisitor::visitArgument(Python3Parser::ArgumentContext *ctx) {
|
|
||||||
// TODO
|
|
||||||
return visitChildren(ctx);
|
|
||||||
}
|
}
|
@ -93,4 +93,28 @@ std::any DeQuate(std::any val, VariableContainer &Variables) {
|
|||||||
return val;
|
return val;
|
||||||
else
|
else
|
||||||
throw FatalError("DeQuate: unknown type");
|
throw FatalError("DeQuate: unknown type");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::any Add(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfAdd(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Sub(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfSub(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Mul(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfMul(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Div(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfDiv(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Mod(const std::any &a, const std::any &b);
|
||||||
|
std::any& SelfMod(std::any &a, const std::any &b);
|
||||||
|
|
||||||
|
std::any Neg(const std::any &a);
|
||||||
|
|
||||||
|
bool Greater(const std::any &a, const std::any &b);
|
||||||
|
bool Less(const std::any &a, const std::any &b);
|
||||||
|
bool Equal(const std::any &a, const std::any &b);
|
||||||
|
bool NotEqual(const std::any &a, const std::any &b);
|
||||||
|
bool GreaterEqual(const std::any &a, const std::any &b);
|
||||||
|
bool LessEqual(const std::any &a, const std::any &b);
|
Reference in New Issue
Block a user