1.1 数量一致性检查

1.1.1 数组维数

在使用数组元素时,需保证数组的下标表达式列表的大小与其定义时的维数相同,其定义时的维数需要通过查符号表获得。

1.1.2 子程序调用参数个数

1.1.2.1 用户自定义程序

在调用程序时,需保证实参表达式列表的大小与该程序定义时的形参个数相同,其定义时的形参的个数需要通过查符号表获得。

1.1.2.2 库程序

  • read至少有一个实参表达式
  • write至少有一个实参表达式
  • writeln可以有任意个实参表达式,也就是说,可以无参调用,作用相当于输出只输出一个换行符
  • exit在过程定义中出现时,必须无参调用;在函数中出现时,必须有且只有一个实参表达式

    1.1.3 符号种类错误检查

    在引用某一符号时,首先需要检查是否已定义,如果已定义,还需检查已定义的符号的种类是否能够用于当前引用的情景,例如已定义的real型变量就不能作为循环变量来使用,这种类型的错误的检查在整个语义分析中占了较大的篇幅
    以下列举了各种符号种类错误的情况:

  • 主程序参数名、过程名作为变量引用,即作为赋值语句的左值,或者作为表达式的操作数

  • 函数名作为左值,但是不是当前所在函数名,无法作为返回值语句
  • 当前变量引用包含下标表达式列表,也就是作为数组元素来引用,但是之前的定义不是数组
  • 只有普通变量、传值参数、引用参数可以作为循环变量(且类型必须是integer),其它种类的符号如果作为循环变量,均应报错。通常还应考虑数组元素作为循环变量的可能性,但是我们的文法不支持这种情况
  • 常量作为左值
  • 非过程名作为过程调用语句
  • 引用形参对应的实参、read的实参只能是普通变量、传值参数、引用参数、数组元素,不能是别的种类
  • 常量定义时,可以用别的常量标识符来定义当前常量的取值,但不能是别的种类的标识符
  • 出现在表达式中的函数调用,其名称并不是函数名的情况