語法分析是編譯過程的核心部分,它的主要作用是根據單詞找出符合語法規則的句子。
自上而下分析的主旨是,對任何乙個輸入串,試圖用一切可能的辦法,從文法的開始符號(根節點)出發,根據文法自上而下地為輸入串建立一棵語法樹,即為輸入串尋找乙個最左推導。本質上是一種試探過程,是反覆使用不同產生式謀求匹配輸入串的過程。
自上而下分析面臨的問題:
1.文法的左遞迴問題,會使分析過程陷入無限迴圈。
2.若匹配不成功,需要回溯。需要把已經做過的一大堆工作(各種**工作、語義分析等)推倒重來,既費時又費力。
3.虛假匹配的問題。由於虛假現象,我們需要更複雜的回溯技術,一般來說,要消除虛假匹配是很困難的。
4.當最終報告分析不成功時,難於知道輸入串中出錯的確切位置。
5.由於帶回溯,實際上才用了一種窮盡一切可能的試探法,因此,效率很低,代價極高。該方法只有理論意義,在實踐上價值不大。
一般的自上而下方法存在回溯,會產生左遞迴(p=>pα),且回溯具有不確定性,可能產生虛假匹配,不能準確地確定輸入串中出錯的位置,效率低。不帶回溯的自上而下分析演算法ll(1)可以消除這些問題。
不帶回溯的文法不能含左遞迴
消除左遞迴:(1
)消除直接左遞迴
:把產生式p→pα1|pα2|…|pαm|β1|β2|…|βn(βi不以p開頭,αi不為ε)改寫成: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;
消除直接左遞迴,化簡改寫後的文法
,去除那些從開始符號出發卻無法到達的非終結符的產生規則。
消除回溯:
要使文法沒有回溯要滿足:(1)用
候選式去匹配字串時,若該候選式匹配成功,那麼該匹配不是虛假匹配
(2)若該候選式無法匹配,則其他任何候選式也無法完成。消除回溯的過程中需要用到終結首符集first集(非終結符α產生式右部的第乙個終結符,若α能推出ε,則ε∈first(α)),如果非終結符a的任意兩個候選式兩兩不相交,即first(αi)∩first(αj)=φ,則a可以為輸入符號a,選擇候選式α(first
集含a的候選式,即 a ∈first(α))完成匹配。當候選式的first集不滿足兩兩不相交時,通過
提取公共左因子
改造文法。為避免ε∈first(α)時自動匹配引起語法錯誤,定義
follow(a)集
(非終結符a後的第乙個終結符或「#」,特別地,如果開始符s能推出…a,則#∈follow(a)。
1.不帶回溯的自上而下分析的文法條件(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個符號)
當乙個文法滿足ll(1)條件時,我們就可以構造乙個不帶回溯的自上而下分析程式,這個分析程式由一組(可能的)遞迴程式組成,每個過程對應文法的乙個非終結符。這樣乙個分析程式稱為遞迴下降分析器。
具體做法:
對文法的每乙個非終結符都編乙個分析程式,當根據文法和當時的輸入符號**到要用某個非終結符去匹配輸入串時,就呼叫該非終結符的分析程式。
ll-自左向右掃瞄、自左向右的分析和匹配輸入串。分析過程表現為最左推導的性質。該過程由分析表、總控程式、符號棧三部分組成。由於最左推導,進棧過程是逆序的。
2.**分析表的構造——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)-ε加入到first(x)中;如果ε屬於所有的first (yj),則ε加入到first(x)中。
3.**分析表的構造——follow(x)
(1)對於文法的開始符,置#於follow(s)中;
(2)若a->αbβ, 則把first (β)-ε加入到follow(b)中;
(3)若a->αb 是乙個產生式,或 a->αbβ是乙個產生式,而β-> ε,則把follow(a)加入到follow(b)中。
4.構造分析表的演算法:
對文法g的每個產生式, a->α,進行下面的處理
對每個終結符a,如果a屬於first(α),則把該產生式寫入到m[a,a]
若ε屬於first(α),則對任何b屬於follow(a), 把該產生式加入到m[a,b]
所有無定義的m[a,a]標上出錯標誌
總結:這一章內容難度有點大,求first集和follow集是重點,做題目的時候很容易出錯,因此需要很仔細。通過對本章的學習,對於**分析法的語法分析程式和遞迴子程式的區別與聯絡有了一定認知了解,還有一部分內容沒有弄懂,還需課下多看多理解。
編譯原理 第四章 語法分析(自上而下分析)
一 感受及總結 語法分析是編譯過程的核心部分,語言的語法結構是用上下文無關描述的。因為自上而下分析可能會存在兩大問題,左遞迴和回溯,所以產生了消除左遞迴和克服回溯的方法 ll 1 分析法。使用ll 1 分析法要涉及first集和follow集,這是重點。當乙個文法滿足ll 1 條件時,就可以構造遞迴...
編譯原理第四章 語法分析 自上而下分析
語法分析分為兩部分 自上而下的推導,和自下而上的規約。第四章講述的是自上而下的推導,主要內容包括文法的改造,ll分析和lr分析。語法分析是編譯過程的核心部分,它的任務是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規範。它的基本思想是為輸入串尋找乙個最左推導,是乙個反覆使用...
第四章 語法分析 自上而下分析
為了判斷乙個輸入串是否符合語法規則,有自上而下的的分析,即從文法的起始符出發進行句子的推導。也有自下而上的規約,即從句子本身出發,進行歸約,看能否把句子規約為到起始符。這一章主要講述的是自上而下的推導。但是乙個文法可能會存在左遞迴,回溯,虛假匹配等等的問題,就會影響推導的效率,浪費大量的精力與時間,...