上一章學習的是詞法分析,用正規式描述了單詞符號的結構,用有限自動機構造詞法分析器。但正規式描述能力是有限的,上下文無關文法適用範圍更廣一些,是語法分析的基礎。語法分析辦法分為兩類,一類是自上而下分析法,另一類是自下而上分析法。這一章學習的是自上而下分析法,主要內容是如何消除左遞迴(直接左遞迴和非直接左遞迴)、尋找產生式的first和follow集,學會判斷所給出的文法是不是ll(1)文法,以及構造相應的語法分析表等問題。
主要知識點概括:
自上而下分析面臨的問題1、文法的
左遞迴問題
2、
回溯的不確定性,要求我們將已經完成工作推倒從來,
3、虛假匹配的問題
4、不能準確地確定輸入串中出錯的位置
5、效率低
左遞迴問題的解決
假設原式為
p→pα|β
可以將p的規則改寫為如下非直接左遞迴形式:
p→βp'
p'→αp'|ε
first集:
令文法g是不含左遞迴的文法,對g的非終結符的候選α,定義它的開始符號(終結首符)集合:
集:對文法g的任何非終結符a,定義它的後繼符號集合:
具體做法:
1、對於文法的開始符,置#於follow(s)中
2、若a->αbβ, 則把first (β)-ε加入到follow(b)中
3、若a->αb 是乙個產生式,或 a->αbβ是乙個產生式,而β-> ε,則把follow(a)加入到follow(b)中
不帶回溯的自上而下分析的文法條件(ll(1)文法)
(1)文法不含
左遞迴(2)對於文法中每乙個非終結符a的各個產生式的候選式的first集
兩兩不相交
。即,若
a→α1|α2|…|αn
則
first(αi)∩first(αj)=φ (i≠j)
(3)對於文法中的每個非終結符a,若它的某個候選首符集包含ε,則
first(a)∩follow(a)=φ
如果乙個文法
g滿足以上條件,則稱該文法為ll(1)文法。
這裡,ll(1)中的第1個l代表從左到右掃瞄輸入串,第2個l代表最左推導,1表示分析時每一步只看1個符號。
**分析表的構造——first(x)
1、
若x終結符,則first(x)=
2、
若x為非終結符,且有x->a …的產生式,則把a加入到first(x)中;
若x->y…是乙個產生式,且y為非終結符,則把first (y)-ε加入到first(x)中;
3、
若x->y1y2y3….yk,是產生式, y1y2y3….yi-1是非終結符,而且ε屬於 first (yj)(1<=j<=i-1),則把first (yj)-ε加入到first(x)中;如果ε屬於所有的first (yj),則ε加入到first(x)中。
課後習題分析
習題一
這道題比較簡單,但是包含本章學習的主要內容的應用。第一小題消除左遞迴,直接套公式。
第二小題先找出first集和follow集。first集的定義比較好理解,直接按照定義可以很輕鬆的找出,主要是follow集的定義比較難理解,具體做法如下:
1、對於文法的開始符,置#於follow(s)中
2、若a->αbβ, 則把first (β)-ε加入到follow(b)中
3、若a->αb 是乙個產生式,或 a->αbβ是乙個產生式,而β-> ε,則把follow(a)加入到follow(b)中
看起來還是比較抽象,需要借助例題去理解和掌握,記住b後邊有沒有內容分別使用不同的方法。
然後根據ll(1)文法條件判斷是否為ll(1)文法,對於這道題可以直接看出是ll(1)文法,複雜的就需要比較first集和follow集去判斷了。
first集和follow集找出來,只要理解了定義,**分析表就比較容易寫出來了。
習題二
這道題雖然看起來比較複雜,但步驟和例題一是一樣的。需要注意的是在求first集的時候需要先求後邊的first集,並不一定會按順序求。
第四章 語法分析 自上而下分析
為了判斷乙個輸入串是否符合語法規則,有自上而下的的分析,即從文法的起始符出發進行句子的推導。也有自下而上的規約,即從句子本身出發,進行歸約,看能否把句子規約為到起始符。這一章主要講述的是自上而下的推導。但是乙個文法可能會存在左遞迴,回溯,虛假匹配等等的問題,就會影響推導的效率,浪費大量的精力與時間,...
第四章 語法分析 自上而下的分析
一.本章重點 分析的程式。二.1 如何判斷乙個輸入串是否符合語法規則?1.從文法的起始符出發進行句子的推導,即自上而下的分析 2.從句子本身出發,進行歸約,看能否把句子規約為到起始符,即自下而上的規約 2 基本思想 對任何乙個輸入串,試圖用一切可能的辦法,從文法的開始符號 根節點 出發,根據文法自上...
編譯原理 第四章 語法分析(自上而下分析)
一 感受及總結 語法分析是編譯過程的核心部分,語言的語法結構是用上下文無關描述的。因為自上而下分析可能會存在兩大問題,左遞迴和回溯,所以產生了消除左遞迴和克服回溯的方法 ll 1 分析法。使用ll 1 分析法要涉及first集和follow集,這是重點。當乙個文法滿足ll 1 條件時,就可以構造遞迴...