语义分析是编译器的第三阶段。语义分析可确保程序的声明和语句在语义上是正确的。它是语法在需要时由解析器调用的过程的集合。前一阶段的语法树和符号表都用于检查给定代码的一致性。类型检查是语义分析的重要部分,其中编译器确保每个运算符具有匹配的操作数。
语义分析器:
它使用语法树和符号表来检查给定程序在语义上是否与语言定义一致。它收集类型信息并将其存储在语法树或符号表中。此类型信息随后在中间代码生成期间由编译器使用。
语义错误:
语义分析器识别的错误如下:
- 类型不匹配
- 未声明的变量
- 保留标识符滥用
语义分析的功能:
- 类型检查–
确保以与其定义一致的方式使用数据类型。 - 标签检查–
程序应包含标签引用。 - 流量控制检查–
保持检查控件结构的使用方式是否正确(例如:循环外没有break语句)
例子:
float x = 10.1;
float y = x*30;
在上面的示例中,语义分析器将在乘法运算之前将整数30强制转换为浮点型30.0。
静态和动态语义:
- 静态语义–
之所以这样命名,是因为它们是在编译时检查的。执行期间程序的静态语义和含义是间接相关的。 - 动态语义分析–
它定义了程序的不同单元(如表达式和语句)的含义。与静态语义不同,它们在运行时进行检查。