第四章 自頂向下的語法分析
重點:自頂向下分析的基本思想,**分析器總體結構,**分析表的構造,遞迴下降分析法基本思想,簡單算術表示式的遞迴下降分析器。
難點:first
和follow
集的求法,對它們的理解以及在構造
ll(1)
分析表時的使用。遞迴子程式法中如何體現分析的結果。
基本概念:
自頂向下分析面臨的問題:
1.二義性問題
n解決辦法
1:改造文法,引入新的文法變數
n解決辦法
2:根據優先順序關係,保證高優先順序運算子優先的原則
2.回溯問題
提取左因子
的方法來改造文法
3.左遞迴引起的無窮推導問題
消除直接左遞迴:
a -> aα1 | aα2 | aα3 | ...... | aαn | β1 | β2 | ...... | βn
改造:a -> β1a' | β2a' | β3a' | ...... | βna'
a' -> α1a' | α2a' | α3a' | ...... | αna' | ε
消除間接左遞迴:
採用代入法將間接左遞迴變為直接左遞迴
採用上面介紹的方法消除直接左遞迴
題型:
1.計算表示式文法的語法符號的first集
如果是終結符號,則,firstrug(x) :=
如果是變數,尋找候選式第乙個是否是終結符
如果第乙個是乙個變數則包含該變數的first集合
first(x) += ( first(y) - )
如果y可以推導為 ε 則包含下乙個語法變數的first 集合
2.計算表示式文法的語法變數的follow集
follow(s ) :=
如果 a -> αbβ 則 follow(b) += first(β) -
如果 a -> αb 則 follow(b) += follow(a)
如果 a -> αbβ 且 β =>(*) ε, a ≠ b 則 follow(b) += follow(a)
3.**分析法:
1. 構造文法
2. 改造文法:消除二義性、消除左遞迴、提取左因子
3. 求每個候選式的
first
集和變數的
follow集
4. 檢查是不是
ll(1)文法
若不是 ll(1),
說明文法的複雜性超過自頂向下方法的分析能力,需要附加新的「資訊」
5. 構造**分析表
6. 實現**分析器
4.錯誤處理:
測試:
設有如下文法g:
e =>te』
e』 => +e |ε
t => ft』
t』 => t |ε
f => pf』
f』 => *f |ε
p => (e)| a |∧
(1)
求該文法各語法變數的
first
集和follow集
(2)
該文法是否為
ll(1)
文法?若是,構造其
ll(1)
分析表
1.first(p) =
first(f) = first(p) =
first(t) = first(f) =
first(e) = first(t) =
first(e『) =
first(f') =
first(t') = first(t) ∪ =
follow(e') = follow(e) =
follow(e) = follow(e') ∪ =
follow(t) = ( fiirst(e') - ε ) ∪ follow(t') ∪ follow(e) =
follow(t') = follow(t) =
follow(f') = follow(f) =
follow(f) = ( first(t') - ) ∪ follow(f') ∪ follow(t) =
follow(p) = ( first(f') - ) = {} ∪ follow(f) = 2.
見部落格:
編譯原理 自頂向下分析
從頂部的根節點到底部的葉節點分析方法叫做自頂向下分析。我們知道頂部的根節點可以表示成乙個文法的開始符號s,所以說,自頂向下分析可以看成是從文法的開始符號s推導出詞串w的過程。例如,我們以輸入id id id 為例分析自頂向下的分析方法。首先從開始符號e 也就是樹的根節點 開始推導。首先用第乙個產生式...
編譯原理之自頂向下分析
編譯原理之自頂向下分析 daywolf原創 自頂向下分析演算法通過最左推導中描敘出各個步驟來分析記號串輸入,一般用遞迴下降分析和ll 1 分析。其中ll 1 分析表示從左向右地處理輸入,它為輸入串描述乙個最左推導,只用乙個符號來 分析的方向。現在在一般的程式裡都是使用ll 1 分析方法,我們在這裡就...
編譯原理 自頂向下語法分析
對於任何輸入串,從文法開始符號 根節點 出發,自上而下,從左到右地為輸入串建立語法分析樹。簡而言之,就是尋找輸入串的最左推導的過程。之前我們了解到,一旦有左遞迴存在便無法構建這樣的語法樹,所以用自頂向下語法分析必須先去除左遞迴。同樣,由於使用最左推導,也不能處理有複雜回溯的輸入串。自頂向下的語法分析...