1. 程式人生 > >編譯原理之文法

編譯原理之文法

文法:以有窮的集合描述無窮的計劃的工具。

字母表:元素的非空有窮集合,其中的元素稱為符號,因此也叫符號集。符號串:由字母表中的元素組成的任何有窮序列,串中的元素個數叫做符號串的長度,空符號串ε,長度為0。符號串的運算: 連線-符號串x = ab,y=cd, xy = abcd 方冪-z=xn,當n = 0, z = ε,當 n = 2, z = xx 集合的閉包-∑* = ∑0 ∪∑1 ∪∑2 ∪…∪∑n ∑+ 為正閉包 = ∑1 ∪∑2 ∪…∪∑n

規則|產生式|生成式,是形如α->β的有序對,讀作α定義為β,相同左部的產生式可縮寫A->a|b|c|d。

文法定義的形式-四元組(Vn,Vt,P,S):

Vn為非終結符集,Vt 為終結符集,P為規則集,S為識別符|開始符,至少要在一個規則中作為左部出現,Vn ∩ Vt = ∅。

直接推導=>, 長度為n(n>=1)的推導+=>,長度為n(n>=0)的推導=>【+在=上面】,v=0S1,w=0011,直接推導:0S1 =>0011,使用規則:S->01,γ=0,δ=1;可以說w是v的直接推導,或者w直接歸約於v,由識別符號S推匯出來的符號串稱為文法的句型,如果該符號串僅由終結符號組成,稱為句子。

G[S]稱為文法,L[G]為文法的集合表示形式 若L[G1] = L[G2],則稱文法G1和G2是等價的。 G[S]:S->0S1,S->01 G[A]:A->0R,A->01,R->A1 L[S]=L[A]={0n1n|n>=1}

根據對文法施加不同的限制,分成4種類型。0型或短語文法:文法的每個產生式α->β都是α、β屬於字符集的閉包區間內且α至少包含有一個非終結符;左邊有非終結符,右邊有終結符;0型文法的能力相當於圖靈機(Turing)。或者說,任何0型語言都是遞迴可列舉的;反之,遞迴可列舉集必定是一個0型語言。1型或上下文有關:α->β均滿足|α|<=|β|, 除了S->ε外;小的推出大的或者相等的;2型或上下文無關:α屬於非終結符集Vn;左邊必須是非終結符,然而一個終結符一個非終結符的組合不是一個非終結符,兩個非終結符的組合就是一個非終結符;3型或正規文法:一個非終結符推出一個終結符,要麼一個非終結符推出一個終結符並且帶一個非終結符; 這右線性與左線性是相互獨立的,不能一會寫一下右線性一會寫一下左線性,這樣拼湊在一起就構成不了3型文法了。要寫就只寫右線性,或者只寫左線性,不能一塊來,分開來就對了; 左邊必須只有一個字元,且必須是非終結符;其右邊最多隻能有兩個字元,且當有兩個字元時必須有一個為終結符而另一個為非終結符。當右邊只有一個字元時,此字元必須為終結符。

描述一種上下文無關的推導工具:句型的推導和語法樹(推導樹) 給定文法G(VN,VT,P ,S),對於G的任何句型都能構造與之關聯的語法樹。這棵樹滿足下面四個條件: ① 每個結點都有一個標記,此標記是V的 一個符號。(說的是節點一定是終結符或非終結符) ② 根的標記是S。(說的是樹根的標記是開始符號S) ③ 若一結點標記A,至少有一個從它出發的分枝,則A肯定在Vn中(說的是如果一個節點有分支的話,這個節點一定是非終結符) ④ 如果標記為A,有n個從它出發的分枝,並且這些分枝的結點的標記(從左到右)為B1, B2,…,Bn,那麼A→B1B2,…,Bn一定是P中的一個產生式。(說的是從A出發的葉子節點從左到右排列,一定是P中規則的一個產生式)1

推導的每一步都是對最左非終結符進行替換,稱為最左推導;最右推導也稱規範推導

句型的分析:自上而下的分析和自下而上的分析。

一個句型的語法樹中任一子樹葉結點所組成的符號串都是該句型的短語;相對於非終結符的短語 如果子樹中不再包含其他的子樹,即A只能推匯出b,而b不能再推出其他的式子,則b為此句型的直接短語;相對於規則的直接短語; 直接短語中的最左直接短語為該句型的控制代碼[最右推導,右句型];某句型的控制代碼; 案例: S -> a|b|(T) T -> TdS|S 證明(Sd(T)db)是S的一個句型,並求出短語,直接短語,控制代碼 此文法的抽象語法樹為:1 由此可得S=(Sd(T)db)為此文法的一個句型: • 短語:S,(T),b,Sd(T),Sd(T)db,(Sd(T)db) • 直接短語:S,(T),b • 控制代碼:S

文法的實用限制: 有害規則:形如U->U的規則,沒用,容易引起二義性; 多餘規則:非終結符不在任意規則的右部出現,不可到達;非終結符不能推匯出終結符,不可終止;