Grammar 简化lambda产生式、一元规则和语法的非有用符号

Grammar 简化lambda产生式、一元规则和语法的非有用符号,grammar,context-free-grammar,computation-theory,Grammar,Context Free Grammar,Computation Theory,我知道这不是一个一般性的问题,但我想知道如何用一个我已经研究过的例子来解决这个问题。我曾经说过: 我有以下语法。我试图简化它,但我不确定它的正确性,有人能帮我确认它是否正确吗 S -> BC | lambda A -> aA | lambda B -> bB C -> c 如果我必须简化语法,我首先应用lambda消去法,其中我有如下内容: S -> BC | B | C A -> aA | a B -> bB C -> c 最后,我必须消除无

我知道这不是一个一般性的问题,但我想知道如何用一个我已经研究过的例子来解决这个问题。我曾经说过:

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

S -> BC | lambda
A -> aA | lambda
B -> bB
C -> c
如果我必须简化语法,我首先应用lambda消去法,其中我有如下内容:

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|c


但是如果我诚实的话,我不认为我所做的是正确的,但我不知道确切的情况。看起来你的简化可能有一些问题,或者我很难理解。我会把我要做的和你的理解做比较

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

我们注意到,
A
无法从开始符号
S
访问。因此,我们可以很容易地通过完全消除
A
来消除
A->lambda
。我们得出了更简单、等效的语法:

S -> BC | lambda
B -> bB
C -> c
现在,由于我们的目标是消除非终端符号(我们已经消除了所有无关的
->lambda
产品),我们可以看看
S
B
C
。我们知道我们需要一个开始符号,所以我们最好保持
S
B
只能生成
bB
,包含非终端;而且,
bB
永远不会导致一个只有非终端的字符串<代码>B是无效的,我们可以消除它。当我们消除非生产性符号时,它出现的任何连接项也必须消除,因为连接表达式永远不会到达仅包含非终端的字符串(出现非生产性符号的任何连接表达式也是非生产性的):

将我们的分析应用于
C
,我们很容易发现它与
A
最初一样不可接近,因此可以用同样的方法消除它:

S -> lambda

这个语法用最简单的术语来说,在语言
{lambda}

的非终端符号和结果方面是最小的。看起来你的简化可能有一些问题,或者我很难理解。我会把我要做的和你的理解做比较

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

我们注意到,
A
无法从开始符号
S
访问。因此,我们可以很容易地通过完全消除
A
来消除
A->lambda
。我们得出了更简单、等效的语法:

S -> BC | lambda
B -> bB
C -> c
现在,由于我们的目标是消除非终端符号(我们已经消除了所有无关的
->lambda
产品),我们可以看看
S
B
C
。我们知道我们需要一个开始符号,所以我们最好保持
S
B
只能生成
bB
,包含非终端;而且,
bB
永远不会导致一个只有非终端的字符串<代码>B是无效的,我们可以消除它。当我们消除非生产性符号时,它出现的任何连接项也必须消除,因为连接表达式永远不会到达仅包含非终端的字符串(出现非生产性符号的任何连接表达式也是非生产性的):

将我们的分析应用于
C
,我们很容易发现它与
A
最初一样不可接近,因此可以用同样的方法消除它:

S -> lambda

该语法用最简单的术语表示,并且对于语言
{lambda}

而言,就非终结符符号和结果而言,它是最小的。如果非终结符是非生产性的,那么引用该非终结符的任何结果也是非生产性的。你不能假装它派生一个空字符串。如果一个非终端是非生产性的,那么引用该非终端的任何生产也是非生产性的。你不能假装它派生了一个空字符串。非常感谢你的回答非常清楚和完整!非常感谢您的回答,非常清晰完整!