我正在学习有关编译器的知识,特别是针对两阶段编译器的知识,并且对检测到错误的某些阶段感到困惑。假设我们有类似的东西:
int x, y;
x = x + y + z;
在我们尝试引用尚未声明的变量的地方。我认为这是在编译器前端中会检测到的错误。但是我不知道前端的哪个子区域会检测到此错误。
前端的三个部分是:扫描器,解析器和上下文无关的分析器。扫描程序读取语句中的每个单个字符,并将该语句拆分为 token 。因此,我可能是错的,但是我认为这里不会检测到错误。解析器检查语句在语法上是否正确。这是我开始感到困惑的地方。即使未声明
z
,该语句的语法在技术上也是正确的,所以这里也不会检测到错误吗?上下文无关的分析器使用符号表和语法树来检查程序,以查看该程序在语义上是否与语言定义一致。在这里它也进行类型检查。会在这里检测到错误吗?因为此时编译器将在符号表中查找并注意到z
没有类型(或者根本不在其中?)。还是编译器后端会检测到这种情况?如果是后端,我不明白为什么会这样。任何澄清将不胜感激。谢谢。
最佳答案
这最终取决于编译器,但是通常会在语义分析级别上提出,而语义分析级别仍然在编译器前端。
对于传统的编译器,这无法在扫描阶段完成,因为扫描器使用有限的自动机,并且“代表适当的变量作用域的字符串”的语言不是正常的。通常也不会将其作为解析的一部分来完成,因为解析通常是关于建立AST的,如果自下而上进行解析,则在解析器确定结构的结构时,范围信息将不可用。编码。
但是,语义分析器具有查找此错误所需的所有信息-它具有AST,并可以使用它来构建符号表,遍历代码中的所有表达式,并注意z
不在该符号表中的任何位置。
关于compilation - 编译器中的错误检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39196142/