diff --git a/README.md b/README.md index 9cd5671..ded64b6 100644 --- a/README.md +++ b/README.md @@ -52,3 +52,16 @@ cat /test/funcrparams.sysy - 参照SysY语言规范,修改`src/SysY.g4`文件,实现SysY词法/语法的完整定义 - 修改任意代码后需要重新执行`cmake --build build`命令重新构建项目,ANTLR工具会从`SysY.g4`生成词法/语法分析器,生成的文件位于`./build/src`目录 - (进阶内容)修改`src/ASTPrinter.h`与`src/ASTPrinter.cpp`,实现从AST输出源程序,但输出的源程序是经过格式化的,测试用例为`test/format-test.sy`,格式化后的参考结果为`test/format-ref.sy` + +## 实验2:从AST生成中间表示 + +exp2分支为大家准备好了进行实验2的基本代码框架,包括 + +- IR相关数据结构的定义:`src/IR.h` +- 创建IR对象的工具类`src/IRBuilder.h` +- IR生成器的示例代码`src/SysYIRGenerator.h` + +在实验2中,同学们需要完成的任务包括 + +- 熟悉掌握IR定义与相关数据结构 +- 从AST生成IR(基于visitor机制) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8028acb..856a640 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,7 +5,6 @@ antlr_target(SysYGen SysY.g4 LEXER PARSER OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} VISITOR - LISTENER ) add_library(SysYParser SHARED ${ANTLR_SysYGen_CXX_OUTPUTS}) @@ -14,7 +13,6 @@ target_link_libraries(SysYParser PUBLIC antlr4_shared) add_executable(sysyc sysyc.cpp - SysYFormatter.cpp IR.cpp SysYIRGenerator.cpp ) diff --git a/src/SysYFormatter.cpp b/src/SysYFormatter.cpp deleted file mode 100644 index 145b4e8..0000000 --- a/src/SysYFormatter.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -using namespace std; -#include "SysYParser.h" -#include "SysYFormatter.h" - -// any ASTPrinter::visitNumber(SysYParser::NumberContext *ctx) { -// cout << ctx->IntConst()->getText(); -// return nullptr; -// } - -// any ASTPrinter::visitString(SysYParser::StringContext *ctx) { -// cout << ctx->String()->getText(); -// return nullptr; -// } - -// any ASTPrinter::visitFuncRParams(SysYParser::FuncRParamsContext *ctx) { -// if (ctx->funcRParam().empty()) -// return nullptr; -// auto numParams = ctx->funcRParam().size(); -// ctx->funcRParam(0)->accept(this); -// for (int i = 1; i < numParams; ++i) { -// cout << ", "; -// ctx->funcRParam(i)->accept(this); -// } -// cout << '\n'; -// return nullptr; -// } diff --git a/src/SysYFormatter.h b/src/SysYFormatter.h index ac6192b..fdaf615 100644 --- a/src/SysYFormatter.h +++ b/src/SysYFormatter.h @@ -4,6 +4,8 @@ #include "SysYParser.h" #include +namespace sysy { + class SysYFormatter : public SysYBaseVisitor { protected: std::ostream &os; @@ -331,4 +333,6 @@ public: interleave(ctx->exp(), ", "); return 0; } -}; \ No newline at end of file +}; + +} // namespace sysy diff --git a/src/SysYIRGenerator.h b/src/SysYIRGenerator.h index ba65fe4..3ea51ef 100644 --- a/src/SysYIRGenerator.h +++ b/src/SysYIRGenerator.h @@ -1,10 +1,10 @@ #pragma once +#include #include "IR.h" #include "IRBuilder.h" #include "SysYBaseVisitor.h" #include "SysYParser.h" -#include namespace sysy { diff --git a/src/sysyc.cpp b/src/sysyc.cpp index 4c2d1f3..a6bb042 100644 --- a/src/sysyc.cpp +++ b/src/sysyc.cpp @@ -4,10 +4,12 @@ #include #include using namespace std; -using namespace antlr4; -#include "SysYFormatter.h" #include "SysYLexer.h" #include "SysYParser.h" +using namespace antlr4; +#include "SysYFormatter.h" +#include "SysYIRGenerator.h" +using namespace sysy; int main(int argc, char **argv) { if (argc != 2) { @@ -24,12 +26,9 @@ int main(int argc, char **argv) { CommonTokenStream tokens(&lexer); SysYParser parser(&tokens); auto module = parser.module(); - // tree::ParseTreeWalker walker; - // SysYASTPrinter printer(cout); - // cout << module->getText() << '\n'; - // walker.walk(&printer, module); - SysYFormatter formatter(cout); - formatter.visitModule(module); + + SysYIRGenerator generator; + generator.visitModule(module); return EXIT_SUCCESS; } \ No newline at end of file