📜  CFG简化

📅  最后修改于: 2020-11-26 10:17:55             🧑  作者: Mango


在CFG中,可能会发生派生字符串不需要所有生产规则和符号的情况。此外,可能会有一些零生产和单位生产。消除这些产生和符号被称为CFG的简化。简化基本上包括以下步骤-

  • 减少CFG
  • 撤除单位生产
  • 删除Null Productions

减少CFG

CFG分为两个阶段-

阶段1-从CFG G推导等效语法G’ ,使得每个变量都推导一些终端字符串。

推导程序

步骤1-包括所有符号W 1 ,它们得出某个终端并初始化i = 1

第2步-包括所有符号,W i + 1的,即导出W I。

步骤3-递增i并重复步骤2,直到W i + 1 = W i为止。

步骤4-包括其中包含W i的所有生产规则。

阶段2-从CFG G’导出等效语法G“ ,以使每个符号以句子形式出现。

推导程序

步骤1-在Y 1中包括起始符号,并初始化i = 1

步骤2-包括可从Y i派生的所有符号Y i + 1 ,并包括已应用的所有生产规则。

步骤3-递增i并重复步骤2,直到Y i + 1 = Y i为止。

问题

找出等效于文法G的简化文法,并具有生成规则P:S→AC | B,A→a,C→c | BC,E→aA | Ë

阶段1-

T = {a,c,e}

规则A→a,C→c和E→aA的W 1 = {A,C,E}

根据规则S→AC W 2 = {A,C,E} U {S}

W 3 = {A,C,E,S} U∅

由于W 2 = W 3 ,我们可以得出G’为-

G’= {{A,C,E,S},{a,c,e},P,{S}}

其中P:S→AC,A→a,C→c,E→aA | Ë

阶段2-

Y 1 = {S}

根据规则S→AC,Y 2 = {S,A,C}

Y 3 = {S,A,C,a,c}来自规则A→a和C→c

Y 4 = {S,A,C,a,c}

由于Y 3 = Y 4 ,我们可以得出G”为-

G” = {{A,C,S},{a,c},P,{S}}

其中P:S→AC,A→a,C→c

撤除单位生产

任何形式为A→B的生产规则,其中A,B∈非终端称为单位生产。

拆卸程序-

步骤1-要删除A→B ,只要语法中出现B→x ,就将产生式A→x添加到语法规则中。 [x∈终端,x可以为Null]

步骤2-从语法中删除A→B

步骤3-从步骤1开始重复,直到删除所有单位产品为止。

问题

从以下移除单元生产-

S→XY,X→a,Y→Z | b,Z→M,M→N,N→a

解决方案

语法中有3个单位产品-

Y→Z,Z→M和M→N

首先,我们将删除M→N。

当N→a时,我们添加M→a,然后M→N被删除。

生产集变为

S→XY,X→a,Y→Z | b,Z→M,M→a,N→a

现在我们将删除Z→M。

当M→a时,我们添加Z→a,然后将Z→M删除。

生产集变为

S→XY,X→a,Y→Z | b,Z→a,M→a,N→a

现在我们将删除Y→Z。

当Z→a时,我们添加Y→a,然后删除Y→Z。

生产集变为

S→XY,X→a,Y→a | b,Z→a,M→a,N→a

现在Z,M和N无法访问,因此我们可以删除它们。

最终的CFG是免费的-

S→XY,X→a,Y→a | b

删除Null Productions

在CFG中,如果产生A→ε或派生以A开头并最终以A结尾的非终结符号‘A’是可为空的变量

ε:A→…….…→ε

拆卸程序

步骤1-找出可得出ε的可为空的非终端变量。

步骤2-对于每个产品A→a ,构造所有产品A→x ,其中x是通过从步骤1中移除一个或多个非末端从‘a’获得的。

步骤3-将原始乘积与步骤2的结果合并,然后删除ε-乘积

问题

从以下项中删除空产生-

S→ASA | aB | b,A→B,B→b | ∈

解决方案

有两个可为空的变量-AB

首先,我们将删除B→ε。

去除B→ε后,生产集变为-

S→ASA | aB | b | a,AεB | b | &epsilon,B→b

现在我们将删除A→ε。

除去A→ε后,生产集变为-

S→ASA | aB | b |一个| SA | AS | S,A→B | b,B→b

这是没有空过渡的最终生产集。