【问题标题】:Problems with LL algorithms taxonomyLL算法分类的问题
【发布时间】:2013-12-23 19:02:09
【问题描述】:

我正在研究 Context Free Grammars,我正处于第一步:了解 Top-Down 解析算法的结构。

我的问题围绕着自上而下的解析器。我有介绍给我的三种算法:

  • 递归下降
  • 预测性
  • 预测递归下降

问题

但不明白如何将它们联系起来。所以请回答以下问题:

  • Recursive Descent真的是基于回溯,效率低吗?
  • 预测解析真的是与其他两种完全不同的算法吗?
  • Predictive Recursive Descent 是一种特殊的递归下降算法,但没有回溯,是真的吗?
  • 预测算法使用解析表而递归下降是真的吗? 预测递归下降算法使用预测解析表(某种增强的解析表)是真的吗?

另外请回答这个问题:

  • LL 解析器使用哪种算法? Predictive、Predictive Recursive Descent 还是 Recursive Descent?

谢谢

【问题讨论】:

    标签: parsing computer-science grammar context-free-grammar ll


    【解决方案1】:

    递归下降允许您实现一定范围的形式解析器。例如,它允许开发 LL(k) 解析器。在 LL 的情况下,递归下降不需要回溯,也就是说,鉴于 LL 的性质,解析器不会意识到它错过了一些解析规则。另一方面,递归下降还允许您实现使用回溯的解析器。因此,您可以使用或不使用回溯,并且可以使用递归下降来容纳一系列解析器系列。

    递归下降没有内置的效率保证。这取决于您编写的代码以及您要解决的问题。 C 语言家族的 clang 解析器是递归的,可以回溯,并且被作者认为是解析 C 语言的正确方法。

    我不确定有关预测解析的术语,维基百科暗示它是一个不回溯的递归下降解析器,就像上面的示例一样,但这种情况被称为预测递归下降解析器更有意义。有一些讲义表明预测解析器是一种不隐式使用堆栈来保存解析器状态的解析器。在这种情况下,例如,预测解析器使用显式管理的堆栈,可能由具有解析规则的表驱动。

    鉴于递归下降和预测解析作为两种解析实现技术之间的对比,我想说递归解析器是一种使用递归函数(并隐式使用堆栈)实现解析器的方法,而预测解析在某种程度上使用表和显式堆栈(但没有递归函数)实现解析器。预测递归下降表明有一个使用表和递归函数的解析器,这对我来说看起来很奇怪。最坏的情况是,预测递归下降解析器是一个不回溯的递归下降解析器(而不是预测解析器),名字很丑。

    概念 LL 解析器既可以转换为递归下降解析器(即一组递归函数),也可以转换为预测解析器(即是,一个while循环+一个堆栈+一个表)。

    了解递归下降解析器的最佳方法是学习万花筒语言教程: http://llvm.org/docs/tutorial/LangImpl2.html

    http://en.wikipedia.org/wiki/LL_parser

    http://en.wikipedia.org/wiki/Recursive_descent_parser

    Are GCC and Clang parsers really handwritten?

    http://www.cs.purdue.edu/homes/xyzhang/spring09/notes/ll.pdf

    【讨论】:

      【解决方案2】:

      预测解析器是一个通用的解析器家族,有多种形式(LL 和 LR 解析器是比较突出的例子)。预测解析器通常通过使用解析的当前状态的一些知识来尝试“预测”使用哪些产生式(或应用哪些缩减)。例如,在 LL 解析中,解析器尝试根据当前的非终结符和接下来的几个输入字符来预测应用哪个产生式。在 LR 解析中,根据输入的下一个终端和解析器的当前配置,预测应该在特定时间点执行哪些缩减(如果有)。

      许多(但不是全部)预测解析器是表驱动的。 LR 解析器通常使用表来实现,一些 LL 解析器也是如此,尽管情况并非总是如此。许多 LL 解析器使用递归下降实现,许多 LR 解析器使用递归上升实现。

      递归下降解析通常是指自上而下的解析算法,其工作原理是通过为每个终端和非终端提供不同的递归函数来猜测要使用哪些产生式。他们通常根据语法使用一定数量的回溯,并且通常在左递归语法上失败。通常,手写的 LL 解析器是使用没有回溯的递归下降编写的,这是可能的,因为语法是专门构造为不需要任何回溯的。这是预测递归下降。

      使用回溯,递归下降可能非常低效。通常,您不会对需要像这样回溯的语法使用递归下降。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-26
        • 2019-09-19
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 2011-05-30
        相关资源
        最近更新 更多