|
|
@ -1,11 +1,11 @@
|
|
|
|
# IR实验阶段三
|
|
|
|
# IR实验阶段三
|
|
|
|
本实验由黄庄湫、吴毓辰助教设计
|
|
|
|
本实验由黄庄湫、吴毓辰助教设计
|
|
|
|
|
|
|
|
|
|
|
|
## 前言
|
|
|
|
## 0 前言
|
|
|
|
本次实验我们要使用访问者模式来实现 IR 自动生成。
|
|
|
|
本次实验我们要使用访问者模式来实现 IR 自动生成。
|
|
|
|
对于产生的IR, 我们可以调用 clang 生成可执行文件,这样一个初级的 SysYF 编译器就完成啦!
|
|
|
|
对于产生的IR, 我们可以调用 clang 生成可执行文件,这样一个初级的 SysYF 编译器就完成啦!
|
|
|
|
|
|
|
|
|
|
|
|
## 任务描述
|
|
|
|
## 1 任务描述
|
|
|
|
|
|
|
|
|
|
|
|
阅读[SysYF 的语义规则](../SysYF语言定义.pdf),注意本次实验必做部分语言可能与前几次实验有不同
|
|
|
|
阅读[SysYF 的语义规则](../SysYF语言定义.pdf),注意本次实验必做部分语言可能与前几次实验有不同
|
|
|
|
阅读[SysY IR 核心类介绍](./SysYIR.md)
|
|
|
|
阅读[SysY IR 核心类介绍](./SysYIR.md)
|
|
|
@ -14,7 +14,7 @@
|
|
|
|
修改 `src/SysYBuilder/SysYBuilder.cpp` 来实现自动 IR 产生的算法,使得它能正确编译任何合法的 SysYF 程序
|
|
|
|
修改 `src/SysYBuilder/SysYBuilder.cpp` 来实现自动 IR 产生的算法,使得它能正确编译任何合法的 SysYF 程序
|
|
|
|
注: 本次实验不需要实现多维数组
|
|
|
|
注: 本次实验不需要实现多维数组
|
|
|
|
|
|
|
|
|
|
|
|
## 实验框架
|
|
|
|
## 2 实验框架
|
|
|
|
|
|
|
|
|
|
|
|
本次实验使用了由 C++ 编写的 SysY IR 来生成 LLVM IR。为了便于大家进行实验,该框架自动完成了语法树到 C++ 上的抽象语法树的转换。
|
|
|
|
本次实验使用了由 C++ 编写的 SysY IR 来生成 LLVM IR。为了便于大家进行实验,该框架自动完成了语法树到 C++ 上的抽象语法树的转换。
|
|
|
|
|
|
|
|
|
|
|
@ -35,9 +35,9 @@ bool in_global();
|
|
|
|
```
|
|
|
|
```
|
|
|
|
你们需要根据语义合理调用`enter`与`exit`,并且在变量声明和使用时正确调用`push`与`find`。在类`SysYfBuilder`中,有一个`Scope`类型的成员变量`scope`,它在初始化时已经将特殊函数加入了作用域中。因此,你们在进行名字查找时不需要顾虑是否需要对特殊函数进行特殊操作。
|
|
|
|
你们需要根据语义合理调用`enter`与`exit`,并且在变量声明和使用时正确调用`push`与`find`。在类`SysYfBuilder`中,有一个`Scope`类型的成员变量`scope`,它在初始化时已经将特殊函数加入了作用域中。因此,你们在进行名字查找时不需要顾虑是否需要对特殊函数进行特殊操作。
|
|
|
|
|
|
|
|
|
|
|
|
## 运行与调试
|
|
|
|
## 3 运行与调试
|
|
|
|
|
|
|
|
|
|
|
|
### 运行 SysYCompiler
|
|
|
|
### 3.1 运行 SysYCompiler
|
|
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
```sh
|
|
|
|
mkdir build
|
|
|
|
mkdir build
|
|
|
@ -54,27 +54,43 @@ make
|
|
|
|
SysYCompiler test.sy -emit-ir -o test.ll
|
|
|
|
SysYCompiler test.sy -emit-ir -o test.ll
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 自动测试
|
|
|
|
### 3.2 自动测试
|
|
|
|
|
|
|
|
|
|
|
|
助教提供了自动评测脚本, 在`SysYF_Student/SysYF_Task3/Test_H/`目录下执行`python3 test_H.py`, 即可得到评测信息
|
|
|
|
助教提供了自动评测脚本, 在`SysYF_Student/SysYF_Task3/Test_H/`目录下执行`python3 test_H.py`, 即可得到评测信息
|
|
|
|
|
|
|
|
|
|
|
|
### Bonus
|
|
|
|
## 4 选做
|
|
|
|
|
|
|
|
|
|
|
|
对于学有余力的小组, 我们提供了Bonus环节, 若小组能完成Bonus部分, 将会有额外加分(仅针对本次实验的团队代码得分, 并且分数不能超过该部分得分上限)
|
|
|
|
对于学有余力的小组, 我们提供了选做环节, 若小组能完成选做部分, 将会有额外加分(仅针对本次实验的团队代码得分, 并且分数不能超过该部分得分上限)
|
|
|
|
|
|
|
|
|
|
|
|
Bonus部分说明如下:
|
|
|
|
选做部分验收方式为线下验收,你需要在线下检查时提供对应代码通过助教给出的选做部分测试样例,并且讲解你的代码
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
选做部分说明如下:
|
|
|
|
- H班:
|
|
|
|
- H班:
|
|
|
|
- 多维数组
|
|
|
|
- 多维数组
|
|
|
|
- 网安班:
|
|
|
|
- 网安班:
|
|
|
|
|
|
|
|
- 多维数组
|
|
|
|
- 将一维数组指针作为参数
|
|
|
|
- 将一维数组指针作为参数
|
|
|
|
- 逻辑运算(\&\&, \|\|, \!), 重点考察短路计算
|
|
|
|
- 逻辑运算(\&\&, \|\|, \!), 重点考察短路计算
|
|
|
|
- 多维数组
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bonus部分得分标准: 每个部分单独给分, 每个部分需要通过全部对应测例并在线下检查时给助教讲清思路才能得分
|
|
|
|
### 4.1 多维数组
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
目前给出的SysY IR接口并不支持多维数组的实现,因此你需要修改接口,以实现多维数组的声明、初始化和使用,你可以修改的内容为文件夹`include/SysYIR`,`include/SysYBuilder`,`src/SysYIR`,`src/SysYBuilder`内的所有内容
|
|
|
|
|
|
|
|
|
|
|
|
若小组完成了Bonus部分, 需在线下检查时向助教提出, 并让助教当场检查. 若在统一线下检查过后自行找助教检查, 该Bonus不算分
|
|
|
|
多维数组在目前的接口基础上,一般有两种做法:
|
|
|
|
|
|
|
|
- 直接实现,参考 clang 生成的 LLVM IR,修改当前接口使其支持多维的数组类型
|
|
|
|
|
|
|
|
- 展平,把高维数组当成一维数组存储,修改当前接口使其能保存一些必要信息
|
|
|
|
|
|
|
|
|
|
|
|
### 备注
|
|
|
|
在初始化多维数组时,与一维数组不同的是存在对齐问题,我们设定多维数组的初始化为完全对齐(在每个大括号处均对齐),以下两种初始化是等价的:
|
|
|
|
|
|
|
|
`int a[5][2] = {1,{2,3},{4},{5,6,7}}`
|
|
|
|
|
|
|
|
`int a[5][2] = {{1,0},{2,3},{4,0},{5,6},{7,0}}`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 4.2 数组指针参数 & 逻辑运算
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
目前给出的SysY IR接口支持数组指针参数和逻辑运算的短路计算,因此你不需要修改接口
|
|
|
|
|
|
|
|
注意`pointer`和`array`的区别以及文法中`&&`和`||`的优先级
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 5 备注
|
|
|
|
|
|
|
|
|
|
|
|
测试样例并不止公开的20个样例, 助教准备了许多隐藏测例来考验大家:), 隐藏测例并不会放在平台上
|
|
|
|
测试样例并不止公开的20个样例, 助教准备了许多隐藏测例来考验大家:), 隐藏测例并不会放在平台上
|
|
|
|
平台上第三部分的分数并不具有参考性, 第三部分的分数由助教线下检查后确定
|
|
|
|
|
|
|
|
|
|
|
|
平台上第三部分的评测只判断公开样例是否完全通过, 第三部分的分数由助教线下检查后根据公开样例和隐藏样例的通过情况确定, 因此请自行设计合法样例测试你们的代码,确保你们的代码考虑了足够多情况以通过尽可能多的隐藏样例
|
|
|
|