Compiler course 2016
gist: https://gist.github.com/taineleau/35e5de53e14770738ff4cf30cdce238d
javac *.java
java MiniJava path/to/your/file (-c)
已测试:macOS 10.12、Windows10 64-bit
理论可运行但未测试:Linux
依赖于ANTLR4,并建议运行于JavaSE 7及以上环境
- 读入所有class的名称,给所有类编号。arrayType=0, booleanType=1,intType = 2, illegalType = 3, 主类编号为4,其他为5,6,7...
- 类信息存储在classMap, numberClassMap, classNumberMap, totalClassNumber中。
- 检查重复定义类。
- 记录所有变量声明及其类型,检查重复声明。
- 记录所有方法声明及其返回类型,检查重复声明。记录方法的形参类型,记录形参名称。
- 检查循环继承和继承不存在的类。
- 检查了未定义的方法调用。调用时参数类型、数目错误。
- 检查了未定义的变量、实参(定义在当前函数,或者是类的成员函数)
- 检查了未声明的类的使用。
- 对所有expression的返回值做了设置。(OurMiniJavaBaseListener中也修改了一部分返回值)
- (CANCELED) Check if there exists a child class instance as a member in a parent class, but the child could have a reference to its parent as a member var.
- 检查了赋值时等式两边类型不匹配的问题
- 运算(加减乘除)的类型检查
- 数组下标的类型检查