消除Epsilon生成以消除左递归

时间:2014-01-23 15:35:05

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

我遵循从语法中消除左递归的算法。它说如果有任何

删除epsilon产生

我有以下语法

S-->Aa/b

A-->Ac/Sd/∈

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

  1) S-->Aa/a/b

  2)A-->Ac/Sd/c/d

我很困惑a / b进来1)和c / d进来2) 有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

让我们查看规则S->Aa,如果A->∈然后S->∈a只提供S->a,那么我们将获得先前的规则S->Aa|a|b

现在让我们查看给我们A->Ac的规则A->∈cA->c

A->Sd怎么样?我不知道你是如何得到A->d的。如果这是一个规则,那么这个语法(S->Aa & A->d --> "da")接受字符串“da”,但是尝试用原始语法构造这个字符串 - 如果你从S开始并且字符串结束于a,这意味着您必须使用S->Aa,但为了获得"d",您必须使用A->Sd,这会迫使我们拥有另一个"a""b",意味着我们无法构造此字符串,并且规则A->d不正确。