递归上升解析器如何工作?我写了一个递归 血统 我自己也使用过解析器,但我不太了解 LR 解析器。我什么 在维基百科上找到 这只会让我更加困惑。

另一个问题是为什么递归上升解析器的使用并不多于基于表的解析器。看起来递归上升解析器总体性能更高。

有帮助吗?

解决方案

在clasical 龙书解释得非常好LR语法分析器是如何工作的。还有解析技术。实用指南。在这里你可以了解他们,如果我记得很清楚。在维基百科的文章(至少引进)是不正确的。它们是由高德纳创建的,他解释说,他们在计算机的艺术他的编程卷5.如果你理解西班牙语,有书的这里张贴由我。不是所有的书籍是西班牙语,要么。

在以了解他们的工作,你必须了解像第一几个概念,遵循和前瞻。另外,我真的建议你尝试了解LR(长辈)解析器之前,了解背后的LL(后裔)解析器的概念。

有一个家庭解析器LR的,特别是LR(K),SLR(K)和LALR(K),其中K是他们需要多少先行工作。 YACC支持LALR(1)语法分析器,但您可以根据做出的调整,不是理论,使其作品具有更强大的一种语法。

关于性能,这取决于被分析的语法。他们执行的线性时间,但究竟有多少空间,他们需要取决于你有多少个国家建立最终的解析器做。

其他提示

我个人有一个很难理解一个函数调用如何更快 - 比查找表更“快显著”。我怀疑,即使是“快显著”相比,其他一切词法分析器/解析器做(主要是阅读和令牌化的文件)是微不足道的。我看了看维基百科页面,但没有按照参考;没有作者简介实际上一个完整的词法分析器/解析器?

更有趣的对我来说是表驱动的解析器相对于递归下降的下降。我来自一个C背景,其中YACC(或等效物)是所选择的解析器生成器。当我移动到Java,我发现一个表驱动的实现(JavaCup),和几个递归下降实现(JavaCC的,ANTLR)。

我怀疑,答案是类似于“为什么Java的,而不是C”的回答:执行速度是不是发展的速度一样重要。由于维基百科的文章中指出,表驱动的解析器是几乎不可能从代码(回来时,我用他们,我可以跟着他们的行动,但可能永远都没有能够重建从解析器语法)了解。递归下降,通过比较,是非常直观的(这是毫无疑问为什么它早于表驱动大约20岁)。

维基百科关于递归的文章 上升 解析参考了该主题的原始论文(“Very Fast LR Parsing”)。浏览那张纸让我明白了一些事情。我注意到的事情:

  1. 论文讨论了生成汇编代码。我想知道如果您生成 C 或 Java 代码,您是否可以做与他们相同的事情;请参阅第 4 节和第 5 节“错误恢复”和“堆栈溢出检查”。(我并不是想对他们的技术进行 FUD——它可能会很好地发挥作用——只是说这是你在提交之前可能想要研究的东西。)

  2. 他们将递归上升工具与自己的表驱动解析器进行比较。从结果部分的描述来看,他们的表驱动解析器似乎是“完全解释的”;它不需要任何自定义生成的代码。我想知道是否存在中间立场,其中整体结构仍然是表驱动的,但您可以为某些操作生成自定义代码以加快速度。

维基百科页面引用的论文:

另一篇关于使用代码生成而不是表解释的论文:

另请注意,递归下降解析并不是解析基于 LL 语法的语言的最快方法:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top