diff --git a/CMakeLists.txt b/CMakeLists.txt index 043d902..01009d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ link_directories(${PROJECT_SOURCE_DIR}/src) add_executable(code ${main_src}) # Add all *.cpp file after src/main.cpp, like src/Evalvisitor.cpp did target_include_directories(code PRIVATE ${PROJECT_SOURCE_DIR}/libs) +target_precompile_headers(code PUBLIC ${PROJECT_SOURCE_DIR}/libs/clipp/clipp.h ${PROJECT_SOURCE_DIR}/libs/json/json.hpp) target_link_directories(code PRIVATE ${PROJECT_SOURCE_DIR}/libs/int2048) target_link_libraries(code int2048) diff --git a/include/Evalvisitor.h b/include/Evalvisitor.h index 64ddeeb..6a1d095 100644 --- a/include/Evalvisitor.h +++ b/include/Evalvisitor.h @@ -2,13 +2,47 @@ #ifndef PYTHON_INTERPRETER_EVALVISITOR_H #define PYTHON_INTERPRETER_EVALVISITOR_H - #include "Python3ParserBaseVisitor.h" +#include "int2048/int2048.h" - -class EvalVisitor : public Python3ParserBaseVisitor { - // TODO: override all methods of Python3ParserBaseVisitor +class EvalVisitor : public Python3ParserBaseVisitor +{ + // TODO: override all methods of Python3ParserBaseVisitor + std::any visitFile_input(Python3Parser::File_inputContext *ctx) override; + std::any visitFuncdef(Python3Parser::FuncdefContext *ctx) override; + std::any visitParameters(Python3Parser::ParametersContext *ctx) override; + std::any visitTypedargslist(Python3Parser::TypedargslistContext *ctx) override; + std::any visitTfpdef(Python3Parser::TfpdefContext *ctx) override; + std::any visitStmt(Python3Parser::StmtContext *ctx) override; + std::any visitSimple_stmt(Python3Parser::Simple_stmtContext *ctx) override; + std::any visitSmall_stmt(Python3Parser::Small_stmtContext *ctx) override; + std::any visitExpr_stmt(Python3Parser::Expr_stmtContext *ctx) override; + std::any visitAugassign(Python3Parser::AugassignContext *ctx) override; + std::any visitFlow_stmt(Python3Parser::Flow_stmtContext *ctx) override; + std::any visitBreak_stmt(Python3Parser::Break_stmtContext *ctx) override; + std::any visitContinue_stmt(Python3Parser::Continue_stmtContext *ctx) override; + std::any visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) override; + std::any visitCompound_stmt(Python3Parser::Compound_stmtContext *ctx) override; + std::any visitIf_stmt(Python3Parser::If_stmtContext *ctx) override; + std::any visitWhile_stmt(Python3Parser::While_stmtContext *ctx) override; + std::any visitSuite(Python3Parser::SuiteContext *ctx) override; + std::any visitTest(Python3Parser::TestContext *ctx) override; + std::any visitOr_test(Python3Parser::Or_testContext *ctx) override; + std::any visitAnd_test(Python3Parser::And_testContext *ctx) override; + std::any visitNot_test(Python3Parser::Not_testContext *ctx) override; + std::any visitComparison(Python3Parser::ComparisonContext *ctx) override; + std::any visitComp_op(Python3Parser::Comp_opContext *ctx) override; + std::any visitArith_expr(Python3Parser::Arith_exprContext *ctx) override; + std::any visitAddorsub_op(Python3Parser::Addorsub_opContext *ctx) override; + std::any visitTerm(Python3Parser::TermContext *ctx) override; + std::any visitMuldivmod_op(Python3Parser::Muldivmod_opContext *ctx) override; + std::any visitFactor(Python3Parser::FactorContext *ctx) override; + std::any visitAtom_expr(Python3Parser::Atom_exprContext *ctx) override; + std::any visitTrailer(Python3Parser::TrailerContext *ctx) override; + std::any visitAtom(Python3Parser::AtomContext *ctx) override; + std::any visitTestlist(Python3Parser::TestlistContext *ctx) override; + std::any visitArglist(Python3Parser::ArglistContext *ctx) override; + std::any visitArgument(Python3Parser::ArgumentContext *ctx) override; }; - -#endif//PYTHON_INTERPRETER_EVALVISITOR_H +#endif // PYTHON_INTERPRETER_EVALVISITOR_H diff --git a/src/Evalvisitor.cpp b/src/Evalvisitor.cpp index 9c8f1cd..06de27e 100644 --- a/src/Evalvisitor.cpp +++ b/src/Evalvisitor.cpp @@ -1,2 +1,177 @@ #include "Evalvisitor.h" -#include "int2048/int2048.h" \ No newline at end of file +#include "int2048/int2048.h" + +std::any EvalVisitor::visitFile_input(Python3Parser::File_inputContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitFuncdef(Python3Parser::FuncdefContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitParameters(Python3Parser::ParametersContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitTypedargslist(Python3Parser::TypedargslistContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitTfpdef(Python3Parser::TfpdefContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitStmt(Python3Parser::StmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitSimple_stmt(Python3Parser::Simple_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitSmall_stmt(Python3Parser::Small_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitExpr_stmt(Python3Parser::Expr_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitAugassign(Python3Parser::AugassignContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitFlow_stmt(Python3Parser::Flow_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitBreak_stmt(Python3Parser::Break_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitContinue_stmt(Python3Parser::Continue_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitReturn_stmt(Python3Parser::Return_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitCompound_stmt(Python3Parser::Compound_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitIf_stmt(Python3Parser::If_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitWhile_stmt(Python3Parser::While_stmtContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitSuite(Python3Parser::SuiteContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitTest(Python3Parser::TestContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitOr_test(Python3Parser::Or_testContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitAnd_test(Python3Parser::And_testContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitNot_test(Python3Parser::Not_testContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitComparison(Python3Parser::ComparisonContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitComp_op(Python3Parser::Comp_opContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitArith_expr(Python3Parser::Arith_exprContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitAddorsub_op(Python3Parser::Addorsub_opContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitTerm(Python3Parser::TermContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitMuldivmod_op(Python3Parser::Muldivmod_opContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitFactor(Python3Parser::FactorContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitAtom_expr(Python3Parser::Atom_exprContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitTrailer(Python3Parser::TrailerContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitAtom(Python3Parser::AtomContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitTestlist(Python3Parser::TestlistContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitArglist(Python3Parser::ArglistContext *ctx) +{ + return visitChildren(ctx); +} + +std::any EvalVisitor::visitArgument(Python3Parser::ArgumentContext *ctx) +{ + return visitChildren(ctx); +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 68c5af9..69b1995 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,18 +4,42 @@ #include "antlr4-runtime.h" #include #include "int2048/int2048.h" +#include "clipp/clipp.h" using namespace antlr4; // TODO: regenerating files in directory named "generated" is dangerous. // if you really need to regenerate,please ask TA for help. -int main(int argc, const char *argv[]) { - // TODO: please don't modify the code below the construction of ifs if you want to use visitor mode - ANTLRInputStream input(std::cin); - Python3Lexer lexer(&input); - CommonTokenStream tokens(&lexer); - tokens.fill(); - Python3Parser parser(&tokens); - tree::ParseTree *tree = parser.file_input(); - EvalVisitor visitor; - visitor.visit(tree); - return 0; +int main(int argc, char *argv[]) +{ + // TODO: please don't modify the code below the construction of ifs if you want to use visitor mode + std::string input_file; + bool need_help = false; + auto cli = (clipp::option("-h", "--help").set(need_help).doc("show help") | + clipp::opt_value("input file", input_file)); + if (!clipp::parse(argc, argv, cli)) + { + std::cout << clipp::make_man_page(cli, argv[0]); + return 0; + } + if (need_help) + { + std::cout << clipp::make_man_page(cli, argv[0]); + return 0; + } + ANTLRInputStream *input_p; + if (input_file.length() == 0) + input_p = new ANTLRInputStream(std::cin); + else + { + std::ifstream ifs(input_file); + input_p = new ANTLRInputStream(ifs); + } + Python3Lexer lexer(input_p); + CommonTokenStream tokens(&lexer); + tokens.fill(); + Python3Parser parser(&tokens); + tree::ParseTree *tree = parser.file_input(); + EvalVisitor visitor; + visitor.visit(tree); + delete input_p; + return 0; } \ No newline at end of file