📜  CFG的自动机简化

📅  最后修改于: 2020-12-17 07:49:09             🧑  作者: Mango

简化CFG

如我们所见,各种语言可以有效地由上下文无关的语法表示。并非所有语法都总是经过优化的,这意味着语法可能包含一些额外的符号(非终结符)。有了多余的符号,不必要的增加了语法的长度。简化语法意味着通过删除无用的符号来减少语法。简化语法的属性如下:

  • G的每个变量(即非终结点)和每个终结点都出现在L中某个单词的派生中。
  • X→Y不应有任何产物,其中X和Y是非末端的。
  • 如果ε不是语言L,则不必是X→ε。

让我们详细研究还原过程。/p> ”CFG的简化”

删除无用符号

如果符号未出现在生产规则的右侧并且不参与任何字符串的派生,则它可能是无用的。该符号被称为无用符号。同样,如果变量不参与任何字符串的派生,则可能是无用的。该变量称为无用变量。

例如:

T → aaB | abA | aaT
A → aA
B → ab | b
C → ad

在上面的示例中,变量“ C”将永远不会出现在任何字符串的派生中,因此生产C→ad是无用的。因此,我们将消除它,并以这样的方式编写其他产生式:变量C永远不会从起始变量“ T”到达。

生产A→aA也是无用的,因为没有办法终止它。如果它永远不会终止,那么它就永远不会产生字符串。因此,这种生产永远不能参与任何推导。

为了消除这种无用的生产A→aA,我们将首先找到所有永远不会导致终端字符串的变量,例如变量'A'。然后,我们将删除其中出现变量“ B”的所有产生式。

消除ε产生

类型S→ε的乘积称为ε乘积。这些类型的产生式只能从不生成ε的语法中删除。

步骤1:首先找出所有可归纳的非终端变量,得出ε。

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

步骤3:现在将步骤2的结果与原始产品合并,然后删除ε产品。

例:

保留其含义,从随后的CFG中删除产生的内容。

S → XYX
X → 0X | ε
Y → 1Y | ε

解:

现在,在消除ε产生的同时,我们将删除规则X→ε和Y→ε。为了保留CFG的含义,实际上,每当X和Y出现时,我们实际上都将ε放在右侧。

让我们来

S → XYX

如果右边的第一个X是ε。然后

S → YX

同样,如果RHS中的最后一个X =ε。然后

S → XY

如果Y =ε

S → XX

如果Y和X为ε,

S → X

如果两个X都被ε替换

S → Y

现在,

S → XY | YX | XX | X | Y

现在让我们考虑

X → 0X

如果我们将ε放在X的右侧,

X → 0
X → 0X | 0

同样Y→1Y | 1个

总的来说,我们可以用除去ε的形式重写CFG为

S → XY | YX | XX | X | Y
X → 0X | 0
Y → 1Y | 1

删除单位生产

单位产品是其中一个非终端提供另一个非终端的产品。使用以下步骤删除单元生产:

步骤1:要删除X→Y,请在语法中出现Y→a时将生成X→a添加到语法规则中。

步骤2:现在,从语法中删除X→Y。

步骤3:重复步骤1和步骤2,直到删除所有单元产品。

例如:

S → 0A | 1B | C
A → 0S | 00
B → 1 | A
C → 01

解:

S→C是单位生产。但是,在删除S→C时,我们必须考虑C的作用。因此,我们可以向S添加一条规则。

S → 0A | 1B | 01

同样,B→A也是单位生产,因此我们可以将其修改为

B → 1 | 0S | 00

因此,最终我们可以编写没有单元生产的CFG,如下所示:

S → 0A | 1B | 01
A → 0S | 00
B → 1 | 0S | 00
C → 01