简化lambda-productions,一元规则和语法的无用符号

时间:2016-10-16 14:43:31

标签: grammar context-free-grammar computation-theory

我知道这不是一般性的问题,但我想知道如何用一个我已经开始工作的例子来做到这一点。一眼就说:

我有以下语法。我试图简化它,但我不确定它的正确性,是否有人可以帮我确认它是否正确?

S -> BC | lambda
A -> aA | lambda
B -> bB
C -> c

如果我必须简化语法,我首先应用lambda-eliminations,我有类似的东西:

S -> BC | B | C
A -> aA | a
B -> bB
C -> c

最后我必须消除无用的符号: 首先,我消除那些没有生产力的那些,然后是那些不可保存的那些......

S -> BC | bB | C
A -> aA | a
B -> bB  ---> non-productive
C -> c

S -> C | b | C
A -> aA | a --> unreacheable
C -> c

最后我有这样的东西,我消除了C因为是不必要的,我也消除了BC因为被淘汰所以应该是这样的:     S - > b | ç

但如果我老实说我不会认为我所做的事情是对的,但我并不确切

1 个答案:

答案 0 :(得分:0)

看起来您的简化可能存在一些问题 - 或者我在跟踪它时遇到了问题。我将完成我的工作,并与您的理解进行比较。

S -> BC | lambda
A -> aA | lambda
B -> bB
C -> c

我认为目标是消除尽可能多的lambda和非终端符号。首先要注意的是,如果不改变语言,就无法消除生产S -> lambda;但是可以消除所有其他lambda制作。我们看到另一个生产,所以我们确信它可以被淘汰。我们如何消除A -> lambda

我们注意到A无法从S(起始符号)无法访问。因此,我们可以通过完全取消A -> lambda来轻松消除A。我们得出了这个更简单,等效的语法:

S -> BC | lambda
B -> bB
C -> c

现在,我们的目标是消除非终端符号(我们已经删除了所有无关的-> lambda作品),我们可以查看SBC 。我们知道我们需要一个开始符号,所以我们不妨保持SB只能生成bB,其中包含非终端;并且bB永远不会导致一串只有非终端。 B是非生产性的,我们可以消除它。当我们消除一个非生产性符号时,它所出现的任何连接术语也必须被消除,因为连接表达式永远不会到达只有非终端的字符串(任何连接的表达式,其中出现非生产性符号也是非生产性的): / p>

S -> lambda
C -> c

将我们的分析应用于C,我们很容易看到它与最初的A一样无法访问,因此可以以相同的方式将其删除:

S -> lambda

这个语法用最简单的术语表示,对于语言{lambda}的非终端符号和作品而言是最小的。

相关问题