【问题标题】:Why can't a recursive-descent parser handle left recursion为什么递归下降解析器不能处理左递归
【发布时间】:2009-05-11 09:56:45
【问题描述】:

有人可以向我解释为什么递归下降解析器不能使用包含左递归的语法吗?

【问题讨论】:

    标签: parsing theory


    【解决方案1】:

    考虑:

    A ::= A B
    

    等效代码是

    boolean A() {
        if (A()) {
            return B();
        }
        return false;
    }
    

    看到无限递归了吗?

    【讨论】:

      【解决方案2】:

      给感兴趣的人

       A ::= A B | A C | D | E
      

      可以改写为:

       A ::= (D | E) (B | C)*
      

      转换的一般形式是:任何一个非左递归析取后跟任意数量的没有第一个元素的左递归析取。

      修改动作代码有点棘手,但我也可以即插即用。

      【讨论】:

      • 第一次看到,我总是看到建议使用新的非终端,通常称为 A'
      • 一些基于 BNF 的工具不允许 () 组,因此您最终会坚持使用新的规则解决方案。我有点偏爱我提出的表单,因为我的解析器生成器也需要进行动作转换,因此在没有新规则的情况下使其工作要容易得多。
      • 这并不能真正回答问题。作为评论会更好。
      • @Kristopher:检查日期,IIRC 当时的评论大小限制对于这个来说太小了。
      • 我最终通过查看我脑海中的代码自己弄清楚了这一点,很高兴看到我做对了一种确认!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多