標籤:

編譯原理(四)

編譯原理(四)

(一)自頂向下分析

從分析樹的頂部(根節點)向底部(葉節點)方向構造分析樹

可以看成是從文法開始符號S推導出詞串w的過程

每一步推導中,都需要做兩個選擇

替換當前句型中的哪個非終結符

用該非終結符的哪個候選式進行替換

1.最左推導

在最左推導中,總是選擇每個句型的最左非終結符進行替換

如果S =>*lm α,則稱α是當前文法的最左句型(left-sentential form)

2.最右推導

在最右推導中,總是選擇每個句型的最右非終結符進行替換

在自底向上的分析中,總是採用最左歸約的方式,因此把最左

歸約稱為規範歸約,而最右推導相應地稱為規範推導

3.自頂向下的語法分析採用最左推導方式

總是選擇每個句型的最左非終結符進行替換

根據輸入流中的下一個終結符,選擇最左非終結符的一個候選式

4.自頂向下語法分析的通用形式

遞歸下降分析(Recursive-Descent Parsing)

由一組過程組成,每個過程對應一個非終結符(也就是說文法中有多少個非終結符,就有多少個過程)

從文法開始符號S對應的過程開始,其中遞歸調用文法中其它非終結符對應的過程。如果S對應的過程體恰好掃描了整個輸入串,則成功完成語法分析

5.預測分析( Predictive Parsing)

預測分析是遞歸下降分析技術的一個特例,通過在輸入中向前看固定個數(通常是一個)符號來選擇正確的A-產生式。

可以對某些文法構造出向前看k個輸入符號的預測分析器,該類文法有時也稱為LL(k) 文法類

預測分析不需要回溯,是一種確定的自頂向下分析方法

(二)文法轉換

(1) 含有A→Aα形式產生式的文法稱為是直接左遞歸的(immediate left recursive)

(2)如果一個文法中有一個非終結符A使得對某個串α存在一個推導A=>+Aα ,那麼這個文法就是左遞歸的

(3)經過兩步或兩步以上推導產生的左遞歸稱為是間接左遞歸的

1.消除直接左遞歸

2.消除間接左遞歸

3.提取左公因子( Left Factoring )

消除多個候選式相同的前綴

(三)L L ( 1 ) 文法

從文法開始符號出發,在每一步推導過程中根據當前句型的最左非終結符A和當前輸入符號a,選擇正確的A-產生式。為保證分析的確定性,選出的候選式必須是唯一的。

1.非終結符的後繼符號集

可能在某個句型中緊跟在A後邊的終結符a的集合,記為FOLLOW(A)

FOLLOW(A)={a| S =>* αAaβ, a∈Vt,α,β∈(Vt∪Vn)*}

2.產生式的可選集

產生式A→β的可選集是指可以選用該產生式進行推導時對應的輸入符號的集合,記為SELECT( A→β )

SELECT( A→aβ ) = { a }

SELECT( A→ε )=FOLLOW( A )

q_文法

每個產生式的右部或為ε ,或以終結符開始

具有相同左部的產生式有不相交的可選集

3.串首終結符集

串首終結符:串首第一個符號,並且是終結符。簡稱首終結符

給定一個文法符號串α, α的串首終結符集FIRST(α)被定義為可以從α推導出的所有串首終結符構成的集合。如果α =>* ε,那麼ε也在FIRST(α)中

產生式A→α的可選集SELECT

如果ε?FIRST(α), 那麼SELECT(A→α)= FIRST(α)

如果ε∈FIRST(α), 那麼SELECT(A→α)=( FIRST(α)-{ε} )∪FOLLOW(A)

4.LL(1)文法

文法G是LL(1)的,當且僅當G的任意兩個具有相同左部的產生式A → α | β 滿足下面的條件:

如果α 和β均不能推導出ε ,則FIRST (α)∩FIRST (β) =Φ

α 和β至多有一個能推導出ε

如果β =>* ε,則FIRST (α)∩FOLLOW(A) =Φ;

如果α =>* ε,則FIRST (β)∩FOLLOW(A) =Φ;

推薦閱讀:

編譯原理(五)
具有 e動作的NFA到DFA確定化演算法
詞法分析器
編譯原理(3)

TAG:編譯原理 |