upd: tools almost done

This commit is contained in:
2023-11-09 10:59:39 +08:00
parent b737eb8e7d
commit 6d6b1b9a02
5 changed files with 89 additions and 17 deletions

View File

@ -8,20 +8,4 @@
#include <vector>
#include "utils.h"
class FucntionContainer {
struct FunctionItem {
;
};
};
class VariableContainer {
std::unordered_map<std::string, std::any> GlobalScope;
std::stack<std::unordered_map<std::string, std::any>> StackScopes;
public:
void CreateFrame();
void DestroyFrame();
std::any ReadVariable(const std::string &name);
void WriteVariable(const std::string &name, const std::any &value);
};
#endif

View File

@ -8,6 +8,7 @@
#include <string>
#include <vector>
#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<ParaArguItemType> para_list;
};
class FucntionContainer {
std::unordered_map<std::string, FunctionItem> FunctionIndex;
public:
void AddFunction(const std::string &name, const FunctionItem &item);
std::any CallFunction(const std::string &name, const std::vector<ParaArguItemType> &args);
};
class VariableContainer {
std::unordered_map<std::string, std::any> GlobalScope;
std::stack<std::unordered_map<std::string, std::any>> 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

View File

@ -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);
}

View File

@ -34,3 +34,18 @@ void VariableContainer::WriteVariable(const std::string &name,
}
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<ParaArguItemType> &args) {
if (FunctionIndex.find(name) == FunctionIndex.end()) {
throw InterpretException("CallFunction: function not found");
}
// TODO
}

View File

@ -79,3 +79,18 @@ bool Any2Bool(const std::any &value) {
} else
throw FatalError("Any2Bool: unknown type");
}
std::any DeQuate(std::any val, VariableContainer &Variables) {
if (auto ptr = std::any_cast<std::vector<std::any>>(&val)) {
for (int i = 0; i < ptr->size(); i++)
(*ptr)[i] = DeQuate((*ptr)[i], Variables);
return *ptr;
} else if (auto ptr = std::any_cast<RawVarible>(&val)) {
return Variables.ReadVariable(ptr->name);
} else if (std::any_cast<double>(&val) || std::any_cast<ZYM::int2048>(&val) ||
std::any_cast<bool>(&val) || std::any_cast<std::string>(&val) ||
std::any_cast<NoneType>(&val))
return val;
else
throw FatalError("DeQuate: unknown type");
}