編譯原理 第八節

2021-07-06 03:53:18 字數 2819 閱讀 3997

分為兩大類: 自頂向下分析 和 自底向上分析 其中前者又細分為 遞迴下降分析法(包含回溯的遞迴下降分析法和不含回溯的遞迴下降分析法)和非遞迴的**分析法(ll分析法) 後者分為算符優先分析法和lr分析法。

思想: 從語法的開始符號出發,試探使用不同產生式,尋找匹配於輸入符號串的推導。或者說,從對應文法開始符號的根結點出發,自頂向下為輸入符號串建立一棵分析樹。這種分析方法實質上是一種

試探過程,是因為

文法中,對於某個非終結符號的規則其右部有多個選擇,並根據所面臨的輸入符號不能準確 的確定所要選擇時,就可能出現回溯。

例如:

ll(1)分析法是一種自上而下的分析法,使用顯示棧而不是遞迴呼叫來實現分析。第乙個l指的是語法分析按從左到右的順序掃瞄輸入字串。第二個l指在語法分析過程中產生句子的最左推導。「1」表示在分析過程中,每一步推導,最多只要向右掃瞄乙個輸入字元。

ll(1)分析器的邏輯結構(由總控程式,ll(1)分析表和分析棧三部分組成):

其中分析表是乙個二維矩陣(形如 m【a,a】,a是非終結符號,a是終結符號)

分析棧用於存放分析過程中的文法符號。分析棧初始化時在棧底壓入乙個「#」,然後在次棧底底放入文法的開始符號。

總控程式的作用是依據分析表和分析棧聯合控制輸入字串的識別和分析。

舉個例子來看下詳細的過程:已知

首先我們要構造文法分析表(此處預設已構造好,具體的構造過程在後面記錄)

文法分析表如下:

第一步:進行初始化:把#入棧,然後把文法開始符號e入棧,讀入輸入字串第乙個符號id

第二步:查表e,id 得到 e—>te '  然後將e彈出棧,然後將te』反向壓入棧中 即此時棧中元素從底到頂是 # e' t

第三步:查表t,id 得到 t—>ft'    然後將t彈出棧,然後將ft'反向壓入棧中

第四步:查表f,id 得到 f—>id      然後將f彈出棧,然後將id反向壓入棧中

第六步:查表t',+ 得到 t'—>e  ,將t'彈出棧

第七步:查表e',+ 得到 e'—>+te' 然後將e'彈出棧,將+te'反向壓入棧中

第九步:查表t,id  得到 t—>ft'  然後將t出棧,然後將ft'反向壓入棧中

第十步:查表f,id  得到 f—>id   然後f出棧  然後id入棧

第十二步:查表t',* 得到t』 —>*ft' 然後t『出棧 將*ft』反向壓入棧中

第十四步:查表f,id  得到f—>id  f出棧,id入棧

第十六步:查表t',# 得到t'—>e  t'出棧

第十七步:查表e',#  得到e'—>e  e'出棧

第十八步:# == # 表示分析成功 停止分析過程

ll(1)分析表的構造:

從上面看出整個過程就是乙個查表判斷不斷迴圈的過程,關鍵在於ll(1)表的構造。

給出演算法:ll(1)分析表的構造

輸入:文法g;文法g的first和follow集

輸出:文法g的ll(1)分析表

for 文法g的每個產生式a—>y1|y2|y3|...|ym|

}置所有無定義的m[a,a]為出錯

關於first集的構造:

關於follow集得構造:

例如:文法:       e  —>te』

e』 —>+te』 | e

t  —>f t』

t』 —>*ft』 | e

f  —>(e) | id

計算 follow(e), follow(e』) , follow(t) ,follow(t』) , follow(f) 

解析:先看follow(e) 因為e是文法的開始符號,所以#加入follow(e)中。)位於e之後,所以)加入follow(e)

所以follow(e)=

follow(e'),因為e  —>te』 所以follow(e)加入 follow(e『),所以follow(e』)=

follow(t)  由第一條規則 first(e')加入其中(即 + ) 由第二條規則 follow(e')加入其中 follow(t)=

follow(t』)由三條規則,follow(t )加入其中,follow(t『)=

follow(f)有第三四條規則,follow(t)加入其中,first(t')加入其中,follow(f) =

有了first和follow集,我們就很容易構造分析表了。

這裡要注意,再進行計算前必須先消除左遞迴,不然在構造分析表時表中某些項會出現多個情況,這就不屬於ll(1)文法了。

所以要證明乙個文法是ll(1)文法,只需給出其文法分析表即可。

第八節 函式

函式的特性 減少 重複 使程式變得可擴充套件 使程式變得易維護 乙個函式只做一件事情 變數作用域 python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在 賦值的。變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。python的作用域一共有4種,分別是 以 l...

第八節 觸發器

上節中學到了quartz 如何解析corn like 表示式,其實觸發器中最核心的地方就是處理時間,這一節讓我們來了解下quartz中的觸發器有哪些吧 我想大家一定首先想到的就是處理corn like的觸發器吧,它就是crontriggerimpl觸發器,還是看一下類圖,看看有多少觸發器,和它們之間...

python第八節(函式2)

內建函式 map zip 返回1 10的奇數列表 for i in range 1,10,2 print i li for i in range 1,10 if i 2 1 print i print li filter 過濾 defis odd n return n 2 1print list f...