|
|
|
@ -111,11 +111,57 @@ define dso_local i32 @main() #0 { ; 定义一个名为main的函数,返回类
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 实验设计
|
|
|
|
|
本次实验循序渐进,分三步指导完成一个sy语言的机器语言自动生成器。
|
|
|
|
|
1. 手写机器语言,熟悉机器语言结构及各类语句含义和用途
|
|
|
|
|
2. 手动使用接口设置机器语言,相比第一步抽象层次更高,熟悉各种接口含义以及使用方法
|
|
|
|
|
3. 结合PW5中学习的AST以及访问者模式,为sy语言自动翻译机器语言。前两步中的四个例子几乎已经涵盖所有情况,可以作为参考。
|
|
|
|
|
|
|
|
|
|
## 实验难点及解决方案
|
|
|
|
|
0. educoder设计麻烦
|
|
|
|
|
1. 多维数组处理麻烦:因为一开始陷入了想用多维数组来存储的思维,导致很多不必要的尝试;换成用一维数组实现就很简单。
|
|
|
|
|
2. 函数全为void型,不能返回变量:设置全局临时变量作为返回值,定时整理删减全局临时变量。
|
|
|
|
|
3. 一开始随意选择了某个语法书节点开始编程,但是前置节点尚未编写导致了理解上的困难:审视全体语法树节点,尽可能选取最上层节点或着依赖较少的节点开始编写,比如funcDef。
|
|
|
|
|
4. 测试目录中只有20个文件,但是test.py提示进行了21次测试且仅有第一次测试出错:删去.DS_Store并加入.gitignore。
|
|
|
|
|
5. 重复表达式过多,修改麻烦:定期整理重复代码抽象出来作为单独函数。
|
|
|
|
|
|
|
|
|
|
## 实验总结
|
|
|
|
|
挺好的一次实验,但是感觉第二步到第三步之间缺少指引,比如翻译器的整体规划(一般涉及到一些全局变量,转换等)。这也导致了,如果没有事先商量仅仅指派某些函数来分工的话,难以同步进度和各种操作。
|
|
|
|
|
|
|
|
|
|
## 实验反馈
|
|
|
|
|
1. 建议完全抛弃educoder。
|
|
|
|
|
2. 可以在2、3步之间加入一个阶段,让学生分列出各语法树节点的可能情况以及处理方案,方便整体审视检查。之后只需要对着事先计划好的处理方案编程即可, 相比直接编写难度会小很多。
|
|
|
|
|
|
|
|
|
|
## 组间交流
|
|
|
|
|
提前商定好各函数之间必要信息交换,以及常用辅助函数和全局变量的设计。
|
|
|
|
|
|
|
|
|
|
然后各自负责一部分visit的编写,完成后进行整体调试和debug。
|
|
|
|
|
|
|
|
|
|
在Pass所有20个test后,针对各个test的情况进行讨论(见下),对未覆盖的情况增加test(新增的test检查出了BB命名重复的错误)。
|
|
|
|
|
```
|
|
|
|
|
1. main函数
|
|
|
|
|
2. [pass] 变量定义,未检查float类型->21 -
|
|
|
|
|
3. 空语句
|
|
|
|
|
4. [pass] 一维数组类型定义,未检查float类型与赋初值情况->22
|
|
|
|
|
5. [pass] 一维数组赋值情况->22
|
|
|
|
|
6. [pass] 常量定义,未检查非全局变量情况->23
|
|
|
|
|
7. [pass] 常量一维数组定义,未检查float类型->24
|
|
|
|
|
8. 函数定义,未检查函数含参数情况
|
|
|
|
|
9. [pass] 函数定义,未检查函数参数为float类型情况->25
|
|
|
|
|
10. if语句
|
|
|
|
|
11. [pass] if-else语句,未检查if嵌套情况-> 26
|
|
|
|
|
12. while语句,未检查while嵌套-> 27,未看出错误原因
|
|
|
|
|
13. break语句
|
|
|
|
|
14. continue语句
|
|
|
|
|
15. 输入语句 getint
|
|
|
|
|
16. 复杂函数定义
|
|
|
|
|
17. 等于关系测试,未检查其他关系-> 28,多个if语句块之间疑似未按照原有顺序编译
|
|
|
|
|
18. scop作用检查,变量作用域问题
|
|
|
|
|
19. 最大公因数
|
|
|
|
|
20. 汉诺塔问题,递归功能检测
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
完成主要任务后开始编写多维数组,首先讨论方案,决定用一维数组代替,其次编写了多种test辅助验证正确性。
|
|
|
|
|
|
|
|
|
|
在完成的过程中,时刻进行测试保证之前的test依然Pass。
|
|
|
|
|
|
|
|
|
|
组内主要使用SNS及时沟通,使用git同步进度。
|