You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# PW6 实验报告
PB21000117 陈应豪
PB21111663 李璐豪
## 问题回答
### task1
- `while` 语句块的布局特点是将循环体、循环条件和循环结束语块分成三个bb块。
- cond_bb是条件。如果为真就跳转到true_bb, 否则跳转到false_bb
- true_bb是循环体。每次结束后跳到cond_bb
- false_bb是循环结束语块
- `Func` 语块是一个单独的语句块。在调用函数的时候使用call的方法来调用函数, 然后把变量传入到函数中
### task2
请给出`SysYFIR.md`中提到的两种getelementptr用法的区别, 并解释原因:
- `%2 = getelementptr [10 x i32], [10 x i32]* %1, i32 0, i32 %0`
- `%2 = getelementptr i32, i32* %1, i32 %0`
区别:第一种先说明了数组的类型和数组指针,然后再根据偏移类型和偏移值算出地址;第二种方式是用普通的指针而非数组指针做基址加偏移。
原因是数据结构不同
### task3
使用scope处理函数, 能很好的约定变量的作用域, 不容易引起变量的越界
## 实验设计
在task1的时候, 学习SysYF的语法, 并编写等效的ll文件
在task2的时候, 学习能够生成SysYF的IR文法, 使之能生成等效的ll文件
在task3的时候, 利用实验框架, 通过类比上一关的IR认罚的编写, 利用已经生成的AST树为不同的模块编写对应的IR语法
- 在task1的时候, 学习SysYF的语法, 并编写等效的ll文件
- 在task2的时候, 学习能够生成SysYF的IR文法, 使之能生成等效的ll文件
- 在task3的时候, 利用实验框架, 通过类比上一关的IR认罚的编写, 利用已经生成的AST树为不同的模块编写对应的IR语法
- 参考助教给出的代码框架,我们把实验分成了变量定义、初始化和赋值;函数和算数调用和求值两个部分进行分工
## 实验难点及解决方案
在函数外表达式的计算中, 由于全局变量无法使用bb模块内的build相关函数, 需要根据变量名, 单独取出值并计算
Const数组不会在函数外进行再赋值的操作
- 全局变量在初始化时, 如果用到其他全局变量进行赋初值, 无法使用builder->create_load()
- 获取全局数组中元素的值比较麻烦
- 因此。如果scope.in_global(), 那不论访问什么变量, 我们都传值( 因为赋初值在初始化中完成了, 和lval中的传值不冲突。同时, 在没有进入任何bb的情况下赋值语句是不能出现的)
## 实验总结
利用PW5学到的AST以及访问者模式, 我们编写了能够生成IR的实验框架, 对AST和IR的理解更加深刻
## 实验反馈
配置文件不够齐全
## 组间交流