From 6d6b1b9a020dc91b7aed762dd3e6c1c83a2eefb9 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Thu, 9 Nov 2023 10:59:39 +0800 Subject: [PATCH] upd: tools almost done --- include/names.h | 16 ---------------- include/utils.h | 30 ++++++++++++++++++++++++++++++ src/Evalvisitor.cpp | 30 +++++++++++++++++++++++++++++- src/names.cpp | 15 +++++++++++++++ src/utils.cpp | 15 +++++++++++++++ 5 files changed, 89 insertions(+), 17 deletions(-) diff --git a/include/names.h b/include/names.h index 2c4f937..57c6531 100644 --- a/include/names.h +++ b/include/names.h @@ -8,20 +8,4 @@ #include #include "utils.h" - -class FucntionContainer { - struct FunctionItem { - ; - }; -}; -class VariableContainer { - std::unordered_map GlobalScope; - std::stack> StackScopes; - - public: - void CreateFrame(); - void DestroyFrame(); - std::any ReadVariable(const std::string &name); - void WriteVariable(const std::string &name, const std::any &value); -}; #endif \ No newline at end of file diff --git a/include/utils.h b/include/utils.h index 923d3f1..915a013 100644 --- a/include/utils.h +++ b/include/utils.h @@ -8,6 +8,7 @@ #include #include +#include "Python3ParserBaseVisitor.h" #include "int2048/int2048.h" class InterpretException : public std::exception { public: @@ -54,4 +55,33 @@ struct RawVarible { RawVarible() {} RawVarible(const std::string &name) : name(name) {} }; +struct ParaArguItemType { + std::string name; + std::any value; + ParaArguItemType() {} + ParaArguItemType(const std::string &name) : name(name) {} + ParaArguItemType(const std::string &name, const std::any &value) + : name(name), value(value) {} +}; +struct FunctionItem { + Python3Parser::SuiteContext *code_address; + std::vector para_list; +}; +class FucntionContainer { + std::unordered_map FunctionIndex; + public: + void AddFunction(const std::string &name, const FunctionItem &item); + std::any CallFunction(const std::string &name, const std::vector &args); +}; +class VariableContainer { + std::unordered_map GlobalScope; + std::stack> StackScopes; + + public: + void CreateFrame(); + void DestroyFrame(); + std::any ReadVariable(const std::string &name); + void WriteVariable(const std::string &name, const std::any &value); +}; +std::any DeQuate(std::any val,VariableContainer &Variables); #endif \ No newline at end of file diff --git a/src/Evalvisitor.cpp b/src/Evalvisitor.cpp index dd18219..0174bcb 100644 --- a/src/Evalvisitor.cpp +++ b/src/Evalvisitor.cpp @@ -16,40 +16,48 @@ std::any EvalVisitor::visitFile_input(Python3Parser::File_inputContext *ctx) { } std::any EvalVisitor::visitFuncdef(Python3Parser::FuncdefContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitParameters(Python3Parser::ParametersContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitTypedargslist( Python3Parser::TypedargslistContext *ctx) { + // TODO return visitChildren(ctx); } 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); } std::any EvalVisitor::visitExpr_stmt(Python3Parser::Expr_stmtContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitAugassign(Python3Parser::AugassignContext *ctx) { - return visitChildren(ctx); + throw FatalError("Function visitAugassign Shouldn't be called"); } std::any EvalVisitor::visitFlow_stmt(Python3Parser::Flow_stmtContext *ctx) { @@ -72,63 +80,78 @@ std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) { std::any EvalVisitor::visitCompound_stmt( Python3Parser::Compound_stmtContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitIf_stmt(Python3Parser::If_stmtContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitWhile_stmt(Python3Parser::While_stmtContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitSuite(Python3Parser::SuiteContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitTest(Python3Parser::TestContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitOr_test(Python3Parser::Or_testContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitAnd_test(Python3Parser::And_testContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitNot_test(Python3Parser::Not_testContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitComparison(Python3Parser::ComparisonContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitComp_op(Python3Parser::Comp_opContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitArith_expr(Python3Parser::Arith_exprContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitAddorsub_op(Python3Parser::Addorsub_opContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitTerm(Python3Parser::TermContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitMuldivmod_op( Python3Parser::Muldivmod_opContext *ctx) { + // TODO return visitChildren(ctx); } std::any EvalVisitor::visitFactor(Python3Parser::FactorContext *ctx) { + // TODO return visitChildren(ctx); } @@ -147,9 +170,11 @@ std::any EvalVisitor::visitAtom_expr(Python3Parser::Atom_exprContext *ctx) { return val; } throw FatalError("Not implemented in function visitAtom_expr: function call"); + // TODO } std::any EvalVisitor::visitTrailer(Python3Parser::TrailerContext *ctx) { + // TODO return visitChildren(ctx); } @@ -183,13 +208,16 @@ std::any EvalVisitor::visitAtom(Python3Parser::AtomContext *ctx) { } 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); } \ No newline at end of file diff --git a/src/names.cpp b/src/names.cpp index 7f0cd14..1cbc786 100644 --- a/src/names.cpp +++ b/src/names.cpp @@ -33,4 +33,19 @@ void VariableContainer::WriteVariable(const std::string &name, return; } top[name] = value; +} +void FucntionContainer::AddFunction(const std::string &name, + const FunctionItem &item) { + if (FunctionIndex.find(name) != FunctionIndex.end()) { + throw InterpretException("AddFunction: function already exists"); + } + FunctionIndex[name] = item; +} + +std::any FucntionContainer::CallFunction( + const std::string &name, const std::vector &args) { + if (FunctionIndex.find(name) == FunctionIndex.end()) { + throw InterpretException("CallFunction: function not found"); + } + // TODO } \ No newline at end of file diff --git a/src/utils.cpp b/src/utils.cpp index 239c85e..76acb73 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -78,4 +78,19 @@ bool Any2Bool(const std::any &value) { return (*ptr) != ""; } else throw FatalError("Any2Bool: unknown type"); +} + +std::any DeQuate(std::any val, VariableContainer &Variables) { + if (auto ptr = std::any_cast>(&val)) { + for (int i = 0; i < ptr->size(); i++) + (*ptr)[i] = DeQuate((*ptr)[i], Variables); + return *ptr; + } else if (auto ptr = std::any_cast(&val)) { + return Variables.ReadVariable(ptr->name); + } else if (std::any_cast(&val) || std::any_cast(&val) || + std::any_cast(&val) || std::any_cast(&val) || + std::any_cast(&val)) + return val; + else + throw FatalError("DeQuate: unknown type"); } \ No newline at end of file