編譯原理 LR 0 分析舉例

2021-09-29 14:25:48 字數 2022 閱讀 5464

方便複習用

文法: 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...