第四章 語法分析 自上而下分析

2021-08-19 03:20:50 字數 2616 閱讀 9433

為了判斷乙個輸入串是否符合語法規則,有自上而下的的分析,即從文法的起始符出發進行句子的推導。也有自下而上的規約,即從句子本身出發,進行歸約,看能否把句子規約為到起始符。這一章主要講述的是自上而下的推導。但是乙個文法可能會存在左遞迴,回溯,虛假匹配等等的問題,就會影響推導的效率,浪費大量的精力與時間,為了更加簡便的實現推導,先將文法進行規範化。也就是去除這些問題。

存在的問題

1.

文法左遞迴

當試圖用p去匹配輸入串時,在沒有識別任何輸入符號的情況下,又得重新要求p去進行新的匹配,這樣一來,使推導無限迴圈下去。

(1)直接左遞迴原式:

p→pα1|pα2|…|pαm|β1|β2|…|βn

改為

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

2.回溯

匹配不成功,需要回溯。需要把已經做過的一大堆工作(各種**工作、語義分析等)推倒重來,既費時又費

(1)無回溯文法定義太過於理解起來費力,這就舉例子說明。

對於a→α1|α2|…|αn

如果b ∈first(αi),則用αi去匹配b

first(α1)∩first(α2)∩…∩first(αn)=φ

(2)改造方法:(消除回溯

提取公共左因子

假設a的產生式為

a→δβ1|δβ2|…|δβn|γ1| γ2|…|γm

其中每個γ不以δ開頭

那麼把這些產生式改寫為:

a→δa』 |γ1| γ2|…|γm

a』→β1|β2|…|βn

3.ll1文法

如果首符集不含有字串中的某個字元但是卻含有空字,而且他的下乙個字元會含有此字元此時只有首符集不能解決問題,就需要follow集了。

特別地,如果s

…a,則#∈follow(a)

ll1符合的條件:

(1)文法不含左遞迴

(2)對於文法中每乙個非終結符a的各個產生式的候選式的first集兩兩不相交。

(3)對於文法中的每個非終結符a,若它的某個候選首符集包含ε,則

first(a)∩follow(a)=φ

4.不帶回溯的自上而下分析的方法

對於ll(1)文法,假設要用非終結符a進行匹配,面臨輸入符號為a,a的所有產生式為

a→α1|α2|…|αn

(1)若a ∈ first(αi) ,則指派αi去匹配

(2)若a不屬於任何乙個候選首符集,則:

①若ε屬於某個 first(αi)且a∈follow(a),則讓a與ε自動匹配;

②否則,a的出現是一種語法錯誤

5.**分析程式

**分析表

1.1 對每個終結符a,如果a屬於first(α),則把該產生式寫入到m[a,a]

1.2若ε屬於first(α),則對任何b屬於follow(a), 把該產生式加入到m[a,b]

1.3所有無定義的m[a,a]標上出錯標誌

棧內操作

2.1若x=a=#,分析成功,停止。e匹配輸入串成功.

2.2若x=a≠#,把x推出棧,再讀入下乙個符號。

2.3若x∈vn,查分析表m。

a) m[x,a]=   x→uvw

則將x彈出棧,將uvw壓入

注:u在棧頂 (最左推導)

b) m[x, a] = error   轉出錯處理

c) m[x, a] = x-〉ε     ---a為x的後繼符號

則將x彈出棧 (不讀下一符號)

繼續分析。

課後題

大體看了看課後題,大都是這種型別,起碼考察的知識點除了程式設計之外就都是這些了,開始先將文法換成ll1形式,以便於構造首符集和follow集,然後根據這些寫出**分析表,如果**分析表沒有多重入口,那麼 文法符合ll1形式,具體的構造方法都在上述的知識點中體現具體就不在贅述了。

感想:

在寫這篇之前,自己看了一下之前寫的那一篇,描述知識部分大都是自己的語言,而且還沒有分成點來記,造成的後果就是自己有的都看不懂了...所以以後的知識點總結還是按照課本為標準,來總結提煉知識點,課後題我也沒有很多的時間乙個乙個來做,挑的都是些可以基本上概括所有的知識的題目型別,如果沒有這種型別的題目可以自己改一下題目要求,自己練習一下,到達能覆蓋所有知識點的要求,以便於以後的複習.

第四章 語法分析 自上而下分析

上一章學習的是詞法分析,用正規式描述了單詞符號的結構,用有限自動機構造詞法分析器。但正規式描述能力是有限的,上下文無關文法適用範圍更廣一些,是語法分析的基礎。語法分析辦法分為兩類,一類是自上而下分析法,另一類是自下而上分析法。這一章學習的是自上而下分析法,主要內容是如何消除左遞迴 直接左遞迴和非直接...

第四章 語法分析 自上而下的分析

一.本章重點 分析的程式。二.1 如何判斷乙個輸入串是否符合語法規則?1.從文法的起始符出發進行句子的推導,即自上而下的分析 2.從句子本身出發,進行歸約,看能否把句子規約為到起始符,即自下而上的規約 2 基本思想 對任何乙個輸入串,試圖用一切可能的辦法,從文法的開始符號 根節點 出發,根據文法自上...

編譯原理 第四章 語法分析(自上而下分析)

一 感受及總結 語法分析是編譯過程的核心部分,語言的語法結構是用上下文無關描述的。因為自上而下分析可能會存在兩大問題,左遞迴和回溯,所以產生了消除左遞迴和克服回溯的方法 ll 1 分析法。使用ll 1 分析法要涉及first集和follow集,這是重點。當乙個文法滿足ll 1 條件時,就可以構造遞迴...