Class检查
- 在
class
符号表中添加了5种基本类(Object
,IO
,Int
,Bool
,Str
); - 检查主类
Main
和主函数main
是否定义,按照规范应该被定义; - 检查
SELF_TYPE
类是否被定义,按照规范不应该被定义; - 检查类(
class
)或者函数(method
)是否被重复定义,按照规范不应该被定义; - 检查是否存在自定义类继承了
Int
,Str
,Bool
,SELF_TYPE
或者未定义的类,按照规范不应该存在; - 检查类的父类(
parent class
)(默认父类为Object
)是否存在,按照规范应该存在; - 检查类之间继承关系是否构成环,按照规范不应该构成。
Method检查
- 当子类重载父类中定义的方法时,检查函数参数数量,参数类型和返回值是否与父类中的定义一致;
- 检查形式参数中是否包含
self
,按照规范不应该包含; - 检查形式参数是否被重复定义,按照规范不应该被重复定义;
- 检查形式参数的类型是否被定义,按照规范应该被定义;
- 检查返回类型是否被定义,按照规范应该被定义;
- 检查推导出来的返回类型和声明的返回类型是否一致,按照规范应该一致。
Attribute检查
- 检查属性的类型声明是否被定义,按照规范应该定义;
- 检查属性初始化时被推导出的类型与声明是否符号,按照规范应该符合。
Assign检查
- 检查标识符是否定义,按照规范应该定义;
- 检查
assign
语句的返回类型与声明是否一致,按照规范应该一致。
Dispatch检查(调用检查)
- 检查静态调用声明的类型是否被定义,仅在静态调用时检查,按照规范应该被定义;
- 检查表达式类型是否被定义,按照规范应该被定义;
- 检查表达式类型与静态调用的声明是否符合,仅在静态调用时检查,按照规范应该符合;
- 检查函数是否被定义,按照规范应该被定义;
- 检查实参和形参的类型是否符合,按照规范应该符合;
- 检查函数调用的参数数量与定义是否符合,按照规范应该符合。
Cond & Loop检查
- 检查条件表达式返回类型是否是
Bool
类型;
Case / Branch检查
- 检查是否存在重复分支,按照规范不应该存在;
Let检查
- 检查标识符声明的类型是否被定义;
- 检查标识符初始化过程中被推导出的类型是否与声明相符;
Plus, Sub, Mul, Div, Neg, LT, LEQ ( , -, *, /, ~, <, <=)
- 检查是否所有参数都是
Int
类型;
EQ检查 (=)
- 如果其中一个参数是
Int
,Bool
或者String
类型,其他参数也应该是相同类型;
Comp检查 (not)
- 检查参数类型是否为
Bool
类型;
New检查
- 检查
new
是否被用于未定义的类,按照规范不应该;
Object检查
- 检查标识符是否被声明。