【问题标题】:How to Eliminate Left Recursion having epsilon Production?如何消除具有 epsilon 生产的左递归?
【发布时间】:2015-04-03 13:33:47
【问题描述】:

我已经看到了这个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` 。这已经变得相同了。是对还是我做错了什么??

【问题讨论】:

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


    【解决方案1】:

    重复规则并没有错。

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

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

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

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

    这样可以更轻松地查看我是否犯了任何错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多