为什么要分开词法和解析?


15

可以使用状态机的一次传递来解析文档。两次通过,即有什么好处?有一个词法分析器将文本转换为令牌,并有一个解析器来测试这些令牌的生产规则?为什么没有一次将生产规则直接应用于文本的过程?



2
这已经在CS,stackexchange上进行了讨论,并附有许多非常技术性的注释,以解答lexer + parser的表现力。但是那里可能还有进一步的答案的空间。
2015年

我不知道管道样式的并行性(尽管高度不平衡的阶段)是否可能是附带优势。指令和数据缓存行为可能也很有趣。多少(如果有的话)会减少编译时间将取决于特定的硬件。
保罗·克莱顿

一个相当明显的原因(至少对我而言)是您可以分别使用扫描仪工具。在实践中,我经常使用flex来扫描输入,但是很少需要yacc的全部功能。
jamesqf

Answers:


13

您不必将它们分开。人们将它们组合成无扫描仪的解析器

无扫描器解析器的主要缺点似乎是生成的语法相当复杂-比正则表达式进行词法化和上下文无关语法对令牌流进行解析的相应组合要复杂得多。特别地,用于无扫描器解析的语法趋于歧义。对于在令牌流上工作的语法,消除歧义更容易。

使用专用的前期词法分析阶段的务实好处是您不会将后续的解析器与词法细节结合在一起。这在早期的编程语言开发过程中非常有用,此时词汇和句法细节仍然经常变化。


1
ŤPPPŤ

@babou是的,这是正确的。我不知道用LL(k)组成的正则表达式形式的任何形式结果都不会超出LL(k)或类似形式。而且,词汇化通常不是用常规语言完成的,而是用功能更强大的东西完成的,即以最长匹配和关键字优先的优先级扩展的常规语言。我不确定确切的语言类是什么以及它的闭包属性是什么。
Martin Berger

2
如果您的前瞻涉及读取标识符,则该构成将需要无限制的前瞻,因为(原则上)标识符的长度没有限制。
2015年

@babou我不确定。如果最长关键字的长度为17个字符,则任何更长的字符串都必须是标识符,或者在词法上无效。
Martin Berger 2015年

但是您的标识符,或者可能是字符串,数字或其他文字,是由17个以上独立符号组成的序列,可能位于您实际需要的令牌之前。这是一个超前的,无限制的。您可能最终会遇到不确定的语言。
babou 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.