編譯原理 - 文法(二)

概述

編譯原理 - 文法(一) 一文中,講了文法分爲四類。該分類標準由喬姆斯基於1956年提出,所以又將其稱爲喬姆斯基層次結構。

這個分類譜系把所有的文法分成四種類型:0型文法、1型文法、2型文法和3型文法。這四種文法類型依次擁有越來越嚴格的產生式規則,所能表達的語言也越來越少。

儘管表達能力比0型文法和1型文法要弱,但由於可以高效率的實現,2型文法和3型文法成爲四類文法中最重要的兩種文法類型。

前置知識

文法分類中涉及的幾個基本概念

  • 字母表 Σ:字母表是字符的非空有窮集合。例如,由26個英文字母組成的集合是一個字母表,字母表中的元素稱爲符號。
  • 字符串的方冪:把字符串 α 自身連接 n 次得到的串,稱爲字符串 α 的 n 次方冪。規定 a0=εεa^0 = ε(ε表示空字符串)

設A、B代表字母表Σ上的兩個字符串集合,基本運算如下:

  • 或(合併):AB={ααAαβ}A∪B=\{α|α∈A或α∈β\}
  • 積(連接):AB={αβαAαβ}AB=\{αβ|α∈A且α∈β\}
  • 克林閉包*:A=A0A1A2A3...An...A^*=A^0∪A^1∪A^2∪A^3...∪A^n∪...
  • 正則閉包+:又稱正閉包,是由克林閉包衍生出的概念。A=A0A+A^*=A^0∪A^+A+=A1A2A3...An...A^+=A^1∪A^2∪A^3...∪A^n∪...

例如,{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=(VT,VN,P,S)G = (V_T, V_N, P, S)的每個產生式 α->β,

  • α(VNVT)+α∈(V_N∪V_T)^+
  • α 至少含有一個非終結符
  • β(VNVT)β∈(V_N∪V_T)^*

則稱G是0型文法。

0型文法的功能相當於圖靈機。任何0型語言都是遞歸可枚舉的;遞歸可枚舉集也必定是一個0型語言。遞歸可枚舉的意思就是,你可以用類似窮舉的算法在有限時間內判定一個元素屬於該集合;對於不屬於該集合的元素,則很可能無法驗證。

一般的文法至少都是0型文法。0型文法的限制最少,所以也稱0型文法爲無限制文法。。

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

在0型文法的基礎上,滿足

  • 對於每一個產生式 α→β(α→ε除外),都有αβ|α|≤|β|(|α| 表示 α 的長度)。

1型文法等價於線性有界自動機。

2型文法(上下文無關文法)

在1型文法的基礎上,滿足

  • 對於每一個產生式 α→β,都有 αVNα∈V_N

簡單的說就是規則左邊只能是非終結符,且只有一個字符。
例如,對於產生式 AaBbAa→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型文法等價於有限狀態自動機。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章