diff --git a/include/utils.h b/include/utils.h index 915a013..5c99a2b 100644 --- a/include/utils.h +++ b/include/utils.h @@ -66,6 +66,10 @@ struct ParaArguItemType { struct FunctionItem { Python3Parser::SuiteContext *code_address; std::vector para_list; + FunctionItem() {} + FunctionItem(Python3Parser::SuiteContext *code_address, + const std::vector ¶_list) + : code_address(code_address), para_list(para_list) {} }; class FucntionContainer { std::unordered_map FunctionIndex; @@ -84,4 +88,28 @@ class VariableContainer { void WriteVariable(const std::string &name, const std::any &value); }; 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 \ No newline at end of file diff --git a/src/Evalvisitor.cpp b/src/Evalvisitor.cpp index 0174bcb..4450de4 100644 --- a/src/Evalvisitor.cpp +++ b/src/Evalvisitor.cpp @@ -16,38 +16,50 @@ std::any EvalVisitor::visitFile_input(Python3Parser::File_inputContext *ctx) { } std::any EvalVisitor::visitFuncdef(Python3Parser::FuncdefContext *ctx) { - // TODO - return visitChildren(ctx); + std::vector paraVec = + std::any_cast>( + 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) { - // TODO - return visitChildren(ctx); + if (!ctx->typedargslist()) + return std::vector(); + else + return visitTypedargslist(ctx->typedargslist()); } std::any EvalVisitor::visitTypedargslist( Python3Parser::TypedargslistContext *ctx) { - // TODO - return visitChildren(ctx); + auto tfpdef_list = ctx->tfpdef(); + auto default_value_list = ctx->test(); + const int lenght_delta = tfpdef_list.size() - default_value_list.size(); + std::vector 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) { - // TODO return visitChildren(ctx); } std::any EvalVisitor::visitStmt(Python3Parser::StmtContext *ctx) { - // TODO return visitChildren(ctx); } std::any EvalVisitor::visitSimple_stmt(Python3Parser::Simple_stmtContext *ctx) { - // TODO return visitChildren(ctx); } std::any EvalVisitor::visitSmall_stmt(Python3Parser::Small_stmtContext *ctx) { - // TODO return visitChildren(ctx); } @@ -74,6 +86,7 @@ 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); } @@ -98,7 +111,10 @@ std::any EvalVisitor::visitSuite(Python3Parser::SuiteContext *ctx) { // TODO return visitChildren(ctx); } - +std::any EvalVisitor::visitTestlist(Python3Parser::TestlistContext *ctx) { + // TODO + return visitChildren(ctx); +} std::any EvalVisitor::visitTest(Python3Parser::TestContext *ctx) { // TODO return visitChildren(ctx); @@ -169,15 +185,37 @@ std::any EvalVisitor::visitAtom_expr(Python3Parser::Atom_exprContext *ctx) { std::cerr << Any2String(val) << std::endl; return val; } - throw FatalError("Not implemented in function visitAtom_expr: function call"); - // TODO + std::string func_name = ctx->atom()->NAME()->getText(); + std::vector args = + std::any_cast>( + visitTrailer(ctx->trailer())); + return Functions.CallFunction(func_name, args); } std::any EvalVisitor::visitTrailer(Python3Parser::TrailerContext *ctx) { - // TODO - return visitChildren(ctx); + if (!ctx->arglist()) return std::vector(); + return visitArglist(ctx->arglist()); +} +std::any EvalVisitor::visitArglist(Python3Parser::ArglistContext *ctx) { + auto argument_list = ctx->argument(); + std::vector resolved_args; + for (auto item : argument_list) { + resolved_args.push_back( + std::any_cast(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) { if (ctx->NONE()) return NoneType(); @@ -205,19 +243,4 @@ std::any EvalVisitor::visitAtom(Python3Parser::AtomContext *ctx) { // std::cerr<<"[Log] The string is : "<