【问题标题】:Error detection in compilers编译器中的错误检测
【发布时间】:2016-08-28 21:53:50
【问题描述】:

我正在学习编译器,特别是研究两阶段编译器,并且对检测到错误的某些阶段感到困惑。假设我们有类似的东西:

int x, y;

x = x + y + z;

我们试图引用一个尚未声明的变量。我认为这是一个可以在编译器前端检测到的错误。但是不知道前端的哪个子区域会检测到这个错误。

前端的三个部分是:扫描器、解析器和上下文无关分析器。扫描器读取语句中的每个字符并将语句拆分为标记。所以,我可能是错的,但我认为这里不会检测到错误。解析器检查语句在语法上是否正确。这是我开始感到困惑的地方。即使z 未声明,但该语句的语法在技术上是正确的,那么这里也不会检测到错误吗?上下文无关分析器使用符号表和语法树来检查程序,看它在语义上是否与语言定义一致。在这里它还进行类型检查。会在这里检测到错误吗?因为此时编译器会查看符号表并注意到z 没有类型(或者根本不存在?)。或者这是编译器后端会检测到的东西?如果是后端,我不明白为什么会这样。任何澄清将不胜感激。谢谢。

【问题讨论】:

  • '上下文无关分析器'?你是说语义分析器吗?
  • @EJP 是的,上下文无关分析器是语义分析器的另一个术语。它们的意思是一样的。

标签: compilation compiler-errors compiler-construction


【解决方案1】:

这最终取决于编译器,但通常这会出现在语义分析级别,该级别仍在编译器前端。

使用传统编译器,这无法在扫描阶段完成,因为扫描器使用有限自动机,并且“表示适当变量范围的字符串”的语言不规则。这通常也不会作为解析的一部分来完成,因为解析通常是关于构建 AST,如果它是自下而上完成的,那么在解析器确定结构时,范围信息将不可用代码。

但是,语义分析器具有查找此错误所需的所有信息 - 它具有 AST,并且可以使用它来构建符号表,遍历代码中的所有表达式,并注意 z 不是该符号表中的任何位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2023-04-03
    • 2011-04-05
    相关资源
    最近更新 更多