From 9245c4fae7faa05a18580cf6d8613617465b6d3a Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Mon, 5 Aug 2024 13:44:28 +0000 Subject: [PATCH] ready to design g4 --- include/semantic/semantic.h | 7 +++++-- include/semantic/visitor.h | 15 ++++++++++++++ src/semantic/CMakeLists.txt | 6 +++++- src/semantic/semantic.cpp | 15 +++++++++++++- src/semantic/visitor.cpp | 41 +++++++++++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 include/semantic/visitor.h create mode 100644 src/semantic/visitor.cpp diff --git a/include/semantic/semantic.h b/include/semantic/semantic.h index b90638d..a549e60 100644 --- a/include/semantic/semantic.h +++ b/include/semantic/semantic.h @@ -1,2 +1,5 @@ -#include -int SemanticCheck(std::istream &fin); \ No newline at end of file +#ifndef SEMANTIC_H +#define SEMANTIC_H +#include +int SemanticCheck(std::istream &fin); +#endif \ No newline at end of file diff --git a/include/semantic/visitor.h b/include/semantic/visitor.h new file mode 100644 index 0000000..b2a3129 --- /dev/null +++ b/include/semantic/visitor.h @@ -0,0 +1,15 @@ +#ifndef VISITOR_H +#define VISITOR_H +#include "MXParserVisitor.h" +class Visitor : public MXParserVisitor { + public: + virtual std::any visitMxprog(MXParser::MxprogContext *context); + virtual std::any visitFunction(MXParser::FunctionContext *context); + virtual std::any visitType(MXParser::TypeContext *context); + virtual std::any visitBlock(MXParser::BlockContext *context); + virtual std::any visitStatement(MXParser::StatementContext *context); + virtual std::any visitExpression(MXParser::ExpressionContext *context); + virtual std::any visitReturnStmt(MXParser::ReturnStmtContext *context); + virtual std::any visitIfStmt(MXParser::IfStmtContext *context); +}; +#endif \ No newline at end of file diff --git a/src/semantic/CMakeLists.txt b/src/semantic/CMakeLists.txt index 8acf900..94b9fd1 100644 --- a/src/semantic/CMakeLists.txt +++ b/src/semantic/CMakeLists.txt @@ -1,5 +1,9 @@ include_directories(/usr/include/antlr4-runtime/) include_directories(${CMAKE_SOURCE_DIR}/include/semantic) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/antlr-generated) +file(GLOB ANLTR_SOURCES "antlr-generated/*.cpp") file(GLOB SEMANTIC_SOURCES "*.cpp") +add_library(mx-antlr STATIC ${ANLTR_SOURCES}) add_library(semantic STATIC ${SEMANTIC_SOURCES}) -target_link_libraries(semantic PUBLIC antlr4-runtime) \ No newline at end of file +target_link_libraries(mx-antlr PUBLIC antlr4-runtime) +target_link_libraries(semantic PUBLIC antlr4-runtime mx-antlr) \ No newline at end of file diff --git a/src/semantic/semantic.cpp b/src/semantic/semantic.cpp index 9f7c067..530fa12 100644 --- a/src/semantic/semantic.cpp +++ b/src/semantic/semantic.cpp @@ -1,4 +1,17 @@ #include "semantic.h" +#include +#include "MXLexer.h" +#include "MXParser.h" +#include "antlr4-runtime.h" +#include "visitor.h" int SemanticCheck(std::istream &fin) { - ; + antlr4::ANTLRInputStream input(fin); + MXLexer lexer(&input); + antlr4::CommonTokenStream tokens(&lexer); + tokens.fill(); + MXParser parser(&tokens); + antlr4::tree::ParseTree *tree = parser.mxprog(); + Visitor visitor; + visitor.visit(tree); + return 0; } \ No newline at end of file diff --git a/src/semantic/visitor.cpp b/src/semantic/visitor.cpp new file mode 100644 index 0000000..42fb7c9 --- /dev/null +++ b/src/semantic/visitor.cpp @@ -0,0 +1,41 @@ +#include "visitor.h" + +std::any Visitor::visitMxprog(MXParser::MxprogContext *context) { + // 空的函数体 + return {}; +} + +std::any Visitor::visitFunction(MXParser::FunctionContext *context) { + // 空的函数体 + return {}; +} + +std::any Visitor::visitType(MXParser::TypeContext *context) { + // 空的函数体 + return {}; +} + +std::any Visitor::visitBlock(MXParser::BlockContext *context) { + // 空的函数体 + return {}; +} + +std::any Visitor::visitStatement(MXParser::StatementContext *context) { + // 空的函数体 + return {}; +} + +std::any Visitor::visitExpression(MXParser::ExpressionContext *context) { + // 空的函数体 + return {}; +} + +std::any Visitor::visitReturnStmt(MXParser::ReturnStmtContext *context) { + // 空的函数体 + return {}; +} + +std::any Visitor::visitIfStmt(MXParser::IfStmtContext *context) { + // 空的函数体 + return {}; +}