📜  将上下文无关语法转换为乔姆斯基范式

📅  最后修改于: 2021-09-27 14:51:50             🧑  作者: Mango

先决条件 – 简化上下文无关语法

如果所有产生式规则满足以下条件之一,则上下文无关文法 (CFG) 为乔姆斯基范式 (CNF):

  • 生成终端的非终端(例如;X->x)
  • 一个非终端产生两个非终端(例如;X->YZ)
  • 开始符号生成ε。 (例如;S-> ε)

考虑以下语法,

G1 = {S->a, S->AZ, A->a, Z->z} 
G2 = {S->a, S->aZ, Z->a}

文法 G1 在 CNF 中,因为产生式规则满足为 CNF 指定的规则。然而,语法 G2 不在 CNF 中,因为产生式规则 S->aZ 包含终端后跟不满足为 CNF 指定的规则的非终端。

笔记 –

  • 对于给定的语法,可以有多个 CNF。
  • CNF 生成的语言与 CFG 生成的语言相同。
  • CNF 被用作许多 CFG 算法的预处理步骤,如 CYK(成员算法)、自底向上解析器等。
  • 为了生成长度为 ‘n’ 的字符串w,需要在 CNF 中进行 ‘2n-1’ 生成或步骤。
  • 任何在其语言中没有 ε 的上下文无关文法都具有等效的 CNF。

如何将 CFG 转换为 CNF?

步骤 1.从 RHS 中消除开始符号。
如果开始符号 S 位于语法中任何产生式的 RHS,则创建一个新产生式:
S0->S
其中 S0 是新的开始符号。

步骤 2.消除空、单元和无用的产生式。
如果 CFG 包含空、单元或无用的产生式规则,则消除它们。您可以参考这篇文章来消除这些类型的产生式规则。

步骤 3.如果终端与其他终端或非终端存在,则从 RHS 中删除终端。例如,;产生式规则 X->xY 可以分解为:
X->ZY
Z->x

步骤 4.消除具有两个以上非终端的 RHS。
例如,;产生式规则 X->XYZ 可以分解为:
X->PZ
P->XY

示例 –让我们举一个将 CFG 转换为 CNF 的示例。考虑给定的语法 G1:

S → ASB
A → aAS|a|ε 
B → SbS|A|bb

步骤 1.当开始符号 S 出现在 RHS 上时,我们将创建一个新的产生式规则 S0->S。因此,语法将变为:

S0->S
S → ASB
A → aAS|a|ε 
B → SbS|A|bb

步骤 2.由于文法包含空产生式 A-> ε,将其从文法中移除产生:

S0->S
S → ASB|SB
A → aAS|aS|a 
B → SbS| A|ε|bb

现在,它创建了空产生式 B→ ε,将其从文法中移除产生:

S0->S
S → AS|ASB| SB| S
A → aAS|aS|a 
B → SbS| A|bb

现在,它创建单元产生式 B->A,从语法中删除它会产生:

S0->S
S → AS|ASB| SB| S
A → aAS|aS|a 
B → SbS|bb|aAS|aS|a

此外,从语法中去除单位生产 S0->S 会产生:

S0-> AS|ASB| SB| S
S → AS|ASB| SB| S
A → aAS|aS|a 
B → SbS|bb|aAS|aS|a

此外,从语法中去除单位生产 S->S 和 S0->S 产生:

S0-> AS|ASB| SB
S → AS|ASB| SB
A → aAS|aS|a 
B → SbS|bb|aAS|aS|a

步骤 3.在产生式规则 A->aAS |aS 和 B-> SbS|aAS|aS 中,终端 a 和 b 存在于 RHS 且无终端。从 RHS 中删除它们:

S0-> AS|ASB| SB
S → AS|ASB| SB
A → XAS|XS|a
B → SYS|bb|XAS|XS|a
X →a
Y→b

此外,B->bb 不能成为 CNF 的一部分,将其从语法产量中删除:

S0-> AS|ASB| SB
S → AS|ASB| SB
A → XAS|XS|a
B → SYS|VV|XAS|XS|a
X → a
Y → b
V → b

第 4 步:在产生式规则 S0->ASB 中,RHS 有两个以上的符号,从语法产量中删除它:

S0-> AS|PB| SB
S → AS|ASB| SB
A → XAS|XS|a
B → SYS|VV|XAS|XS|a
X → a
Y → b
V → b
P → AS

类似地,S->ASB 有两个以上的符号,将其从语法产量中删除:

S0-> AS|PB| SB
S → AS|QB| SB
A → XAS|XS|a
B → SYS|VV|XAS|XS|a
X → a
Y → b
V → b
P → AS
Q → AS

类似地,A->XAS 有两个以上的符号,将其从语法中删除:

S0-> AS|PB| SB
S → AS|QB| SB
A → RS|XS|a
B → SYS|VV|XAS|XS|a
X → a
Y → b
V → b
P → AS
Q → AS
R → XA

类似地, B->SYS 有两个以上的符号,将其从语法产量中删除:

S0 -> AS|PB| SB
S → AS|QB| SB
A → RS|XS|a
B → TS|VV|XAS|XS|a
X → a
Y → b
V → b
P → AS
Q → AS
R → XA
T → SY

类似地, B->XAX 有两个以上的符号,将其从语法中移除:

S0-> AS|PB| SB
S → AS|QB| SB
A → RS|XS|a
B → TS|VV|US|XS|a
X → a
Y → b
V → b
P → AS
Q → AS
R → XA
T → SY
U → XA

所以这是给定语法所需的 CNF。