本仓库用于杭州电子科技大学2025秋季学期编译原理课程实践项目。由于涉及个人信息暂不包含设计文档。
本项目实现了一个基于Flex,Bison实现的SysY源代码的词法、语法、语义检查(部分)编译器。
SysY详细语法见docs目录下相关手册。
部分目录由Makefile自动生成。由于源代码中引用了Flex/Bison自动生成的代码,若未执行make部分文件会出现找不到头文件的情况。
- make 编译项目
- make run FILE=input 对input文件执行文法检查
- make clean 清除所有编译产物
- ./sysy input 对input文件执行文法检查(编译后)
| 错误类型 | 错误含义 |
|---|---|
| A | 词法错误 |
| B | 语法错误 |
| 1 | 变量未声明 |
| 2 | 变量重复声明 |
| 3 | 函数在调用时未定义 |
| 4 | 函数重复定义(同样的函数名出现了不止一次定义) |
| 5 | 把变量当做函数调用,如对普通变量使用括号(...)或()运算符(当函数调用) |
| 6 | 对函数名的不当引用(如把函数名当做普通变量来引用) |
| 7 | 对数组的不当引用,如数组访问运算符“[...]”中出现非整数表达式,即数组变量的下标不是整型 |
| 8 | 对非数组变量使用数组访问运算符“[...]” |
| 9 | 函数调用时参数个数或类型不匹配 |
| 10 | return语句返回的类型与函数定义的返回类型不匹配 |
| 11 | 操作数类型不匹配,或操作数类型与操作符不匹配,如整型变量与数组变量相加减,或数组变量与数组变量相加减 |
| 12 | break语句不在循环体内 |
| 13 | continue语句不在循环体内 |
- 现在变量与常量并有没有什么区别,可以探索实现对常量进行特殊语义检查,比如数组定义时不能使用非常量作为范围声明。
- 没有对数组初始化元素个数是否匹配做约束,这可能需要先实现1,然后计算简单表达式并得到数组元素总个数才能做到。