如何消除epsilon生成的左递归?

时间:2015-04-03 13:33:48

标签: parsing recursion compiler-construction context-free-grammar

我已经看到了这个link。但我有点困惑如何消除这里的ε产生。

我有以下语法

 S-->Sz|Sxw|xw|yw|∈

在删除epsilon产品后,我可以看到语法变为

 S-->Sz|Sxw|xw|yw|z

现在,如果我解决了这个问题,我就得到了以下内容

  S-->xwS`|zS`|ywS`
  S`-->zS`|xwS`|∈

现在我可以看到S - > xwS` | zS`和S` - > zS` | xwS`。这已经变得相同。它是对的还是我在做任何错误?

1 个答案:

答案 0 :(得分:1)

重复的规则没有错。

我在尝试理解语法时经常发现有用的一种方法是将其转换为正则表达式

 S := (xw + yw + z)(z + xw)*

因为它让我对整个语法有了很好的概述,并有助于找到错误。所以如果我把它分成这个:

 S  := (xw + yw + z)S'
 S' := (z + xw)*

它让我更容易看出我是否犯了错误。