Merge branch 'exp2' of gitee.com:xsu1989/sysy into exp2

main
Su Xing 3 years ago
commit db1411ded7

@ -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机制

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

@ -1,28 +0,0 @@
#include <algorithm>
#include <iostream>
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;
// }

@ -4,6 +4,8 @@
#include "SysYParser.h"
#include <ostream>
namespace sysy {
class SysYFormatter : public SysYBaseVisitor {
protected:
std::ostream &os;
@ -331,4 +333,6 @@ public:
interleave(ctx->exp(), ", ");
return 0;
}
};
};
} // namespace sysy

@ -1,10 +1,10 @@
#pragma once
#include <memory>
#include "IR.h"
#include "IRBuilder.h"
#include "SysYBaseVisitor.h"
#include "SysYParser.h"
#include <memory>
namespace sysy {

@ -4,10 +4,12 @@
#include <fstream>
#include <iostream>
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;
}
Loading…
Cancel
Save