自底向上即從輸入字串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→因此需要往前預看一位符號的更強大分析器lr(1)解決此類規約問題。在lr(1)中可以根據下乙個待分析符號準確判斷是否應該歸約。α⋅][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(0)多了乙個自由度,因此狀態數多許多。
編譯原理 語法分析(二)
在第一篇文章中,我們介紹了如何用上下文無關文法描述一種語言的語法,和如何使用推導和規約構造一棵語法分析樹,以及如何對文法進行轉換使之能夠更適用於語法分析。在本篇文章中,我們將介紹如何使用自頂向下的方法進行語法分析,進一步的,我們將介紹一種更高效的 分析方法。為了下文需要和減少重複,我們先給出在下文中...
編譯原理 語法分析 二
在第一篇文章中,我們介紹了如何用上下文無關文法描述一種語言的語法,和如何使用推導和規約構造一棵語法分析樹,以及如何對文法進行轉換使之能夠更適用於語法分析。在本篇文章中,我們將介紹如何使用自頂向下的方法進行語法分析,進一步的,我們將介紹一種更高效的 分析方法。文法 約定 為了下文需要和減少重複,我們先...
語法分析 編譯原理
實驗目的 對迴圈語句和條件判斷語句編寫詞法分析編譯程式,只能通過一遍掃瞄完成。用c 實現 實驗要求 1 關鍵字 for if then else while do 所有關鍵字都是小寫。2 運算子和分隔符 3 其他識別符號 id 和整型常數 num 通過以下正規式定義 id letter letter...