為了判斷乙個輸入串是否符合語法規則,有自上而下的的分析,即從文法的起始符出發進行句子的推導。也有自下而上的規約,即從句子本身出發,進行歸約,看能否把句子規約為到起始符。這一章主要講述的是自上而下的推導。但是乙個文法可能會存在左遞迴,回溯,虛假匹配等等的問題,就會影響推導的效率,浪費大量的精力與時間,為了更加簡便的實現推導,先將文法進行規範化。也就是去除這些問題。
存在的問題
1.
文法左遞迴
當試圖用p去匹配輸入串時,在沒有識別任何輸入符號的情況下,又得重新要求p去進行新的匹配,這樣一來,使推導無限迴圈下去。
(1)直接左遞迴原式:
p→pα1|pα2|…|pαm|β1|β2|…|βn
改為
p→β1p』|β2p』|…|βnp』
p』→α1p』| α2p』|…|αmp』| ε
(2)將間接左遞迴改造為直接左遞迴
將文法中所有如下形式的產生式:
pi →pjγ|β1|β2|…|βn
pj→δ1|δ2|δ3|…|δk
改寫成:
pi →δ1γ|δ2γ|δ3γ|…|δkγ|β1|β2|…|βn
2.回溯
匹配不成功,需要回溯。需要把已經做過的一大堆工作(各種**工作、語義分析等)推倒重來,既費時又費
(1)無回溯文法定義太過於理解起來費力,這就舉例子說明。
對於a→α1|α2|…|αn
如果b ∈first(αi),則用αi去匹配b
first(α1)∩first(α2)∩…∩first(αn)=φ
(2)改造方法:(消除回溯)
提取公共左因子
假設a的產生式為
a→δβ1|δβ2|…|δβn|γ1| γ2|…|γm
其中每個γ不以δ開頭
那麼把這些產生式改寫為:
a→δa』 |γ1| γ2|…|γm
a』→β1|β2|…|βn
3.ll1文法
如果首符集不含有字串中的某個字元但是卻含有空字,而且他的下乙個字元會含有此字元此時只有首符集不能解決問題,就需要follow集了。
特別地,如果s
…a,則#∈follow(a)
ll1符合的條件:
(1)文法不含左遞迴
(2)對於文法中每乙個非終結符a的各個產生式的候選式的first集兩兩不相交。
(3)對於文法中的每個非終結符a,若它的某個候選首符集包含ε,則
first(a)∩follow(a)=φ
4.不帶回溯的自上而下分析的方法
對於ll(1)文法,假設要用非終結符a進行匹配,面臨輸入符號為a,a的所有產生式為
a→α1|α2|…|αn
(1)若a ∈ first(αi) ,則指派αi去匹配
(2)若a不屬於任何乙個候選首符集,則:
①若ε屬於某個 first(αi)且a∈follow(a),則讓a與ε自動匹配;
②否則,a的出現是一種語法錯誤
5.**分析程式
**分析表
1.1 對每個終結符a,如果a屬於first(α),則把該產生式寫入到m[a,a]
1.2若ε屬於first(α),則對任何b屬於follow(a), 把該產生式加入到m[a,b]
1.3所有無定義的m[a,a]標上出錯標誌
棧內操作
2.1若x=a=#,分析成功,停止。e匹配輸入串成功.
2.2若x=a≠#,把x推出棧,再讀入下乙個符號。
2.3若x∈vn,查分析表m。
a) m[x,a]= x→uvw
則將x彈出棧,將uvw壓入
注:u在棧頂 (最左推導)
b) m[x, a] = error 轉出錯處理
c) m[x, a] = x-〉ε ---a為x的後繼符號
則將x彈出棧 (不讀下一符號)
繼續分析。
課後題
大體看了看課後題,大都是這種型別,起碼考察的知識點除了程式設計之外就都是這些了,開始先將文法換成ll1形式,以便於構造首符集和follow集,然後根據這些寫出**分析表,如果**分析表沒有多重入口,那麼 文法符合ll1形式,具體的構造方法都在上述的知識點中體現具體就不在贅述了。
感想:
在寫這篇之前,自己看了一下之前寫的那一篇,描述知識部分大都是自己的語言,而且還沒有分成點來記,造成的後果就是自己有的都看不懂了...所以以後的知識點總結還是按照課本為標準,來總結提煉知識點,課後題我也沒有很多的時間乙個乙個來做,挑的都是些可以基本上概括所有的知識的題目型別,如果沒有這種型別的題目可以自己改一下題目要求,自己練習一下,到達能覆蓋所有知識點的要求,以便於以後的複習.
第四章 語法分析 自上而下分析
上一章學習的是詞法分析,用正規式描述了單詞符號的結構,用有限自動機構造詞法分析器。但正規式描述能力是有限的,上下文無關文法適用範圍更廣一些,是語法分析的基礎。語法分析辦法分為兩類,一類是自上而下分析法,另一類是自下而上分析法。這一章學習的是自上而下分析法,主要內容是如何消除左遞迴 直接左遞迴和非直接...
第四章 語法分析 自上而下的分析
一.本章重點 分析的程式。二.1 如何判斷乙個輸入串是否符合語法規則?1.從文法的起始符出發進行句子的推導,即自上而下的分析 2.從句子本身出發,進行歸約,看能否把句子規約為到起始符,即自下而上的規約 2 基本思想 對任何乙個輸入串,試圖用一切可能的辦法,從文法的開始符號 根節點 出發,根據文法自上...
編譯原理 第四章 語法分析(自上而下分析)
一 感受及總結 語法分析是編譯過程的核心部分,語言的語法結構是用上下文無關描述的。因為自上而下分析可能會存在兩大問題,左遞迴和回溯,所以產生了消除左遞迴和克服回溯的方法 ll 1 分析法。使用ll 1 分析法要涉及first集和follow集,這是重點。當乙個文法滿足ll 1 條件時,就可以構造遞迴...