diff --git a/README.md b/README.md index c094f57..e1ed204 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,14 @@ ## 0. 前言 本次实验分为3关,为组队实验。**本次实验请务必使用git提交**。 -本次实验的目的是让大家熟悉生成中间代码所需要的相关知识: LLVM IR、 SysY IR(LLVM IR的轻量级C++接口),并实际实现一个IR Builder。 +本次实验的目的是让大家熟悉生成中间代码所需要的相关知识: LLVM IR、 SysYF IR(LLVM IR的轻量级C++接口),并实际实现一个IR Builder。 在开始实验之前,请确保LLVM的版本不低于10.0.1,且PATH环境变量配置正确。可以通过`lli --version`命令是否可以输出10.0.1的版本信息来验证。 ### 主要工作 1. 第一部分: 了解LLVM IR。通过clang生成的.ll,了解LLVM IR与c代码的对应关系。相应文档见[phase1.md](./doc/phase1.md) -2. 第二部分: 了解SysY IR。通过助教提供的c++例子,了解SysY IR的c++接口及实现。相应文档见[phase2.md](./doc/phase2.md) -3. 第三部分: 使用SysY IR,实现一个IR Builder,使其可以通过抽象语法树生成LLVM兼容的IR代码。相应文档见[phase3.md](./doc/phase3.md) +2. 第二部分: 了解SysYF IR。通过助教提供的c++例子,了解SysYF IR的c++接口及实现。相应文档见[phase2.md](./doc/phase2.md) +3. 第三部分: 使用SysYF IR,实现一个IR Builder,使其可以通过抽象语法树生成LLVM兼容的IR代码。相应文档见[phase3.md](./doc/phase3.md) 4. 实验报告:在[report.md](./report/report.md)中撰写报告。 ## 1. 实验要求 @@ -32,19 +32,19 @@ │   ├── phase2.md │   ├── phase3.md │   ├── SysYF语言定义.pdf -| └── SysYIR.md <- SysY IR 相关文档 +| └── SysYFIR.md <- SysYF IR 相关文档 ├── report │   ├── report.md <- PW6所需提交的实验报告 │   └── contribution.md <- PW6所需提交的组员贡献(队长负责填写) ├── include <- 实验所需的头文件 │   ├── ... -│   └── SysYIR +│   └── SysYFIR ├── src │   ├── ... -│   ├── SysYIR -│   └── SysYBuilder +│   ├── SysYFIR +│   └── SysYFBuilder | ├── CMakeLists.txt -| └── SysYBuilder.cpp <- 第三部分你需要修改的文件 +| └── SysYFBuilder.cpp <- 第三部分你需要修改的文件 └── SysYF_Student ├── CMakeLists.txt ├── SysYF_Task1 @@ -88,7 +88,7 @@ * 实验部分: * 需要完成 `./SysYF_Student/SysYF_Task1/student_ll`目录下的4个文件 * 需要完成 `./SysYF_Student/SysYF_Task2/student_cpp`目录下的4个文件 - * 需要完成 `./src/SysYBuilder/SysYBuilder.cpp` + * 需要完成 `./src/SysYFBuilder/SysYFBuilder.cpp` * 需要在 `./report/report.md` 中撰写实验报告 * 实验报告内容包括: * 实验要求、问题回答、实验设计、实验难点及解决方案、实验总结、实验反馈、组间交流(具体参考[report.md](./report.md)) diff --git a/doc/SysYIR.md b/doc/SysYFIR.md similarity index 98% rename from doc/SysYIR.md rename to doc/SysYFIR.md index a7e5896..9d63f6b 100644 --- a/doc/SysYIR.md +++ b/doc/SysYFIR.md @@ -1,6 +1,6 @@ -# SysY IR +# SysYF IR -- [SysY IR](#sysy-ir) +- [SysYF IR](#sysyf-ir) - [IR](#ir) - [IR Features](#ir-features) - [IR Format](#ir-format) @@ -621,4 +621,4 @@ to make ### 总结 -助教在接口文档里筛选了可能会需要用到的接口,如果对API有问题的请移步issue讨论,本次`SysY IR`接口由助教自行设计实现,并做了大量测试,如有对助教的实现方法有异议或者建议的也请移步issue讨论,**请不要直接修改助教的代码,若因修改助教代码造成后续实验仓库合并的冲突请自行解决**。 \ No newline at end of file +助教在接口文档里筛选了可能会需要用到的接口,如果对API有问题的请移步issue讨论,本次`SysYF IR`接口由助教自行设计实现,并做了大量测试,如有对助教的实现方法有异议或者建议的也请移步issue讨论,**请不要直接修改助教的代码,若因修改助教代码造成后续实验仓库合并的冲突请自行解决**。 \ No newline at end of file diff --git a/doc/phase1.md b/doc/phase1.md index 936a44f..6512056 100644 --- a/doc/phase1.md +++ b/doc/phase1.md @@ -8,7 +8,7 @@ ### 相关知识 #### LLVM IR介绍 根据[维基百科](https://zh.wikipedia.org/zh-cn/LLVM)的介绍,LLVM是一个自由软件项目,它是一种编译器基础设施,以C++写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。IR的全称是Intermediate Representation,即中间表示。LLVM IR是一种类似于汇编的底层语言。 -LLVM IR的具体指令可以参考[Reference Manual](http://llvm.org/docs/LangRef.html)。但是你会发现其内容庞杂。虽然助教认为,高效地查阅官方文档及手册是非常必要的一项技能,但是由于其手册过于复杂,因此助教筛选了后续实验中将要用到的子集,总结为了**精简的IR Reference手册**`doc/SysYIR.md`。 +LLVM IR的具体指令可以参考[Reference Manual](http://llvm.org/docs/LangRef.html)。但是你会发现其内容庞杂。虽然助教认为,高效地查阅官方文档及手册是非常必要的一项技能,但是由于其手册过于复杂,因此助教筛选了后续实验中将要用到的子集,总结为了**精简的IR Reference手册**`doc/SysYFIR.md`。 作为一开始的参考,你可以先阅读其中`IR Features`和`IR Format`两节,后续有需要再反复参考。 #### 样例学习 diff --git a/doc/phase2.md b/doc/phase2.md index c0f140b..bc7e7a1 100644 --- a/doc/phase2.md +++ b/doc/phase2.md @@ -3,12 +3,12 @@ --- ### 任务描述 -本关任务:熟悉SysY IR接口,并根据给出的4个C程序手写C++代码调用SysY IR接口生成与sy文件功能相同的ll文件。 +本关任务:熟悉SysYF IR接口,并根据给出的4个C程序手写C++代码调用SysYF IR接口生成与sy文件功能相同的ll文件。 ### 相关知识 -#### SysY IR - LLVM IR的C++接口 -由于LLVM IR官方的C++接口的文档同样过于冗长,助教提供了SysY IR这一C++接口库。你需要阅读**SysY IR核心类的介绍**`doc/SysYIR.md`。 -本关会要求大家通过SysY IR根据AST构建生成LLVM IR。所以你需要仔细阅读文档了解其接口的设计。 +#### SysYF IR - LLVM IR的C++接口 +由于LLVM IR官方的C++接口的文档同样过于冗长,助教提供了SysYF IR这一C++接口库。你需要阅读**SysYF IR核心类的介绍**`doc/SysYFIR.md`。 +本关会要求大家通过SysYF IR根据AST构建生成LLVM IR。所以你需要仔细阅读文档了解其接口的设计。 #### 样例学习
@@ -97,11 +97,11 @@ //后略, 详细见代码文件 ```
-为了让大家更直观地感受并学会SysY IR接口的使用,助教提供了`SysYF_Student/SysYF_Task2/ta_demo/go_upstairs_gen.cpp`。 +为了让大家更直观地感受并学会SysYF IR接口的使用,助教提供了`SysYF_Student/SysYF_Task2/ta_demo/go_upstairs_gen.cpp`。 该C++程序会生成与go_upstairs.c逻辑相同的LLVM IR文件。助教提供了详尽的注释,一定要好好利用! ### 本关具体任务 -1. 你需要在`SysYF_Student/SysYF_Task2/student_cpp/`文件夹中,调用SysY IR接口,编写自己的`assign_gen.cpp`,`func_gen.cpp`,`if_gen.cpp`,`while_gen.cpp`程序,以生成与phase1的四个sy程序相同逻辑功能的ll文件。 +1. 你需要在`SysYF_Student/SysYF_Task2/student_cpp/`文件夹中,调用SysYF IR接口,编写自己的`assign_gen.cpp`,`func_gen.cpp`,`if_gen.cpp`,`while_gen.cpp`程序,以生成与phase1的四个sy程序相同逻辑功能的ll文件。 2. 在`report.md`内回答[思考题](#思考题) ### 编译、运行和验证 @@ -122,6 +122,6 @@ make ### 思考题 请在`report/report.md`中详细回答下述思考题。 -1. 请给出`SysYIR.md`中提到的两种getelementptr用法的区别, 并解释原因: +1. 请给出`SysYFIR.md`中提到的两种getelementptr用法的区别, 并解释原因: - `%2 = getelementptr [10 x i32], [10 x i32]* %1, i32 0, i32 %0` - `%2 = getelementptr i32, i32* %1, i32 %0` \ No newline at end of file diff --git a/doc/phase3.md b/doc/phase3.md index fdab0cc..5f6e8ee 100644 --- a/doc/phase3.md +++ b/doc/phase3.md @@ -3,13 +3,13 @@ --- ### 任务描述 -本关任务:编写`SysYBuilder.cpp`文件,以实现 IR 的自动生成 +本关任务:编写`SysYFBuilder.cpp`文件,以实现 IR 的自动生成 ### 相关知识 #### 实验框架 -本次实验使用了由 C++ 编写的 SysY IR 来生成 LLVM IR。为了便于大家进行实验,该框架自动完成了语法树到 C++ 上的抽象语法树的转换。 +本次实验使用了由 C++ 编写的 SysYF IR 来生成 LLVM IR。为了便于大家进行实验,该框架自动完成了语法树到 C++ 上的抽象语法树的转换。 -在`SysYBuilder.hpp`中,我们还定义了一个用于存储作用域的类`Scope`。它的作用是辅助我们在遍历语法树时,管理不同作用域中的变量。它提供了以下接口: +在`SysYFBuilder.hpp`中,我们还定义了一个用于存储作用域的类`Scope`。它的作用是辅助我们在遍历语法树时,管理不同作用域中的变量。它提供了以下接口: ```cpp // 进入一个新的作用域 void enter(); @@ -23,15 +23,15 @@ Value* find(std::string name, bool isfunc); // 判断当前是否在全局作用域内 bool in_global(); ``` -你们需要根据语义合理调用`enter`与`exit`,并且在变量声明和使用时正确调用`push`与`find`。在类`SysYfBuilder`中,有一个`Scope`类型的成员变量`scope`,它在初始化时已经将特殊函数加入了作用域中。因此,你们在进行名字查找时不需要顾虑是否需要对特殊函数进行特殊操作。 +你们需要根据语义合理调用`enter`与`exit`,并且在变量声明和使用时正确调用`push`与`find`。在类`SysYFBuilder`中,有一个`Scope`类型的成员变量`scope`,它在初始化时已经将特殊函数加入了作用域中。因此,你们在进行名字查找时不需要顾虑是否需要对特殊函数进行特殊操作。 ### 本关具体任务 -1. 你需要在`src/SysYBuilder`文件夹中,调用SysY IR接口,填写`SysYBuilder.cpp`文件,以实现 IR 的自动生成。 +1. 你需要在`src/SysYFBuilder`文件夹中,调用SysYF IR接口,填写`SysYFBuilder.cpp`文件,以实现 IR 的自动生成。 2. 在`report.md`内回答[思考题](#思考题) ### 编译、运行与验证 -#### 编译运行 SysYCompiler +#### 编译运行 SysYFCompiler ```sh mkdir build @@ -40,11 +40,11 @@ cmake .. make ``` -编译后会产生 `SysYCompiler` 程序,它能将sy文件输出为LLVM IR。 +编译后会产生 `SysYFCompiler` 程序,它能将sy文件输出为LLVM IR。 当需要对 sy 文件测试时,可以这样使用: ```sh -SysYCompiler test.sy -emit-ir -o test.ll +SysYFCompiler test.sy -emit-ir -o test.ll ``` 得到对应的ll文件。 @@ -70,7 +70,7 @@ SysYCompiler test.sy -emit-ir -o test.ll #### 多维数组 -目前给出的SysY IR接口并不支持多维数组的实现,因此你需要修改接口,以实现多维数组的声明、初始化和使用,你可以修改的内容为文件夹`include/SysYIR`,`include/SysYBuilder`,`src/SysYIR`,`src/SysYBuilder`内的所有内容 +目前给出的SysYF IR接口并不支持多维数组的实现,因此你需要修改接口,以实现多维数组的声明、初始化和使用,你可以修改的内容为文件夹`include/SysYFIR`,`include/SysYFBuilder`,`src/SysYFIR`,`src/SysYFBuilder`内的所有内容 多维数组在目前的接口基础上,一般有两种做法: - 直接实现,参考 clang 生成的 LLVM IR,修改当前接口使其支持多维的数组类型