文法
文法的定義
文法:文法是定義和闡明語言的一種規格化方法,也可以說是以有窮的集合刻畫無窮的集合的一種工具
20世紀50年代,美國語言學家喬姆斯基提出一個短語結構文法,同時還根據產生語言的文法的產生式的不同將文法和對應的語言分為三大類
一個短語結構文法(grammer)(簡稱)文法G包括:
- 一個有限集合N,其元素稱為非終結符號
- 一個有限集合T,其元素稱為終結符號
- {(N∪T)* - T*} x (N∪T)* 的一個有限子集P,稱為產生式的集合
- 一個開始符號σ∈N
記作G=(N,T,P,σ)
產生式:產生式(α,β)∈P通常寫成α→β。在產生式中a∈(N∪T)* - T*,於是α至少包含一個非終結符號,而β能夠由終結符號和非終結符號的任意組合構成。
α稱為這個產生式的左部,β稱為這個產生式的右部
文法的推導
(1)設G=(N,T,P,σ)是一個文法,如果α→β是一個產生式且xαy∈(N∪T)* ,這里x,y∈(N∪T)* ,則稱xβy可直接從xαy推導,並寫成xαy=>xβy
(2)如果對於αi∈(N∪T)*(i=1,2,...,n),都有αi+1∈(N∪T)*(i=1,2,...,n-1)可直接從αi推出,則稱αn可從α1推導,並寫成αn=>α1,我們稱α1=>α2=>...=>αn是αn的推導
一個約定:(N∪T)*的任意元素都是自身可推導的。w∈T*稱為文法正確的當且僅當σ=>w
可見推導是是(N∪T)*上的關系,而且具有傳遞性
注意,“文法正確”不一定“語意正確”
文法到語言
由文法G生成的語言是指σ可推導的T上所有字符串組成的集合,記作L(G)
例如:
(1)文法G=({σ},{x},{σ→xσ,σ→x},σ)生成的語言是L(G)={xn | n≥1}
(2)文法G=({σ},{x},{σ→xσ,σ→λ},σ)生成的語言是L(G)={xn | n≥0}
(3)文法G=({σ},{x},{σ→xσy,σ→xy},σ)生成的語言是L(G)={xnyn | n≥1}
文法的等價
如果L(G)=L(G’),則稱文法G和G’等價
例如:
(1)文法G=({σ},{x},{σ→xσ,σ→x},σ)生成的語言是L(G)={xn | n≥1}
(2)文法G=({σ},{x},{σ→σx,σ→x},σ)生成的語言是L(G)={xn | n≥1}
這兩個語言相同,所以這兩個文法等價
文法的分類
設G=(N,T,P,σ)是一個文法並設λ是空串。
- 產生式的兩端無任何限制的為0型文法,0型文法產生的語言稱為0型語言或稱遞歸可數語言
- 如果每個產生式σAβ→αδβ,其中α,β∈(N∪T)*,A∈N,δ∈(N∪T)*-{λ}。則稱G為上下文相關(1型)文法
- 如果每個產生式為A→δ,其中A∈N,δ∈(N∪T)*,則稱G為上下文無關(2型)文法
- 如果每個產生式形式為A→a或A→aB或A→λ,其中A,B∈N,a∈T,則稱G為正則(3型)文法
為什么“1型”文法稱為上下文相關文法?
在上下文相關文法中,產生式σAβ→αδβ表明只有當非終止符號A的前后為α、β的條件下(即所謂的“上下文”),A才可以改寫成δ
而在上下文無關文法中,產生式A→δ表明任何時候都可以將A替換成δ.
正則文法的產生非常簡單,右部為一個終結符號、一個終結符號跟一個非終結符號或者為一個空串
例如:
(1)設N={σ,A,B,C,D,E},T={a,b,c},P={σ→aB,A→aAC,CD→CE,Cc→Dcc},則G={N,T,P,σ}是一個上下文相關文法
(2)G=({σ},{0,1,+,x},{σ→0,σ→1,σ→σ+σ,σ→σxσ}P,σ)是一個上下文無關文法
(3)可以證明L(G)={anbncn | n≥1}不是正則的
(4)N={σ,S},T={a,b},P={σ→bσ,σ→aS,S→bS,S→b},則G={N,T,P,σ}是一個正則文法
分析樹
分析樹(parse tree),也稱作派生樹或具體語法樹,它使用位置根樹的形式描述一個上下文無關文法中句子的推導結果
假設G={N,T,P,σ}是一個上下文無關文法。則
- 對樹中的每一個頂點使用N∪T中的一個符號進行表示
- 跟的標號為σ
- 樹的葉子結點都是終結結點
- 樹的非葉子結點都是非終結結點
- 若頂點A的子女結點從左到右依次B1、B2、... 、Bn,則必有產生式A→B1B2...Bn
- 從左到右讀出每個葉子節點的標號
例如:
正則文法G=(N,T,P,σ),N={σ,S},T={a,b},P={σ→bσ,σ→aS,S→bS,S→b},易知這是一個上下文無關文法
從σ唯一推導的是
$\sigma =>b\sigma =>...=>b^n\sigma \\=>b^naS=>...=>b^nan^{m-1}S\\=>b^nab^m$
看一個具體的例子字符串bba可從σ可推導的,寫成
$\sigma =>b\sigma =>...=>b^n\sigma \\=>b^naS=>...=>b^nan^{m-1}S\\=>b^nab^m$
所以它的分析樹如下:

歧義文法
設G=(N,T,P,σ)是一個上下文無關文法,若存在x∈L(G),使得有兩個(或兩個以上)的分析樹可以產生x,則稱G為一個有歧義的文法,簡稱為歧義文法。
有定理表明:上下文無關文法是否有歧義性是不可判定的。
1961年帕克里(Rohit Parikh)證明一些文法具有固有的歧義性,即每個與之等價的文法都是歧義文法。
參考資料:中國大學mooc 劉鐸 離散數學
