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