SysY->SysYF

master
tinysnail 4 years ago
parent 5e549a70f5
commit d893d25295

@ -8,14 +8,14 @@
## 0. 前言 ## 0. 前言
本次实验分为3关为组队实验。**本次实验请务必使用git提交**。 本次实验分为3关为组队实验。**本次实验请务必使用git提交**。
本次实验的目的是让大家熟悉生成中间代码所需要的相关知识: LLVM IR、 SysY IRLLVM IR的轻量级C++接口并实际实现一个IR Builder。 本次实验的目的是让大家熟悉生成中间代码所需要的相关知识: LLVM IR、 SysYF IRLLVM IR的轻量级C++接口并实际实现一个IR Builder。
在开始实验之前请确保LLVM的版本不低于10.0.1且PATH环境变量配置正确。可以通过`lli --version`命令是否可以输出10.0.1的版本信息来验证。 在开始实验之前请确保LLVM的版本不低于10.0.1且PATH环境变量配置正确。可以通过`lli --version`命令是否可以输出10.0.1的版本信息来验证。
### 主要工作 ### 主要工作
1. 第一部分: 了解LLVM IR。通过clang生成的.ll了解LLVM IR与c代码的对应关系。相应文档见[phase1.md](./doc/phase1.md) 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) 2. 第二部分: 了解SysYF IR。通过助教提供的c++例子了解SysYF IR的c++接口及实现。相应文档见[phase2.md](./doc/phase2.md)
3. 第三部分: 使用SysY IR实现一个IR Builder使其可以通过抽象语法树生成LLVM兼容的IR代码。相应文档见[phase3.md](./doc/phase3.md) 3. 第三部分: 使用SysYF IR实现一个IR Builder使其可以通过抽象语法树生成LLVM兼容的IR代码。相应文档见[phase3.md](./doc/phase3.md)
4. 实验报告:在[report.md](./report/report.md)中撰写报告。 4. 实验报告:在[report.md](./report/report.md)中撰写报告。
## 1. 实验要求 ## 1. 实验要求
@ -32,19 +32,19 @@
│   ├── phase2.md │   ├── phase2.md
│   ├── phase3.md │   ├── phase3.md
│   ├── SysYF语言定义.pdf │   ├── SysYF语言定义.pdf
| └── SysYIR.md <- SysY IR | └── SysYFIR.md <- SysYF IR
├── report ├── report
│   ├── report.md <- PW6 │   ├── report.md <- PW6
│   └── contribution.md <- PW6 │   └── contribution.md <- PW6
├── include <- ├── include <-
│   ├── ... │   ├── ...
│   └── SysYIR │   └── SysYFIR
├── src ├── src
│   ├── ... │   ├── ...
│   ├── SysYIR │   ├── SysYFIR
│   └── SysYBuilder │   └── SysYFBuilder
| ├── CMakeLists.txt | ├── CMakeLists.txt
| └── SysYBuilder.cpp <- | └── SysYFBuilder.cpp <-
└── SysYF_Student └── SysYF_Student
├── CMakeLists.txt ├── CMakeLists.txt
├── SysYF_Task1 ├── SysYF_Task1
@ -88,7 +88,7 @@
* 实验部分: * 实验部分:
* 需要完成 `./SysYF_Student/SysYF_Task1/student_ll`目录下的4个文件 * 需要完成 `./SysYF_Student/SysYF_Task1/student_ll`目录下的4个文件
* 需要完成 `./SysYF_Student/SysYF_Task2/student_cpp`目录下的4个文件 * 需要完成 `./SysYF_Student/SysYF_Task2/student_cpp`目录下的4个文件
* 需要完成 `./src/SysYBuilder/SysYBuilder.cpp` * 需要完成 `./src/SysYFBuilder/SysYFBuilder.cpp`
* 需要在 `./report/report.md` 中撰写实验报告 * 需要在 `./report/report.md` 中撰写实验报告
* 实验报告内容包括: * 实验报告内容包括:
* 实验要求、问题回答、实验设计、实验难点及解决方案、实验总结、实验反馈、组间交流(具体参考[report.md](./report.md)) * 实验要求、问题回答、实验设计、实验难点及解决方案、实验总结、实验反馈、组间交流(具体参考[report.md](./report.md))

@ -1,6 +1,6 @@
# SysY IR # SysYF IR
- [SysY IR](#sysy-ir) - [SysYF IR](#sysyf-ir)
- [IR](#ir) - [IR](#ir)
- [IR Features](#ir-features) - [IR Features](#ir-features)
- [IR Format](#ir-format) - [IR Format](#ir-format)
@ -621,4 +621,4 @@ to make
### 总结 ### 总结
助教在接口文档里筛选了可能会需要用到的接口如果对API有问题的请移步issue讨论本次`SysY IR`接口由助教自行设计实现并做了大量测试如有对助教的实现方法有异议或者建议的也请移步issue讨论**请不要直接修改助教的代码,若因修改助教代码造成后续实验仓库合并的冲突请自行解决**。 助教在接口文档里筛选了可能会需要用到的接口如果对API有问题的请移步issue讨论本次`SysYF IR`接口由助教自行设计实现并做了大量测试如有对助教的实现方法有异议或者建议的也请移步issue讨论**请不要直接修改助教的代码,若因修改助教代码造成后续实验仓库合并的冲突请自行解决**。

@ -8,7 +8,7 @@
### 相关知识 ### 相关知识
#### LLVM IR介绍 #### LLVM IR介绍
根据[维基百科](https://zh.wikipedia.org/zh-cn/LLVM)的介绍LLVM是一个自由软件项目它是一种编译器基础设施以C++写成包含一系列模块化的编译器组件和工具链用来开发编译器前端和后端。IR的全称是Intermediate Representation即中间表示。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`两节,后续有需要再反复参考。 作为一开始的参考,你可以先阅读其中`IR Features`和`IR Format`两节,后续有需要再反复参考。
#### 样例学习 #### 样例学习

@ -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++接口 #### SysYF IR - LLVM IR的C++接口
由于LLVM IR官方的C++接口的文档同样过于冗长助教提供了SysY IR这一C++接口库。你需要阅读**SysY IR核心类的介绍**`doc/SysYIR.md`。 由于LLVM IR官方的C++接口的文档同样过于冗长助教提供了SysYF IR这一C++接口库。你需要阅读**SysYF IR核心类的介绍**`doc/SysYFIR.md`。
本关会要求大家通过SysY IR根据AST构建生成LLVM IR。所以你需要仔细阅读文档了解其接口的设计。 本关会要求大家通过SysYF IR根据AST构建生成LLVM IR。所以你需要仔细阅读文档了解其接口的设计。
#### 样例学习 #### 样例学习
<details> <details>
@ -97,11 +97,11 @@
//后略, 详细见代码文件 //后略, 详细见代码文件
``` ```
</details> </details>
为了让大家更直观地感受并学会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文件。助教提供了详尽的注释一定要好好利用 该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`内回答[思考题](#思考题) 2. 在`report.md`内回答[思考题](#思考题)
### 编译、运行和验证 ### 编译、运行和验证
@ -122,6 +122,6 @@ make
### 思考题 ### 思考题
请在`report/report.md`中详细回答下述思考题。 请在`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 [10 x i32], [10 x i32]* %1, i32 0, i32 %0`
- `%2 = getelementptr i32, i32* %1, i32 %0` - `%2 = getelementptr i32, i32* %1, i32 %0`

@ -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 ```cpp
// 进入一个新的作用域 // 进入一个新的作用域
void enter(); void enter();
@ -23,15 +23,15 @@ Value* find(std::string name, bool isfunc);
// 判断当前是否在全局作用域内 // 判断当前是否在全局作用域内
bool in_global(); 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`内回答[思考题](#思考题) 2. 在`report.md`内回答[思考题](#思考题)
### 编译、运行与验证 ### 编译、运行与验证
#### 编译运行 SysYCompiler #### 编译运行 SysYFCompiler
```sh ```sh
mkdir build mkdir build
@ -40,11 +40,11 @@ cmake ..
make make
``` ```
编译后会产生 `SysYCompiler` 程序它能将sy文件输出为LLVM IR。 编译后会产生 `SysYFCompiler` 程序它能将sy文件输出为LLVM IR。
当需要对 sy 文件测试时,可以这样使用: 当需要对 sy 文件测试时,可以这样使用:
```sh ```sh
SysYCompiler test.sy -emit-ir -o test.ll SysYFCompiler test.sy -emit-ir -o test.ll
``` ```
得到对应的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修改当前接口使其支持多维的数组类型 - 直接实现,参考 clang 生成的 LLVM IR修改当前接口使其支持多维的数组类型

Loading…
Cancel
Save