我知道这不是一般性的问题,但我想知道如何用一个我已经开始工作的例子来做到这一点。一眼就说:
我有以下语法。我试图简化它,但我不确定它的正确性,是否有人可以帮我确认它是否正确?
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 | ç
但如果我老实说我不会认为我所做的事情是对的,但我并不确切
答案 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
作品),我们可以查看S
,B
和C
。我们知道我们需要一个开始符号,所以我们不妨保持S
。 B
只能生成bB
,其中包含非终端;并且bB
永远不会导致一串只有非终端。 B
是非生产性的,我们可以消除它。当我们消除一个非生产性符号时,它所出现的任何连接术语也必须被消除,因为连接表达式永远不会到达只有非终端的字符串(任何连接的表达式,其中出现非生产性符号也是非生产性的): / p>
S -> lambda
C -> c
将我们的分析应用于C
,我们很容易看到它与最初的A
一样无法访问,因此可以以相同的方式将其删除:
S -> lambda
这个语法用最简单的术语表示,对于语言{lambda}
的非终端符号和作品而言是最小的。