【问题标题】:why top down parser cannot handle left recursion?为什么自顶向下解析器不能处理左递归?
【发布时间】:2014-03-02 17:31:25
【问题描述】:

我想知道为什么自上而下的解析器不能处理左递归,我们需要消除左递归,正如龙书中提到的那样..

【问题讨论】:

    标签: parsing compiler-construction left-recursion


    【解决方案1】:

    想想它在做什么。假设我们有一个左递归生产规则A -> Aa | b,现在我们尝试匹配该规则。所以我们在这里检查我们是否可以匹配一个 A,但是为了做到这一点,我们必须首先检查我们是否可以在这里匹配一个 A。这听起来不可能,而且大多数情况下是这样。使用递归下降解析器,这显然代表了无限递归。

    可以使用自上而下的更高级技术,例如参见 [​​1] 或 [2]。

    [1]:Richard A. Frost 和 Rahmatullah Hafiz。 一种新的自顶向下解析算法,可在多项式时间内适应歧义和左递归。 SIGPLAN Notices,41(5):46–54,2006。
    [2]:R. Frost、R. Hafiz 和 P. Callaghan,模块化和高效的自上而下 解析模棱两可的左递归语法。 ACL-IWPT, pp. 109 – 120,2007 年。

    【讨论】:

    • 您是否有关于您所引用的两个文档的更完整的书目数据?
    • @ibid 这样更好吗?
    • 更完整,是的:)
    【解决方案2】:

    自顶向下解析器无法处理左递归 自上而下的解析器无法处理左递归产生式。要理解为什么不这样做,让我们采用一个非常简单的左递归语法。

    1. S → 一个
    2. S → S 只有一个记号 a 和一个非终结符 S。所以解析表只有一个条目。两个产生式都必须进入该表条目。

    问题在于,在前瞻 a 中,解析器无法知道前瞻后是否有另一个 a。但使用哪种产品的决定取决于该信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2017-02-02
      • 2015-08-03
      • 1970-01-01
      • 2020-01-06
      相关资源
      最近更新 更多