一.本章重點
**分析的程式。
二.
(1)如何判斷乙個輸入串是否符合語法規則?
1.從文法的起始符出發進行句子的推導,即自上而下的分析
2.從句子本身出發,進行歸約,看能否把句子規約為到起始符,即自下而上的規約
(2).基本思想
對任何乙個輸入串,試圖用一切可能的辦法,從文法的開始符號(根節點)出發,根據文法自上而下地為輸入串建立一棵語法樹,即為輸入串尋找乙個最左推導。
(3).自上而下分析面臨的問題
1. 文法的左遞迴問題
2.回溯的不確定性,要求我們將已經完成工作推倒從來,
3.虛假匹配的問題
4.不能準確地確定輸入串中出錯的位置
5.效率低
三.ll(1)分析法
(1)消除直接左遞迴
設有產生式
p→pα|β(1)
其中β不以p開頭,α不為ε。那麼,我們可以把p的規則改為如下的非直接左遞迴形式:
p→βp』
p'→αp'|ε(2)
(1)式和(2)式是等價的
(2)消除回溯,提左因子
1.消除回溯的要求
(1)若該候選式匹配成功,那麼該匹配不是虛假匹配
(2)若該候選式無法完成最終的匹配任務,則其他任何候選式肯定也無法完成
2.消除回溯的條件
定義first集
令文法g是不含左遞迴的文法,對g的非終結符的候選α,定義它的開始符號(終結首符)集合:
first(α)=
特別地,如果α ε,則ε∈first(α)
如果非終結符a的任意兩個候選式αi和αj的開始符號集滿足first(αi)∩first(αj)=φ,則a可以根據所面臨的第一
個輸入符號,
準確地指派乙個候選式α去執行任務,α是那個first集含a的候選式,即 a ∈first(α)
3.改造文法:提取公共左因子。
(3)ll(1)分析條件
1.定義follow集
對文法g的任何非終結符a,定義它的後繼符號集合:
follow(a)=
1. 特別地,如果s*=>…a,則#∈follow(a)
2. follow(a)集合是所有句型中出現在緊接a之後的終結符號或#所組成的集合
3. 當非終結符a面臨輸入符號a,且a不屬於a的任意候選式的first集但a的某個候選式的first集包含ε時
,只有當
a ∈follow(a),才可能允許a自動匹配
2..不帶回溯的ll(1)文法
(1)文法不含左遞迴
(2)對於文法中每乙個非終結符a的各個產生式的候選式的first集兩兩不相交。即,若
a→α1|α2|…|αn
則first(αi)∩first(αj)=φ (i≠j)
(3)對於文法中的每個非終結符a,若它的某個候選首符集包含ε,則
first(a)∩follow(a)=φ
如果乙個文法g滿足以上條件,則稱該文法g為ll(1)文法(第1個l代表從左到右掃瞄輸入串,第2個l代
表最左推導,1表示分析
時每一步只看1個符號)
3.不帶回溯的自上而下分析的方法
對於ll(1)文法,假設要用非終結符a進行匹配,面臨輸入符號為a,a的所有產生式為
a→α1|α2|…|αn
(1)若a ∈ first(αi) ,則指派αi去匹配
(2)若a不屬於任何乙個候選首符集,則:
①若ε屬於某個 first(αi)且a∈follow(a),則讓a與ε自動匹配;
②否則,a的出現是一種語法錯誤
四.遞迴下降分析構造程式
1. 當乙個文法滿足ll(1)條件時,我們就可以構造乙個不帶回溯的自上而下分析程式,這個分析程式由一組
(可能的)遞迴程式組
成,每個過程對應文法的乙個非終結符。這樣乙個分析程式稱為遞迴下降分析器。
2.具體做法:對文法的每乙個非終結符都編乙個分析程式當根據文法和當時的輸入符號**到要用某個非終
結符去匹配輸入串時,
就呼叫該非終結符的分析程式。
五.**分析程式
1. (1)使用高階語言的遞迴過程描述遞迴下降分析器,只有當具有實現這種過程的編譯系統時才有實際意義。
(2)實現ll(1)分析的另一種有效方式是使用一張分析表和乙個棧進行聯合控制。我們現在介紹的**分析程式
就是屬於這種型別
的ll(1)分析器。
(3)本節要掌握對給定文法構造出每個非終結符的first和follow集合。
2.**分析的過程
(1)ll-自左向右掃瞄、自左向右的分析和匹配輸入串。 所以分析過程表現為最左推導的性質。
(2)符號棧: 有四種情況(
1.開始狀態2.工作狀態3.出錯狀態4.結束狀態)
(3)執行程式
1.把#和文法起始符號e推進棧,並讀入輸入串的第一 個符a,重複下述過程直到正常結束或出錯.
2.測定棧頂符號x和當前輸入符號a,執行如下操作:
(1)若x=a=#,分析成功,停止。e匹配輸入串成功.
(2)若x=a≠#,把x推出棧,再讀入下乙個符號。
(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彈出棧 (不讀下一符號) ,繼續分析。
3.(1)**分析表的構造——first(x)
1. 若x終結符,則first(x)=
2. 若x為非終結符,且有x->a …的產生式,則把a加入到first(x)中;
3.若x->y…是乙個產生式,且y為非終結符,則把first (y)-ε加入到first(x)中;
4.若x->y1y2y3….yk,是產生式, y1y2y3….yi-1是非終結符,而且ε屬於 first (yj)(1<=j<=i-1),則把first (yj)-ε加入到
firs
t(x)中;如果ε屬於所有的first (yj),則ε加入到first(x)中
(2)**分析表的構造——follow(x)
1. 對於文法的開始符,置#於follow(s)中
2.若a->αbβ, 則把first (β)-ε加入到follow(b)中,
3.若a->αb 是乙個產生式,或 a->αbβ是乙個產生式,而β-> ε,則把follow(a)加入到follow(b)中
(3)**分析表的構造
對文法g的每個產生式, a->α,進行下面的處理
1.對每個終結符a,如果a屬於first(α),則把該產生式寫入到m[a,a]
2.若ε屬於first(α),則對任何b屬於follow(a), 把該產生式加入到m[a,b]
3.所有無定義的m[a,a]標上出錯標誌
結論:乙個文法g的**分析表不含多重入口,當且僅當該文法是ll(1)
六.題目應用
七.總結
這章對我來說理解起來有點費勁,尤其對於定義的理解,還有**分析這裡總是犯迷糊,弄混了。沒有乙個好的理解方法。
第四章 語法分析 自上而下分析
為了判斷乙個輸入串是否符合語法規則,有自上而下的的分析,即從文法的起始符出發進行句子的推導。也有自下而上的規約,即從句子本身出發,進行歸約,看能否把句子規約為到起始符。這一章主要講述的是自上而下的推導。但是乙個文法可能會存在左遞迴,回溯,虛假匹配等等的問題,就會影響推導的效率,浪費大量的精力與時間,...
第四章 語法分析 自上而下分析
上一章學習的是詞法分析,用正規式描述了單詞符號的結構,用有限自動機構造詞法分析器。但正規式描述能力是有限的,上下文無關文法適用範圍更廣一些,是語法分析的基礎。語法分析辦法分為兩類,一類是自上而下分析法,另一類是自下而上分析法。這一章學習的是自上而下分析法,主要內容是如何消除左遞迴 直接左遞迴和非直接...
編譯原理 第四章 語法分析(自上而下分析)
一 感受及總結 語法分析是編譯過程的核心部分,語言的語法結構是用上下文無關描述的。因為自上而下分析可能會存在兩大問題,左遞迴和回溯,所以產生了消除左遞迴和克服回溯的方法 ll 1 分析法。使用ll 1 分析法要涉及first集和follow集,這是重點。當乙個文法滿足ll 1 條件時,就可以構造遞迴...