📜  将上下文无关语法转换为 Greibach 范式

📅  最后修改于: 2021-09-27 06:21:41             🧑  作者: Mango

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

如果所有产生式规则满足以下条件之一,则上下文无关文法 (CGF) 是 Greibach 范式 (GNF):

  • 生成终端的非终端(例如;X->x)
  • 一个非终结符生成一个终结符,后跟任意数量的非终结符(例如;X->xX1X2…Xn)
  • 开始符号生成ε。 (例如;S-> ε)

考虑以下语法:

G1 = {S->aA|bB, B->bB|b, A->aA|a} 
G2 = {S->aA|bB, B->bB|ε, A->aA|ε}

语法 G1 在 GNF 中,因为产生式规则满足为 GNF 指定的规则。然而,语法 G2 不在 GNF 中,因为产生规则 B-> ε 和 A-> ε 不满足为 GNF 指定的规则(只有起始符号可以生成 ε)。
笔记 –

  • 对于给定的语法,可以有多个 GNF
  • GNF 生成的语言与 CFG 生成的语言相同

如何将 CFG 转换为 GNF –

步骤 1.将语法转换为 CNF。
如果给定的语法不在 CNF 中,则将其转换为 CNF。您可以参考以下文章将 CFG 转换为 CNF:Converting Context Free Grammar to Chomsky Normal Form

步骤 2.如果存在,则从语法中消除左递归。
如果 CFG 包含左递归,则消除它们。您可以参考以下文章来消除左递归:解析 |第 1 组(介绍、歧义和解析器)

步骤 3.将产生式规则转换为 GNF 形式。
如果任何产生式规则不是 GNF 形式,则转换它们。让我们举一个例子来将 CFG 转换为 GNF。考虑给定的语法 G1:

S → XA|BB 
B → b|SB 
X → b 
A → a

由于 G1 已经在 CNF 中并且没有左递归,我们可以跳过第 1 步和第 2 步,直接进入第 3 步。
产生式规则 B->SB 不在 GNF 中,因此,我们将产生式规则 B->SB 中的 S -> XA|BB 替换为:

S → XA|BB 
B → b|XAB|BBB 
X → b 
A → a

产生式规则 S->XA 和 B->XAB 不在 GNF 中,因此,我们将产生式规则 S->XA 和 B->XAB 中的 X->b 替换为:

S → bA|BB 
B → b|bAB|BBB 
X → b 
A → a

去除左递归(B->BBB),我们得到:

S → bA|BB 
B → bC|bABC
C → BBC| ε
X → b 
A → a

去除空产生(C-> ε),我们得到:

S → bA|BB 
B → bC|bABC|b|bAB
C → BBC|BB
X → b 
A → a

产生式规则 S->BB 不在 GNF 中,因此,我们将产生式规则 S->BB 中的 B → bC|bABC|b|bAB 替换为:

S → bA| bCB|bABCB|bB|bABB 
B → bC|bABC|b|bAB
C → BBC|BB
X → b 
A → a

产生式规则 C->BB 不在 GNF 中,因此,我们将产生式规则 C->BB 中的 B → bC|bABC|b|bAB 替换为:

S → bA| bCB|bABCB|bB|bABB 
B → bC|bABC|b|bAB
C → BBC
C → bCB|bABCB|bB|bABB
X → b 
A → a

产生式规则 C->BBC 不在 GNF 中,因此,我们将产生式规则 C->BBC 中的 B → bC|bABC|b|bAB 替换为:

S → bA| bCB|bABCB|bB|bABB 
B → bC|bABC|b|bAB
C → bCBC|bABCBC|bBC|bABBC
C → bCB|bABCB|bB|bABB
X → b 
A → a

这是语法 G1 的 GNF 形式。