先决条件 – 上下文无关语法,简化上下文无关语法
如果所有产生式规则满足以下条件之一,则上下文无关文法 (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 形式。