zl程序教程

您现在的位置是:首页 >  其他

当前栏目

CS143-PA4: 抽象语法树语义分析

2023-04-18 14:59:47 时间

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检查

Case / Branch检查

  • 检查是否存在重复分支,按照规范不应该存在;

Let检查

  • 检查标识符声明的类型是否被定义;
  • 检查标识符初始化过程中被推导出的类型是否与声明相符;

Plus, Sub, Mul, Div, Neg, LT, LEQ (+, -, *, /, ~, <, <=)

  • 检查是否所有参数都是Int类型;

EQ检查 (=)

  • 如果其中一个参数是Int,Bool或者String类型,其他参数也应该是相同类型;

Comp检查 (not)

  • 检查参数类型是否为Bool类型;

New检查

  • 检查new是否被用于未定义的类,按照规范不应该;

Object检查

  • 检查标识符是否被声明。