编译原理 - 文法(二)

文法及其分类

  • 概述
  • 前置知识
  • 0型文法(短语文法)
  • 1型文法(上下文有关文法)
  • 2型文法(上下文无关文法)
  • 3型文法(正规文法或线性文法)

概述

在 编译原理 - 文法(一) 一文中,讲了文法分为四类。该分类标准由乔姆斯基于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或α∈β\} AB={αα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=A0A1A2A3...An...
  • 正则闭包+:又称正闭包,是由克林闭包衍生出的概念。 A ∗ = A 0 ∪ A + A^*=A^0∪A^+ A=A0A+ A + = A 1 ∪ A 2 ∪ A 3 . . . ∪ A n ∪ . . . A^+=A^1∪A^2∪A^3...∪A^n∪... A+=A1A2A3...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)^+ α(VNVT)+
  • α 至少含有一个非终结符
  • β ∈ ( V N ∪ V T ) ∗ β∈(V_N∪V_T)^* β(VNVT)

则称G是0型文法。

0型文法的功能相当于图灵机。任何0型语言都是递归可枚举的;递归可枚举集也必定是一个0型语言。递归可枚举的意思就是,你可以用类似穷举的算法在有限时间内判定一个元素属于该集合;对于不属于该集合的元素,则很可能无法验证。

一般的文法至少都是0型文法。0型文法的限制最少,所以也称0型文法为无限制文法。。

1型文法(上下文有关文法)

在0型文法的基础上,满足

  • 对于每一个产生式 α→β(α→ε除外),都有 ∣ α ∣ ≤ ∣ β ∣ |α|≤|β| αβ(|α| 表示 α 的长度)。

1型文法等价于线性有界自动机。

2型文法(上下文无关文法)

在1型文法的基础上,满足

  • 对于每一个产生式 α→β,都有 α ∈ V N α∈V_N αVN

简单的说就是规则左边只能是非终结符,且只有一个字符。
例如,对于产生式 A a → B b Aa→Bb AaBb 符合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型文法等价于有限状态自动机。

你可能感兴趣的:(编译原理)