词汇错误:标识符拼写错误

Abh*_*osh 1 compiler-construction compiler-errors lexical

在《龙书》中提到“词汇错误包括标识符的拼写错误。例如,拼写错误ellispeSizeelipseSize

我无法理解这是怎么回事(词法分析器可以识别拼写错误的标识符并导致错误)。和ellipseSize都是elipseSize有效的标识符词位。所以词法分析阶段应该没有问题。可能在编译的后期阶段,我们将了解到elipseSize尚未定义......

ric*_*ici 5

“词法错误”和“词法分析期间检测到的错误”不是一回事。

\n

事实上,这两个类别都没有任何正式的基础。形式语言理论没有提供词汇分析和句法分析之间的任何明确界限,甚至没有提供句法分析和语义分析之间的明确界限。甚至没有绝对要求将词法分析和句法分析分开;一些从业者似乎更喜欢所谓的“无扫描器解析”,其中使用单个语法将字符流直接转换为解析树。

\n

在您引用的段落中,我相信作者试图对错误类型进行直观而非正式的分类,尽管我不确定该列表是否具有任何特定的教学目的。在教科书的较早段落中(第 3 章开头),他们注意到在词法扫描期间检测拼写错误的问题:

\n
\n

如果没有其他组件的帮助,词法分析器很难判断是否存在源代码错误。例如,如果fi遇到字符串\xe2\x80\xa6,词法分析器无法判断是fi关键字拼写错误if还是未声明的函数标识符。

\n
\n

直观上,错误拼写关键字或标识符是词汇性的,因为错误是在程序员键入单个词素时发生的。但大多数拼写错误在词法分析期间无法检测到。在典型的编译器中,只有在语义分析表明拼写错误不是声明的变量之前,许多错误才会被检测到。如果它碰巧是在其他地方声明的不同变量,则可能不会检测到该错误,直到它在稍后的某个时间点作为执行时错误出现为止。

\n

相同的打字错误可能以四种不同的方式分类似乎没有用,这就是为什么将其分类为词汇错误并不是没有道理的。事实上,我们大多数人都会说“这是一个拼写错误”,无论检测到它是在编译/执行的哪个阶段。

\n

最后一点,我知道很多人会说未声明的变量是“语义”错误,而不是“语法”错误(这是您在考试中可能会发现的另一个问题。)但这种区别同样是任意的;当然可以编写一个语法,要求在包含变量使用的范围内声明变量。这样的语法不会是上下文无关的,但它仍然是一个语法。事实上,我们通常所说的“词法作用域”;甚至不是“语法范围”。这反映了这样一个事实:对于大多数语言,您可以机械地跟踪标识符对特定声明的使用,而无需了解程序的语义。在 AST 构建过程中,标识符与其范围相关是很常见的。(在 C++ 中,名称解析算法非常复杂,但在许多其他语言中却非常简单。)

\n

以下段落仅包含未经证实的意见。

\n

我知道在某些教学环境中,学生可能会遇到基于这本教科书的考试问题,要求他们根据您引用的《龙之书》部分中显示的即兴类别对不同的具体编程错误进行分类。我坚信,这(又一个)说明了(某些)学术环境对计算机科学专业学生的服务有多么糟糕。我认为解析理论尤其受到不良教学方法的困扰,这可能只是因为我对解析理论比计算机科学的其他方面更熟悉。但总的来说,对于学生需要学习如何思考而不仅仅是死记硬背任意列表的学科来说,死记硬背是一种糟糕的教学方法。计算机科学远非唯一这样的学科。很少有学科可以在大学层面教授,但从根本上不需要分析技能。

\n