编译器中的错误检测
Error detection in compilers
我正在学习编译器,特别是研究两阶段编译器,并且对检测到错误的某些阶段感到困惑。假设我们有类似的东西:
int x, y;
x = x + y + z;
我们试图引用一个尚未声明的变量。我认为这是一个会在编译器前端检测到的错误。但是不知道前端哪个分区会检测到这个错误
前端的三个部分是:扫描器、解析器和上下文无关分析器。扫描器读取语句中的每个字符并将语句拆分为标记。所以,我可能是错的,但我认为不会在这里检测到错误。解析器检查该语句在语法上是否正确。这是我开始感到困惑的地方。即使 z
未声明,语句的语法在技术上是正确的,那么这里也不会检测到错误吗?上下文无关分析器使用符号 table 和语法树来检查程序,看它在语义上是否与语言定义一致。在这里它也进行类型检查。会在这里检测到错误吗?因为此时编译器会查看符号 table 并注意到 z
没有类型(或者根本不存在?)。或者这是编译器后端会检测到的东西吗?如果是后端,我不明白为什么会这样。任何澄清将不胜感激。谢谢
这最终取决于编译器,但通常这会出现在语义分析级别,该级别仍在编译器前端。
使用传统的编译器,这无法在扫描阶段完成,因为扫描器使用有限自动机并且 "strings that represent proper variable scoping" 的语言不规则。这通常也不会作为解析的一部分来完成,因为解析通常是关于构建 AST,如果它是自下而上完成的,那么在解析器确定结构的时候范围信息将不可用代码。
但是,语义分析器具有发现此错误所需的所有信息 - 它具有 AST 并且可以使用它来构建符号 table,遍历代码中的所有表达式,并注意z
不在该符号 table 中的任何位置。
我正在学习编译器,特别是研究两阶段编译器,并且对检测到错误的某些阶段感到困惑。假设我们有类似的东西:
int x, y;
x = x + y + z;
我们试图引用一个尚未声明的变量。我认为这是一个会在编译器前端检测到的错误。但是不知道前端哪个分区会检测到这个错误
前端的三个部分是:扫描器、解析器和上下文无关分析器。扫描器读取语句中的每个字符并将语句拆分为标记。所以,我可能是错的,但我认为不会在这里检测到错误。解析器检查该语句在语法上是否正确。这是我开始感到困惑的地方。即使 z
未声明,语句的语法在技术上是正确的,那么这里也不会检测到错误吗?上下文无关分析器使用符号 table 和语法树来检查程序,看它在语义上是否与语言定义一致。在这里它也进行类型检查。会在这里检测到错误吗?因为此时编译器会查看符号 table 并注意到 z
没有类型(或者根本不存在?)。或者这是编译器后端会检测到的东西吗?如果是后端,我不明白为什么会这样。任何澄清将不胜感激。谢谢
这最终取决于编译器,但通常这会出现在语义分析级别,该级别仍在编译器前端。
使用传统的编译器,这无法在扫描阶段完成,因为扫描器使用有限自动机并且 "strings that represent proper variable scoping" 的语言不规则。这通常也不会作为解析的一部分来完成,因为解析通常是关于构建 AST,如果它是自下而上完成的,那么在解析器确定结构的时候范围信息将不可用代码。
但是,语义分析器具有发现此错误所需的所有信息 - 它具有 AST 并且可以使用它来构建符号 table,遍历代码中的所有表达式,并注意z
不在该符号 table 中的任何位置。