计算机编译原理---四种类型文法 - LiberXue|FullStack|独立开发者|jekyll blog|GitHub blog

# 计算机编译原理---四种类型文法

发布时间：2017-05-02 00:00:00 博客分类: debug 阅读次数: comments
文法 (2) 编译原理 (2) 自然语言 (2) 反编译 (1)

# 计算机编译原理---四种类型文法

2017-05-02 00:00:00

文法 (2) 编译原理 (2) 自然语言 (2) 反编译 (1)

乔姆斯基把方法分成四种类型，即0型、1型、2型和3型。这几种文法类型的概念一定要掌握，是一个非常重要的考点。对于这几种文法，一般书上都只有简单的 概念介绍，比较抽象，所以很多学员都没有真正理解。下面我将把概念结合例题进行讲解。

# 0型文法

设G=（VN，VT，P，S），如果它的每个产生式α→β是这样一种结构：α∈(VN∪VT)且至少含有一个非终结符，而β∈(VN∪VT)，则G是一个0型文法。0型文 法也称短语文法。一个非常重要的理论结果是：0型文法的能力相当于图灵机(Turing)。或者说，任何0型文语言都是递归可枚举的，反之，递归可枚举集必定是 一个0型语言。0型文法是这几类文法中，限制最少的一个，所以我们在试题中见到的,至少是0型文法。

# 1型文法

1型文法也叫上下文有关文法，此文法对应于线性有界自动机。它是在0型文法的基础上每一个α→β,都有|β|>=|α|。这里的|β|表示的是β的长度。 注意：虽然要求|β|>=|α|，但有一特例：α→ε也满足1型文法。 如有A->Ba则|β|=2,|α|=1符合1型文法要求。反之,如aA->a，则不符合1型文法。

# 2型文法

2型文法也叫上下文无关文法，它对应于下推自动机。2型文法是在1型文法的基础上,再满足：每一个α→β都有α是非终结符。如A->Ba,符合2型文法要求。 如Ab->Bab虽然符合1型文法要求,但不符合2型文法要求，因为其α=Ab，而Ab不是一个非终结符。

# 3型文法

3型文法也叫正规文法，它对应于有限状态自动机。它是在2型文法的基础上满足:A→α|αB（右线性）或A→α|Bα（左线性）。 如有：A->a,A->aB,B->a,B->cB，则符合3型文法的要求。但如果推导为:A->ab,A->aB,B->a,B->cB或推导为:A->a,A->Ba,B->a,B->cB则不符合3型方法的要求 了。具体的说，例子A->ab,A->aB,B->a,B->cB中的A->ab不符合3型文法的定义,如果把后面的ab,改成“一个非终结符＋一个终结符”的形式（即为aB）就对了 。例子A->a,A->Ba,B->a,B->cB中如果把B->cB改为B->Bc的形式就对了,因为A→α|αB（右线性）和A→α|Bα（左线性）两套规则不能同时出现在一个语法中, 只能完全满足其中的一个,才能算3型文法。

#### 注意：上面例子中的大写字母表示的是非终结符,而小写字母表示的是终结符。

讨论上下文有关语法（context-sensitive grammar）和0型语法（type-0 grammar）。 我们首先讨论上下文有关语法。 上下文有关语法的重写规则P的形式为 φ→ψ， 其中，φ和ψ都是符号串，并且要求|φ|≤|ψ|，也就是ψ的长度不小于φ的长度。 现在有一种形式语言L={anbncn}，它是由n个a，n个b和n个c相互毗连而成的符号串，并且要求n≥1。生成这种语言的语法G是：

         G = {Vn, Vt, S, P}
                     Vn = {S, B, C}
                     Vt = {a, b, c}
                     S = S
                     P:
                        S → aSBC                 ①
                        S → aBC                  ②
                       CB → BC                   ③
                       aB → ab                   ④
                       bB → bb                   ⑤
                       bC → bc                   ⑥
                       cC → cc                   ⑦

从S开始，用规则① n-1次，得到

                  S => an-1S(BC)n-1

然后，用规则②一次，得到

      S => an(BC)n

规则③可以把(BC)n变换成BnCn。例如，如果n=3，则有

           aaaBCBCBC => aaaBBCCBC => aaaBBCBCC => aaaBBBCCC,

这样，便有 ``` S => anBnCn

       接着，用规则④一次，得到
         ```
                       S => anbBn-1Cn
         ```
        然后，用规则⑤n-1次，得到
        ```
                       S => anbnCn
        ```
        然后，用规则⑥一次，得到
        ```
                       S => anbncCn-1
        ```
        最后，用规则⑦n-1次，得到
        ```
                       S => anbncn
        ```
        这就是我们要生成的形式语言。
        这个语法的各个重写规则中,右边的符号数总是大于或者等于左边的符号数,满足条件
        ```
                      |φ|≤|ψ|

    因此，这个语法是上下文有关语法。
    Chomsky指出，上下文有关语法和上下文无关语法之间存在着如下的关系：
    第一，每一个上下文无关语法都包含在上下文有关语法之中。
      在上下文有关语法的重写规则φ→ψ中，φ和ψ都是符号串，当重写规则左边的符号串蜕化为一个单独的非终极符号A时，就有A→ψ，由于ψ是符号串，

因而可用ω代替，即得A→ω，这就是上下文无关语法的重写规则。 第二，存在着不是上下文无关语言的上下文有关语言。例如，Chomsky指出的不能用有限状态语法来生成的语言L3={αα}，也不能用上下文无关语法来生成

。但是，它却可以用上下文有关语法来生成。生成语言L3的语法如下：

    G = {Vn, Vt, S, P}
                       Vn = {S}
                       Vt = {a, b}
                       S = S
                       P:
                          S → aS                      ①
                          S → bS                      ②
                          αS → αα                     ③

在规则③中，α是集合{a, b}上的任意非空符号串，由于αS的长度不大于αα的长度，并且αS不是单个的非终极符号，而是符号串，所以，这个语法不可

能是上下文无关语法，而是上下文有关语法。 例如，形式语言abbabb可以这样来生成：从S开始，用规则①一次，得到S=>aS,用规则②两次，得到S=>abbS，用规则③一次，得到S=>abbabb。 可见，上下文有关语法的生成能力，比有限状态语法和上下文无关语法都强。但是，由于上下文无关语法可以采用Chomsky范式这种有力的手段来实现层次分

析，所以，在自然语言的计算机处理中，人们还是乐于采用上下文无关语法。 最后，我们来讨论0型语法（type-0 grammar）。 0型语法的重写规则是φ→ψ，除了要求φ≠ψ之外，没有任何别的限制。Chomsky证明了，每一个0型语言都是符号串的“递归可枚举集”（recursively

enumerable set）；并且证明，任何一个上下文有关语言同时又是0型语言，而且还存在着不是上下文有关语言的0型语言。因此，上下文有关语言应包含于0型

语言之中，它是0型语言的子集合。 不过，因为0型语法的重写规则几乎没有什么限制，用于描写自然语言颇为困难，它的生成能力太强，会生成难以计数的不合格的句子。所以，在Chomsky的

> 四种类型的语法中，最适合于描述自然语言的还是上下文无关语法。这种语法，我国自然语言处理的学者习惯于把它叫做短语结构语法。 Chomsky的形式语言理论，对于计算机科学发生了重大的影响。Chomsky把他的四种类型的语法分别与图灵机、线性有界自动机、后进先出自动机和有限自动

机等四种类型的自动机（自动机是用来识别语言的抽象机器）联系起来，并且证明了语法的生成能力和语言自动机的识别能力的等价性的四个重要结果：

- ①若一语言能被图灵机识别，则它就能用0型语法生成，反之亦然。
- ②若一语言能被线性有界自动机识别，则它就能用上下文有关语法生成，反之亦然。
- ③若一语言能被后进先出自动机识别，则它就能用上下文无关语法生成，反之亦然。
- ④若一语言能被有限自动机识别，则它就能用有限状态语法生成，反之亦然。 Chomsky的上述结论，提供了关于语言的生成过程和语言的识别过程的极为精辟的见解。这对于计算机程序语言的设计、算法分析、编译技术、图象识别、人

工智能等，都是很有用处的，在自然语言处理中，也发挥了巨大的作用。

本文由 liberxue 创作，采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外，均为本站原创或翻译，转载前请务必署名
最后编辑时间为:2017-05-02 00:00:00