編譯原理(二) 語法分析(二)

2021-09-13 11:40:00 字數 2727 閱讀 5466

自底向上即從輸入字串w產生文法開始符號s的過程,相當於從葉子節點反向構造語法分析樹。對輸入從左到右、自底向上的語法分析可以最終反向構造出乙個最右推導。

歸約:將與某個產生式匹配的子串替換為產生式頭部的非終結符號。

控制代碼:最右句型中和某個產生式匹配的子串,即若s⇒r

mαaw

⇒rmα

βws\underset\alpha aw\underset\alpha \beta w

srm⇒​α

awrm

⇒​αβ

w,則β

\beta

β就是w

ww的乙個控制代碼。

移入-歸約分析技術

移入-歸約技術中,使用乙個棧儲存已經歸約好的符號,開始時棧為空(只包含$),通過不斷歸約棧中符號並移入新的符號完成自底向上的分析。且歸約時,控制代碼總在棧的頂部。

類似自頂向下語法分析,當語法出現二義性時會發生規約衝突,例如之前的if-then-else匹配問題,當輸入為if-then時,分析器無法判斷後邊是否還有else語句,因此不能確定是否應該將if-else歸約為stmt。

lr(k)中的lr和k分別代表從左向右掃瞄輸入字元、最右推導、每一步只需向前看k個輸入字元。由於可以"「向前看」,因此lr技術不需要回溯。"隨著「向前看」字元數的增加,狀態機的狀態數呈指數級增長,而k=1,2時已經可以解決絕大部分問題,因此只考慮這兩種情況。最簡單的lr技術即lr(

0)lr(0)

lr(0)

goto函式:got

o(i,

x)goto(i,x)

goto(i

,x)表示通過i項集,接收到x後可以到達的狀態集合。(例如[a→

α⋅xβ

],a∈

i[a\rightarrow \alpha\cdot x\beta],a\in i

[a→α⋅x

β],a

∈i,則c lo

sure

([a→

αx⋅β

])closure([a\rightarrow \alpha x\cdot\beta])

closur

e([a

→αx⋅

β])在集合中)

項集族:項集族c表示乙個增廣文法g『所有的狀態集合,可一通過迭代下式計算:

在lr(0)自動機中,每個狀態對應乙個項集,如果其中:

在實現時通過乙個棧記錄已經移入/歸約的狀態序列並不斷查詢分析表完成分析。

lr分析表

結構lr分析表每行代表乙個狀態,共包括兩個部分:action和goto。

goto:goto部分的表頭為非終結符a,描述當前狀態接收到新歸約的a符號後的下乙個狀態。則如果goto函式got

o(ii

,a)=

ijgoto(i_i,a)=i_j

goto(i

i​,a

)=ij

​,則got

o[i,

a]goto[i,a]

goto[i

,a]表項為j。

使用方法

使用lr分析表步驟如下:

lr分析器從初始棧s

0s_0

s0​開始,不斷分析輸入,知道收到 接受/報錯 指令結束。 例

當輸入串為id∗

id+i

did*id+id

id∗id+

id時,棧的改變如下:

0,5

0,3

0,2

0,2,7 ⋮

\vdots

⋮ 構造slr語法分析表

構造方法如下:

構造goto部分。

將表中剩餘部分都填入err

orerror

erro

r如果在構造slr表過程中沒有衝突,則該文法為slr的。

考慮如下情況:項[a→

α⋅][a\rightarrow \alpha\cdot]

[a→α⋅]

出現在i

ii_i

ii​中的條件為b→β

⋅aγb\rightarrow \beta\cdot a\gamma

b→β⋅aγ

在項集中。

因此假設fol

low(

a)=∪

firs

t(γ)

follow(a)=\\cup first(\gamma)

follow

(a)=

∪fir

st(γ

),則按照當前語法,當a下乙個符號為fir

st(γ

)first(\gamma)

first(

γ)時,可以歸約;當下乙個符號為a時,不應該進行歸約。

而lr(0)無法完成正確歸約。

因此需要往前預看一位符號的更強大分析器lr(1)解決此類規約問題。在lr(1)中可以根據下乙個待分析符號準確判斷是否應該歸約。

lr(1)為每乙個向前看符號構造了新的狀態,可以看作比lr(0)多了乙個自由度,因此狀態數多許多。

編譯原理 語法分析(二)

在第一篇文章中,我們介紹了如何用上下文無關文法描述一種語言的語法,和如何使用推導和規約構造一棵語法分析樹,以及如何對文法進行轉換使之能夠更適用於語法分析。在本篇文章中,我們將介紹如何使用自頂向下的方法進行語法分析,進一步的,我們將介紹一種更高效的 分析方法。為了下文需要和減少重複,我們先給出在下文中...

編譯原理 語法分析 二

在第一篇文章中,我們介紹了如何用上下文無關文法描述一種語言的語法,和如何使用推導和規約構造一棵語法分析樹,以及如何對文法進行轉換使之能夠更適用於語法分析。在本篇文章中,我們將介紹如何使用自頂向下的方法進行語法分析,進一步的,我們將介紹一種更高效的 分析方法。文法 約定 為了下文需要和減少重複,我們先...

語法分析 編譯原理

實驗目的 對迴圈語句和條件判斷語句編寫詞法分析編譯程式,只能通過一遍掃瞄完成。用c 實現 實驗要求 1 關鍵字 for if then else while do 所有關鍵字都是小寫。2 運算子和分隔符 3 其他識別符號 id 和整型常數 num 通過以下正規式定義 id letter letter...