【发布时间】:2013-12-04 18:04:00
【问题描述】:
出于兴趣,我正在编写一个小型编译器,我需要知道在词法分析或解析期间检测到错误关键字的哪个阶段(不在语言中的关键字)?
【问题讨论】:
标签: parsing syntax compiler-construction lexical-analysis
出于兴趣,我正在编写一个小型编译器,我需要知道在词法分析或解析期间检测到错误关键字的哪个阶段(不在语言中的关键字)?
【问题讨论】:
标签: parsing syntax compiler-construction lexical-analysis
您将在解析过程中检测到这一点。不是你有一个“错误的关键字”,而是你有一个标识符(即变量名)出现在你不期望的地方。因此,如果您的源代码如下所示:
reeeturn 3;
从编译器的角度来看,您只是在使用一些名为reeeturn 的变量。这可能是一个错误,因为未定义具有该名称的变量。或者,在这种情况下,标识符后面有数字可能是语法错误。
但这里没有词法错误。这是一个完全有效的标记序列:标识符、数字、分号。
【讨论】:
这可能是在词法分析期间。词法分析是编译器阶段,其中输入文件被分割成片段并用这些片段的含义进行标记,而解析则获取这些现有片段并使用它们来组装 AST。在没有看到代码的情况下,我无法确定这一点,但基于这个推理,我怀疑错误出在扫描仪而不是解析器中。
希望这会有所帮助!
【讨论】:
这取决于语言。
词法分析阶段负责从源文件创建令牌流。如果“错误的关键字”在语言中仍然是有效的标记,它将被正确地标记 - 例如,在 C 中,“错误的关键字”将被标记为标识符。只有在解析的后期才会显示错误。
另一方面,在“错误关键字”不能是任何其他有效标记的语言中(例如,使用sigils 表示变量的语言),词法分析器本身会抱怨。
【讨论】: