compilation - 编译器中的错误检测

标签 compilation compiler-errors compiler-construction

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

int x, y;

x = x + y + z;

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

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

最佳答案

这最终取决于编译器,但是通常会在语义分析级别上提出,而语义分析级别仍然在编译器前端。

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

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

关于compilation - 编译器中的错误检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39196142/

相关文章:

python - PLY - 返回多个 token

compiler-construction - 一种新的编程语言实际上是如何形成/创建的?

c# - 在源代码控制中没有 bin 文件夹的情况下,在引用项目中使用新类构建失败,但成功了,为什么?

python - Firefox:编译错误 "' ascii' 编解码器无法编码字符”

c++ - 用于编译 .cpp 文件的 Qt .pro 文件依赖项

vba - 只有在公共(public)对象模块中定义的用户定义类型可以强制转换为变体或从变体强制转换或传递给后期绑定(bind)函数

build - 什么是 `relinking`警告?

c++ - 函数 undefined reference C++

objective-c - 使用导入的方法使用未声明的标识符错误

ruby - 一种语言如何被自身解释(如 Rubinius)?