——sudo_dqr
2024秋季编译技术课程实验课程编译器设计,使用C++
完成了SysY
到MIPS
的一个简单编译器,进行了为数不多的优化(docs/优化文章.pdf),设计文档见(docs/编译器设计文档.pdf),这是一个不那么优雅、不那么成熟、不那么健壮、不那么快速、值得反思、值得重构、值得批判的幼稚作品(可能还有很多没测试出来的bug, 但当前的正确性足以通过课程组的测试),但是对于我本身,一个刚刚入门编译系统的菜鸟,何必苛求更多呢?在计算机系统的路上,我相信我还会走的更远,一直很喜欢《滕王阁序》中的一句话:“北海虽赊,扶摇可接”.
-
新增两个文法:
-
if内定义变量:
if (int a = 10) { } else { }
其中if内定义的变量作用域为从if开始到if-else块结束, 相当于:
int a = 10; if (a) { } else { }
-
新增++运算符,对于原有的UnaryExp文法扩展为:
UnaryOp → '+' | '−' | '!' | "++"
,需要注意的一点是++
不会产生副作用(荣言荣语),仅对表达式求值即可, 例如下例中不会修改a的值, 只会返回a+1的表达式值.int a = 10; int c = ++a;
-
-
我的解法:
- if比较难处理的就是符号表问题,我选择在进入If条件时加入符号表,走完if结构之后从符号表中删除;关于变量定义直接抄变量定义部分就行
- ++比较简单,新增token类型,修改
parser
、修改visitor
那一套