为什么自顶向下解析器无法处理左递归?

时间:2014-03-02 17:31:26

标签: parsing compiler-construction left-recursion

我想知道为什么自上而下的解析器无法处理左递归,我们需要消除由于龙书中提到的左递归...

2 个答案:

答案 0 :(得分:4)

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

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

[1]:Richard A. Frost和Rahmatullah Ha fi z。 一种新的自上而下的解析算法,用于在多项式时间内容纳歧义和左递归。 SIGPLAN Notices,41(5):46-54,2006。
[2]:R。Frost,R。Ha fi z和P. Callaghan,模块化和高效自上而下 解析模糊的左递归语法。 ACL-IWPT,pp.109 - 120,2007。

答案 1 :(得分:0)

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

  1. S→一个
  2. S→S a 只有一个令牌a和一个非终结符S。因此,解析表只有一个条目。这两个产品都必须进入一个表条目。

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