一般的文法至少都是0型文法,也就是說0型文法限制最少。若將0型文法比作基類的話,1、2、3型文法就是不斷繼承並加以限制得到的子類。
文法表示過程中,常用大寫字母表示非終結符VN,而小寫字母表示的是終結符VT。
文法概要
設文法G[S]=(VN,VT,S,P)
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]: S→aT
T→Sb|b
2. L={aibj | j>i≥0}的上下文無關文法
G[S]: S→aSb|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]: S→aBS|bAS|ε
A→bAA|a
B→aBB|b
自己來看的理解與解題過程:
我們規定S 能推導出所有具有相等個數a和b的符號串
S→ε(最簡單的情況,a、b都沒有)
S→a B (其中B 中b的個數比a多一個)
S→b A (其中A中a的個數比b多一個)
這里可以看出,引入兩個非終極符B和A來分別推出相應的后綴。得到S的產生式:
S→aB | bA | e
接下來,對B采用同樣的方法來考慮:
B → b (最簡單的情況,a沒有)
B →b S
B → a BB
於是可得到B的產生式:
B→bS | aBB | b
同樣地,可得到A的產生式:
A→ aS | bAA | a
將三部分放在一起,我們就得到了文法G[S], 如下:
S→aB | bA |e
B→bS | aBB | b
A→aS | bAA | a
[拓展思考]如果將A或B作為開始符號,得到的語言是什么?
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]: S→aA|bB
A→aS|bC|b
B→bS|aC|a
C→bA|aB|ε
[拓展思考:奇數個a和偶數個b、偶數個a和偶數個b、偶數個a和奇數個b又怎么表示呢?]
更多文法構造例子:http://download.csdn.net/download/jave_f/10016955
【附:一文一圖】