概述
在 编译原理 - 文法(一) 一文中,讲了文法分为四类。该分类标准由乔姆斯基于1956年提出,所以又将其称为乔姆斯基层次结构。
这个分类谱系把所有的文法分成四种类型:0型文法、1型文法、2型文法和3型文法。这四种文法类型依次拥有越来越严格的产生式规则,所能表达的语言也越来越少。
尽管表达能力比0型文法和1型文法要弱,但由于可以高效率的实现,2型文法和3型文法成为四类文法中最重要的两种文法类型。
前置知识
文法分类中涉及的几个基本概念
- 字母表 Σ:字母表是字符的非空有穷集合。例如,由26个英文字母组成的集合是一个字母表,字母表中的元素称为符号。
- 字符串的方幂:把字符串 α 自身连接 n 次得到的串,称为字符串 α 的 n 次方幂。规定 a 0 = ε ( ε 表 示 空 字 符 串 ) a^0 = ε(ε表示空字符串) a0=ε(ε表示空字符串)。
设A、B代表字母表Σ上的两个字符串集合,基本运算如下:
- 或(合并): A ∪ B = { α ∣ α ∈ A 或 α ∈ β } A∪B=\{α|α∈A或α∈β\} A∪B={α∣α∈A或α∈β}
- 积(连接): A B = { α β ∣ α ∈ A 且 α ∈ β } AB=\{αβ|α∈A且α∈β\} AB={αβ∣α∈A且α∈β}
- 克林闭包*: A ∗ = A 0 ∪ A 1 ∪ A 2 ∪ A 3 . . . ∪ A n ∪ . . . A^*=A^0∪A^1∪A^2∪A^3...∪A^n∪... A∗=A0∪A1∪A2∪A3...∪An∪...
- 正则闭包+:又称正闭包,是由克林闭包衍生出的概念。 A ∗ = A 0 ∪ A + A^*=A^0∪A^+ A∗=A0∪A+, A + = A 1 ∪ A 2 ∪ A 3 . . . ∪ A n ∪ . . . A^+=A^1∪A^2∪A^3...∪A^n∪... A+=A1∪A2∪A3...∪An∪...
例如, { a , b , c } ∗ = { ε , a , b , c , a a , a b , a c , b a , b b , b c , . . . } \{a, b, c\}^* = \{ε, a, b, c, aa, ab, ac, ba, bb, bc, ...\} {a,b,c}∗={ε,a,b,c,aa,ab,ac,ba,bb,bc,...}
0型文法(短语文法)
若对于四元组 G = ( V T , V N , P , S ) G = (V_T, V_N, P, S) G=(VT,VN,P,S)的每个产生式 α->β,
- α ∈ ( V N ∪ V T ) + α∈(V_N∪V_T)^+ α∈(VN∪VT)+
- α 至少含有一个非终结符
- β ∈ ( V N ∪ V T ) ∗ β∈(V_N∪V_T)^* β∈(VN∪VT)∗
则称G是0型文法。
0型文法的功能相当于图灵机。任何0型语言都是递归可枚举的;递归可枚举集也必定是一个0型语言。递归可枚举的意思就是,你可以用类似穷举的算法在有限时间内判定一个元素属于该集合;对于不属于该集合的元素,则很可能无法验证。
一般的文法至少都是0型文法。0型文法的限制最少,所以也称0型文法为无限制文法。。
1型文法(上下文有关文法)
在0型文法的基础上,满足
- 对于每一个产生式 α→β(α→ε除外),都有 ∣ α ∣ ≤ ∣ β ∣ |α|≤|β| ∣α∣≤∣β∣(|α| 表示 α 的长度)。
1型文法等价于线性有界自动机。
2型文法(上下文无关文法)
在1型文法的基础上,满足
- 对于每一个产生式 α→β,都有 α ∈ V N α∈V_N α∈VN
简单的说就是规则左边只能是非终结符,且只有一个字符。
例如,对于产生式
A
a
→
B
b
Aa→Bb
Aa→Bb 符合1型文法的要求,但不符合2型文法的要求,因为α=Aa,而Ab包含终结符,且包含两个字符。
2型文法等价于下推自动机。
3型文法(正规文法或线性文法)
在2型文法的基础上,满足
- A→α|αB(右线性)或A→α|Bα(左线性)
3型文法分为左线性文法和右线性文法。
- 左线性文法:式子右边的产生是(非终结符 + 终结符)
- 右线性文法:式子右边的产生是(终结符 + 非终结符)
注意,左线性文法和右线性文法不能混用,即所有产生式的格式保持一致。
例如,对于如下产生式:
- A→a
- A→aB
- B→a
- B→cB
则符合3型文法的要求,且属于右线性文法。
对于如下产生式:
- A→a
- A→aB
- B→a
- B→Bc
则不符合三型文法的要求。因为产生式 B→Bc 属于右线性文法,其它产生式属于左线性文法。两种文法不能同时出现在一种语法中。
3型文法等价于有限状态自动机。