方便複習用文法: e→(
l)∣a
e\rightarrow (l) | a
e→(l)∣
a l→el
∣el\rightarrow el | e
l→el∣e
分別求:dfa、parsing table、和串(a(a))
的分析過程。
先拆分和擴張文法:1.e′
→e1. e'\rightarrow e
1.e′→e
2. e→
(l)2. e\rightarrow (l)
2.e→(l
) 3.e→
a3. e\rightarrow a
3.e→
a 4.l→
el4. l\rightarrow el
4.l→el
5. l→
e5. l\rightarrow e
5.l→
e畫dfa的要點:
直接根據dfa畫出即可。
status
output
output
output
output
goto
goto()
a$el
0s2s31
1acc64
2s2s36
43r3r3
r3r3
r3r34s5
5r2r2r2
r2r2r26
s2r5
s3r567
7r4r4r4
r4r4
r4先給出分析過程再總結:
stack
intput_q
action
$0(a(a))
s2$0(2
a(a))
s3$0(2e6
(a))
r3$0(2e6(2
a))s3
$0(2e6(2a3
))r3
$0(2e6(2e6
))r5
$0(2e6(2l4
))r5
$0(2e6(2l4)5)r2
$0(2e6e6)r5
$0(2e6l7)r4
$0(2l4$s5
$0(2l4)5$r2
$0e1
$acc
規定stack的 $ 為棧底,input_q的最左邊為隊首。
流程:stack.top();
作為行並input_q.peek()
隊首作為列,並查表得到相應的action: si,
rj,a
cc,n
ulls_i, r_j, acc, null
si,rj
,ac
c,nu
ll,根據action的 情況分別轉到流程2、3、4
當action=s
is_i
si時,stack.push(input_q.poll());
並返回流程1。
當action=r
jr_j
rj時,使用第j
jj個文法去規約(從棧頂向棧底掃瞄匹配並忽略其間的狀態編號,匹配成功後彈出匹配到的相關串,彈出後棧頂元素應該為某個狀態的編號)。將規約後得到的結果作為列,stack.top();
得到的狀態編號作為行查表得到下乙個action=s
is_i
si,並push得到的規約串後再stack.push(i);
轉到流程1。
當action=acc
accac
c時,分析結束。
當action=nul
lnull
null
時,發生異常,分析結束 。
編譯原理 LR分析(主要是LR(0)分析)
lr方法的基本思想就是,在規範歸約的過程中,一方面要記住已移進和歸約出的整個字串,也就是說要記住歷史 一方面能夠根據所用的產生式的推測未來可能碰到的輸入符號,也就是說能夠對未來進行展望。這樣,當一串貌似控制代碼的字串出現在分析棧的頂部時,我們希望能夠根據歷史和展望以及現實的輸入符號這三部分的材料,決...
編譯原理 LR分析(主要是LR(0)分析)
lr方法的基本思想就是,在規範歸約的過程中,一方面要記住已移進和歸約出的整個字串,也就是說要記住歷史 一方面能夠根據所用的產生式的推測未來可能碰到的輸入符號,也就是說能夠對未來進行展望。這樣,當一串貌似控制代碼的字串出現在分析棧的頂部時,我們希望能夠根據歷史和展望以及現實的輸入符號這三部分的材料,決...
編譯原理根據專案集規範族構造LR 0 分析表
上回把文法的lr 0 專案集規範族搞了半天,革命進行了一半。鼓搗了半天整了一堆專案集規範族出來,總是有用的呀,接下來就是在那堆的基礎上構造分析表了,構造好分析表就能分析輸入串了。本文主要講lr 0 分析表的構造和輸入串分析過程。我這個菜雞都覺得是通!俗!易!懂!的!憋說話往下看 多的不扯,博 cai...