📅  最后修改于: 2020-12-17 07:49:09             🧑  作者: Mango
如我们所见,各种语言可以有效地由上下文无关的语法表示。并非所有语法都总是经过优化的,这意味着语法可能包含一些额外的符号(非终结符)。有了多余的符号,不必要的增加了语法的长度。简化语法意味着通过删除无用的符号来减少语法。简化语法的属性如下:
让我们详细研究还原过程。/p>
如果符号未出现在生产规则的右侧并且不参与任何字符串的派生,则它可能是无用的。该符号被称为无用符号。同样,如果变量不参与任何字符串的派生,则可能是无用的。该变量称为无用变量。
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