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

Lexical Errors: misspelling of identifiers

龙书提到“词法错误包括标识符的拼写错误。例如将ellispeSize拼错为elipseSize

我不明白这是怎么回事(词法分析器可以识别拼写错误的标识符并导致错误)。 ellipseSizeelipseSize 都是标识符的有效词位。所以词法分析阶段应该没有问题。可能在以后的编译阶段我们会知道 elipseSize 没有被定义 ...

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

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

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

It is hard for a lexical analyzer to tell, without the aid of other components, that there is a source-code error. For example, if the string fi is encounterd… a lexical analyzer cannot tell whether fi is a misspelling of the keyword if or an undeclared function identifier.

从直觉上讲,拼写错误的关键字或标识符是在程序员键入单个词位时发生错误的意义上的词法。但大多数拼写错误无法在词法分析中检测出来。在典型的编译器中,许多不会被检测到,直到语义分析显示拼写错误不是声明的变量。如果它恰好是在其他地方声明的不同变量,则可能不会检测到错误,直到它在稍后的某个时间点作为执行时错误出现。

同一个打字错误可能以四种不同的方式分类似乎没有用,这就是为什么将其分类为词法错误并非不合理的原因。事实上,我们大多数人都会说,“这是一个打字错误”,而不管它是在 compilation/execution 哪个阶段被发现的。

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

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

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