今天講解lr(0)slr(1)lr(1)
偽**rust實現lalr(1)
我覺得實現lr(1)就夠了, lalr(1)反而是負擔
為啥要用lr語法分析器呢? ll不香嗎?
幾乎所有的程式語言, 只要能寫出改語言的上下文無關文法
, 就可以構造出相應的lr語法分析器.
lr無回溯, 很高效. @算符優先
lr(k)分析能力強於ll(k)
總結一下. lr分析的優點
高效能高能力使用範圍廣
可自動生成
當然lr的缺點也是有的.
是時候拿出萬年老二if c1 then if c2 then e2 else e3
來抬槓了.
但我們可以稍微改寫成if c1 else }
.
還有手寫lr分析是火葬場. 就比如我寫的乙個lalr分析器.
既然lr是移近歸約
分析器. 那何時移近, 何時歸約?
我們通過維護一些狀態
, 來指導我們做出移近或歸約的決定.
哦? 狀態???
我們通過a→x
.yza \rightarrow x.yz
a→x.yz
中點
的位置來表示當下狀態.
點左邊的是可以由x用狀態的思想我們可以得出lr(0)自動機, 如圖所示的例子xx推導得到的串, 點右邊是接下來想看到乙個能從yzyz
yz推導得到的串.
圖並沒有畫完, 領會意思即可這是乙個自動機呀!
為啥可以使用lr(0)自動機來做出移近/歸約
決定?
因為lr(0)自動機可以刻畫出可能出現在分析器棧中的文法符號串.
即lr(0)自動機能識別可行字首
對於乙個可行字首, 但前面有多條路怎麼選?
可以檢視下乙個輸入符號來解決.
slr(1)與lr(0)的不同在於:
slr(1)
slr(1)的follow(a)
一把梭就可以解決問題了嗎?
如何可以該多好, 可惜不行.
比如以下文法slr(1)就不能識別
s→lfollow集還是不夠精細.說明我們的slr(1)自動機無法處理該文法. 但左值右值又常用.=r∣r
s\rightarrow l=r | r
s→l=r∣rl→
∗r∣i
dl \rightarrow *r |id
l→∗r∣idr→
lr \rightarrow l
r→lfollow(l) = follow( r ) =
對於l .=
rl.=r
l.=r
來說, 下一步動作有歸約r
→l.歸約r \rightarrow l.
歸約r→l.
或者移 進s
→l.=
r移進s \rightarrow l.=r
移進s→l.
=r. 然而我們沒有以r=.
..r=...
r=..
.開頭的句型.
所以我們需要更為精細的操作.
只有在形如[a→
α.,a
][a \rightarrow \alpha. ,a]
[a→α.,
a]的項且下乙個輸入符號為a
的情況下, 我們才會按照a→α
a \rightarrow \alpha
a→α進行歸約.
那如何計算下乙個符號a
呢?
是時候召喚龍書了!
goto函式
中將[a→
αx.β
,a]加
入j中[a\rightarrow \alpha x. \beta, a]加入j中
[a→αx.
β,a]
加入j中
.我們的向前看符號通過goto函式
實現了傳播.
lr(1)的問題呢?
重複項實在是太多了. lalr(1)也不少
雖然文法很nb,但是實踐中空間開銷過大.
壓縮一下?
咋壓縮?
從lr(1)項[a→
αx.β
,a][a\rightarrow \alpha x. \beta, a]
[a→αx.
β,a]
中的向後看符a
入手, 如何盡可能合併, 而且不帶來新的衝突.
就可以降低空間開銷.
用lalr(1)來代替lr(1). 雖然損失了分析能力 ,但是對於常見語言還是?的.
lalr(1)有些複雜, 可以單開一篇文章講解.
欲聽後事如何, 請聽下回分解.
龍書
LR語法分析 LR(0) SLR(1)
概述 lr 分析法是一種自下而上進行規範歸約的語法分析法,l指從左到右掃瞄輸入符號串,r是指構造最右推導的逆過程。對大多數無二義性上下文無關文法描述的語言都可用它進行有效的分析。主要分析器有lr 0 slr 1 lr 1 lalr 1 lr 0 在分析的每一步,只需根據當前棧頂狀態而不必向前檢視輸入...
LR 1 分析法的總控的實現(C 實現)
1 若action sm ai s則將s移進狀態棧,並把輸入符號加入符號棧,則三元式變成 為 s0s1 sm s x1x2 xm ai ai 1 an 2 若action sm ai rj則將第j個產生式a 進行歸約。此時三元式變為 s0s1 sm r s x1x2 xm ra aiai 1 an ...
LR 1 專案集族的構造 如何確定前向搜尋符
陳火旺國防工業第三版 編譯原理 在講述lr 1 規範專案集族的時候,提到了前向搜尋串,書上完全按照定義給出推導,屬於找到了就有,沒找到就沒有,完全無法令人理解,這裡給出前向搜尋串的一種直觀理解以及推導過程 在構造規範專案集族的時候,帶上每乙個專案的前向搜尋串,以解決移進 規約衝突問題。當且僅當下乙個...