语义分析是编译的第三个阶段。


语义分析的主要任务

高级语言程序中的语句可分为两类:一类声明语句,一类是可执行语句。在声明语句中,会声明一些数据对象或过程,并且为它们分别取名字,即标识符。

对于声明语句来说,语义分析的主要任务就是收集标识符的属性信息,包含以下内容:

  • 种属(Kind):简单变量、复合变量(数组、记录…)、过程…

  • 类型(Type):整型、实型、字符型、布尔型、指针型…

  • 存储位置和长度

    例:

    1
    2
    3
    4
    5
    begin:
    real x[8];
    integer i,j;
    ...
    end

    例中首先声明了实型数组x,因此x相对地址就是0,一个实型变量占8个字节,数组8个元素占用64个字节,所以接下来声明的变量i相对地址为64,一个整型变量占用4个字节,那么j的相对地址为68.

  • 作用域

  • 参数和返回值信息:参数个数、参数类型、参数传递方式、返回值类型…

语义分析阶段收集的标识符属性信息会存放在一个称为符号表的数据结构中,每个标识符都对应着符号表中的一条记录,记录的每个字段对应着标识符的一个属性。

符号表通常带有一个字符串表,用来存放程序中用到的标识符和字符常数,这样的话,NAME字段就被分割成两个部分,其中一部分用来存放标识符在字符串表中的起始位置,另一部分存放标识符长度。

语义分析的另一个任务就是语义检查。

  • 变量或过程未经声明就使用

  • 变量或过程名重复声明

  • 运算分量类型不匹配,例如将一个数组名字和一个过程名字相加是没有意义的。当发现运算分量类型不一致时,可能要进行自动类型转换,比如说一个二元算数运算符可以作用于一对整数,也可以作用于一对浮点数,但是如果将它作用于一个整数再加一个浮点数,那么就要将其中的整数转为浮点数。

  • 操作符与操作数之间的类型不匹配。例如数组下标不是整数、对非数组变量使用数组访问操作符、对非过程名使用过程调用操作符、过程调用的参数类型或数目不匹配、函数返回类型有错误等等。

最后修改日期:2020年5月23日

留言

撰写回覆或留言