編譯原理學習筆記·關於四種文法的理解以及 如何根據語言描述給出正則式或相應文法


首先要說明的是:
一般的文法至少都是0型文法,也就是說0型文法限制最少。若將0型文法比作基類的話,1、2、3型文法就是不斷繼承並加以限制得到的子類。
文法表示過程中,常用大寫字母表示非終結符VN,而小寫字母表示的是終結符VT

文法概要

設文法G[S]=VNVTSP

0型文法(對應圖靈機)

  • 如果它的每個產生式α→β是這樣一種結構:α∈(VN∪VT)*且至少含有一個非終結符,而β∈(VN∪VT)*,則G[S]是一個0型文法。
  • 0型文法也稱短語文法,記為PSG。
  • 一個非常重要的理論結果是:0型文法的能力相當於圖靈機。或者說,任何0型文語言都是遞歸可枚舉的,反之,遞歸可枚舉集必定是一個0型語言。

1型文法(對應線性界線自動機,自然語言)

  • 它是在0型文法的基礎上每一個α→β,都有|β|>=|α|。這里的|β|表示的是β的長度。
  • 注意:雖然要求|β|>=|α|,但有一特例:α→ε也滿足1型文法。
  • 1型文法也叫上下文有關文法,記為CSG。
  • 此文法對應於線性有界自動機。

2型文法(對應下推自動機,程序設計語言)

  • 2型文法是在1型文法的基礎上,再滿足:每一個α→β都有α是非終結符。
  •  2型文法也叫上下文無關文法,記為CFG。
  • 此文法對應於下推自動機。

3型文法(對應有限自動機)

  • 它是在2型文法的基礎上滿足:A→α|αB(右線性)或A→α|Bα(左線性)。
  • 3型文法也叫正規文法,記為RG。
  • 此文法對應於有限狀態自動機。

四類文法的關系與區別

       1~3型文法都屬於0型文法,2、3型文法不一定屬於1型文法(如果存在A→ε的產生式,則不屬於1型文法),3型文法屬於2型文法。四類文法區別如下:

          (1)1型文法中不允許有形如A→ε的產生式存在,而2、3型文法則允許出現。

          (2)0、1型文法產生式左部存在含有終結符的符號串或兩個以上的非終結符,而2、3型文法的產生式左部只允許是單個非終結符號。

 

Eg.判斷該產生式 S-> aSb|ab對應的文法。

 

關於正規表達式與上下文無關文法

         正規表達式所描述的語言結構均可以用上下文無關文法描述,反之則不一定。


(一)、正規表達式

1. S={0,1},沒有連續兩個1的0和1組成的串集合 。

(10|0)*(1|e)


2. S={a,b,c} ,包含至少一個a和一個b的串集合。

c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)*

 

3. S={0,1},使每對相鄰的0都出現在任何一對相鄰的1之前的所有01串集合。

(10|0)*|(1|e)(01|1)* |(0|e)


[分析]這題換個說法來理解就是“如果出現任意一對相鄰的1,那么它后面必然不會出現相鄰的0”。首先,我們將這個01串拆成前后兩個部分來考慮,首先給出沒有連續兩個1的01串的前綴,則這樣表示(10|0)*|(1|e),這時需要考慮后面尾部的情況有兩種:

  •  一種是沒有一對相鄰的1,那么之前表示足以。
  • 另一種是存在若干對相鄰的1,那么則用(01|1)* |(0|e) 來表示。

4. S={0,1} ,不包含101作為子串的集合。

0*|0*11*|0*11*0|(0*11*00)*(0*11*|0*11*0|e)



(二)、文法

按指定類型,給出語言的文法。

1. L={anbn | n≥1}的上下文無關文法

G[S]:   SaT

TSb|b

 

2. L={aibj | j>i≥0}的上下文無關文法

G[S]:   SaSb|Sb|b

 

3.由相同個數a和b組成句子的無二義文法

官方標配答案:

我們用一個非終結符A代表一個a(即有A→a),用一個非終結符B代表一個b(即有B→b);為了保證a和b的個數相同,則在出現一個a時應相應地出現一個B,出現一個b時則相應出現一個A。假定已推導出bA,如果下一步要推導出連續兩個b時,則應有bAbbAA。也即為了保證b和A的個數一致,應有A→bAA;同理有B→aBB。此外,為了保證遞歸地推出所要求的ab串,應有S→aBS和S→bAS。由此得到無二義文法G[S]為    

G[S]:   SaBS|bAS|ε

AbAA|a

BaBB|b


自己來看的理解與解題過程:

我們規定S 能推導出所有具有相等個數a和b的符號串

S→ε(最簡單的情況,a、b都沒有)

S→a B (其中B 中b的個數比a多一個)

S→b A (其中A中a的個數比b多一個)

這里可以看出,引入兩個非終極符B和A來分別推出相應的后綴。得到S的產生式:

SaB | bA | e

 

接下來,對B采用同樣的方法來考慮:

      B b (最簡單的情況,a沒有)

      B b S

      B a BB

於是可得到B的產生式:

BbS | aBB | b

 

同樣地,可得到A的產生式:

A aS | bAA | a

 

將三部分放在一起,我們就得到了文法G[S], 如下:

SaB | bA |e

BbS | aBB | b

AaS | bAA | a

[拓展思考]如果將AB作為開始符號,得到的語言是什么?


4. 字母表Σ={a,b}上的同時只有奇數個a和奇數個b的所有串的集合的正規文法。

為了構造字母表Σ={a,b}上同時只有奇數個a和奇數個b的所有串集合的正規式,我們畫出如圖所示的DFA,即由開始符S出發,經過奇數個a到達狀態A,或經過奇數個b到達狀態B;而由狀態A出發,經過奇數個b到達狀態C(終態);同樣,由狀態B出發經過奇數個a到達終態C。由圖可直接得到正規文法G[S]如下: 


G[S]:   SaA|bB 

AaS|bC|b 

BbS|aC|a      

CbA|aB|ε

[拓展思考:奇數個a和偶數個b、偶數個a和偶數個b、偶數個a和奇數個b又怎么表示呢?]

更多文法構造例子:http://download.csdn.net/download/jave_f/10016955




【附:一文一圖】



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM