語法分析是編譯過程的核心部分,它的主要作用是根據單詞找出符合語法規則的句子。語法分析通常分為兩類:自上而下分析和自下而上分析。本章介紹前者。
自上而下分析的主旨是,對任何乙個輸入串,試圖用一切可能的辦法,從文法的開始符號(根節點)出發,根據文法自上而下地為輸入串建立一棵語法樹,即為輸入串尋找乙個最左推導。本質上是一種試探過程,是反覆使用不同產生式謀求匹配輸入串的過程。
自上而下分析也面臨很多問題:
1.文法的左遞迴問題,會使分析過程陷入無限迴圈。
2.若匹配不成功,需要回溯。需要把已經做過的一大堆工作(各種**工作、語義分析等)推倒重來,既費時又費力。
3.虛假匹配的問題。由於虛假現象,我們需要更複雜的回溯技術,一般來說,要消除虛假匹配是很困難的。
4.當最終報告分析不成功時,難於知道輸入串中出錯的確切位置。
5.由於帶回溯,實際上才用了一種窮盡一切可能的試探法,因此,效率很低,代價極高。該方法只有理論意義,在實踐上價值不大。
由於自上而下分析方法不允許文法含有任何左遞迴。為構造不帶回溯的自上而下演算法,首先要消除文法的左遞迴性。
直接用用右遞迴代替左遞迴:
設有產生式
p→pα|β (1)
其中β不以p開頭,α不為ε。那麼,我們可以把p的規則改為如下的非直接左遞迴形式:
p→βp』
p』→αp』|ε (2)
(1)式和(2)式是等價的
消除間接左遞迴:
(1)將間接左遞迴改造為直接左遞迴
(2)消除直接左遞迴
p→pα1|pα2|...|pαm|β1| β2|...| βn
消除p的左遞迴
p→ β1p'| β2p'|...| βnp'
p'→α1 p'| α2 p'|...|αm p'| ε
(3)化簡改寫後的文法,即去除那些從開始符號出發卻永遠無法到達的非終結符的產生規則。
最終得到無左遞迴的文法。
欲構造行之有效的自上而下分析器,必須消除回溯。把乙個文法改造成任何非終結符的所有候選首符兩兩不相交就可以消除回溯。其辦法是,提取公共左因子。經過反覆的提取左因子,就可達到目的。
不帶回溯的自上而下分析的文法條件(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-自左向右掃瞄、自左向右的分析和匹配輸入串。分析過程表現為最左推導的性質。該過程由分析表、總控程式、符號棧三部分組成。由於最左推導,進棧過程是逆序的。
最後是關於構造**分析表:
構造first集:
1.若x終結符,則first(x)=
2.若x為非終結符,且有x->a…的產生式,則把a加入到first(x)中;
3.若x->y…是乙個產生式,且y為非終結符,則把first(y)-ε加入到first(x)中;
若x->y1y2y3….yk,是產生式, y1y2y3….yi-1是非終結符,而且ε屬於first (yj)(1<=j<=i-1),則把first (yj)-ε加入到first(x)中;如果ε屬於所有的first (yj),則ε加入到first(x)中
構造follow集:
對於文法的開始符,置#於follow(s)中
若a->αbβ, 則把first (β)-ε加入到follow(b)中,
若a->αb 是乙個產生式,或 a->αbβ是乙個產生式,而β-> ε,則把follow(a)加入到follow(b)中
構造分析表的演算法:
對文法g的每個產生式, a->α,進行下面的處理
對每個終結符a,如果a屬於first(α),則把該產生式寫入到m[a,a]
若ε屬於first(α),則對任何b屬於follow(a), 把該產生式加入到m[a,b]
所有無定義的m[a,a]標上出錯標誌
應用:
這一章較前面內容複雜,做起題來有些吃力。通過做課後習題,我感覺對於求first集和follow集很重要。位次查閱了資料,但是網上說的感覺都有點不同,但是照著來做題勉強能做出來,但是對於求follow集有時還是會有些失誤。對於構造分析表也還是需要進一步的鑽研。
編譯原理第四章總結 語法分析
語法分析是編譯過程的核心部分,主要任務 是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規則。本質是按文法的產生式,識別輸入符號串是否為乙個句子,即判斷能否從文法開始符號出發推導出這個輸入字串。語法分析的過結果是 構造語法樹 按照語法樹的構造過程可分為 自上而下推導,自下而...
編譯原理第四章語法分析內容總結
一 學習內容 本章我們主要學習了語法分析的過程,ll 1 分析法和 分析程式等內容。語法分析是編譯過程的核心部分,它的任務是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規則。此處引入是否符合語法規則的判斷方法 從文法的起始符出發進行句子的推導,或者從概念上講,就是要建立一...
編譯原理第四章 語法分析(自上而下)
語法分析是編譯過程的核心部分,它的主要作用是根據單詞找出符合語法規則的句子。自上而下分析的主旨是,對任何乙個輸入串,試圖用一切可能的辦法,從文法的開始符號 根節點 出發,根據文法自上而下地為輸入串建立一棵語法樹,即為輸入串尋找乙個最左推導。本質上是一種試探過程,是反覆使用不同產生式謀求匹配輸入串的過...