消除epsilon生产

时间:2019-05-19 17:46:45

标签: context-free-grammar automata context-free-language

我对这类问题有疑问。有人可以帮助我吗?

在以下CFG中消除ε产生。

S-> 0X0 | 1Y1 |€

X-> Z | 0

Y-> ZYU | €

Z-> 0Z1 | XZWZ | €

W-> X | Y | 01

1 个答案:

答案 0 :(得分:0)

规则是这样的:如果X-> epsilon,则可以在存在Y-> rXs的地方添加Y-> rs形式的产品,然后消除X-> epsilon。唯一的例外是,如果不从生成的语言中删除空字符串,则无法消除生产S-> epsilon。如果发现某些非终端等效,则应将它们压缩为单个符号,以避免出现循环。

S -> 0X0 | 1Y1 |€
X -> Z | 0
Y -> ZYU | €
Z -> 0Z1 | XZWZ | €
W -> X | Y | 01

我们可以从Y开始

S -> 0X0 | 1Y1 | 11 | epsilon
X -> Z | 0
Y -> ZYU | ZU
Z -> 0Z1 | XZWZ | epsilon
W -> X | Y | 01 | epsilon

让我们继续下一个:

S -> 0X0 | 1Y1 | 11 | epsilon
X -> Z | 0
Y -> ZYU | ZU
Z -> 0Z1 | XZWZ | XZZ | epsilon
W -> X | Y | 01

让我们接下来做Z:

S -> 0X0 | 1Y1 | 11 | epsilon
X -> Z | 0 | epsilon
Y -> ZYU | ZU | YU | U
Z -> 0Z1 | XZWZ | XZZ | 01 | XWZ | XZW | XW | XZ | X
W -> X | Y | 01

我们看到产品X-> Z和Z-> X;因此这些符号是等效的。组合:

S -> 0X0 | 1Y1 | 11 | epsilon
X -> 0 | epsilon | 0X1 | 01 | XW | XX
Y -> XYU | XU | YU | U
W -> X | Y | 01

现在让我们做X:

S -> 0X0 | 1Y1 | 11 | 00 | epsilon
X -> 0 | 0X1 | 01 | W | XX
Y -> XYU | XU | YU | U
W -> X | Y | 01 | epsilon

我们看到产品X-> W和W-> X;因此这些符号是等效的。组合:

S -> 0X0 | 1Y1 | 11 | 00 | epsilon
X -> 0 | 0X1 | 01 | XX | Y | epsilon
Y -> XYU | XU | YU | U

我们再次做X:

S -> 0X0 | 1Y1 | 11 | 00 | epsilon
X -> 0 | 0X1 | 01 | XX | Y
Y -> XYU | XU | YU | U

应该这样做,除非我使用的规则之一是错误的(可以组合等效符号,用于消除epsilon的规则),或者我所做的简化之一是错误的,或者我做出了错误的假设(U是终端,因为它不在产品的LHS上。