構建LALR(1)專案集族

2021-08-25 17:48:48 字數 4409 閱讀 2119

構建

lalr(1

)專案集族 構造

lalr(1

)專案有兩種思路。一種是:先構造lr(

1)專案,再合併同心專案;另一種是:先構造lr(

0)專案,再為為其配上搜尋符。本文介紹第二種方法。

搜尋符生成有兩種方法。一是,自己生成。二是,上一專案集傳播獲得的。專案集之間傳播搜尋符遇到的問題是:若多個專案集可以直接轉移到乙個專案集

i上,那麼每當

i接收到,這些專案集傳播過來的新的搜尋符時,

i就得重新再往下傳播自己新的搜尋符。考慮到這一點可以使用壓棧的方式,將可以傳播的專案壓棧存好,將棧頂彈出用於傳播,在傳播過程中同時壓入新的可傳播專案。直到最後棧為空,即沒有專案可以傳播為止。

假設一含

s』->s

的拓廣文法為

g。具體演算法如下:

1.構造g的

lr(0)專案集規範族(實就是為了方便分析,有皆可)。2.將

i0,s』->s,#

壓入棧。(i0為

s』->s

所在專案,

#為搜尋符,顯然它是可以傳播的)

3.將規範族中的所有專案集的生成搜尋符壓入棧。因為它們是新生的可傳播的。

4.彈出棧頂,使棧頂往下傳播。傳播到下乙個專案中後,生成自生成專案(就是自生符)。將新項入棧。繼續傳播,直到不能傳播為止。

5.重複第

4步,直到棧為空。

上面過程中,所有新項就是

lalr(1

)專案集族了,包括自生的,和傳播的。

示例。考慮如下文法,求其

lalr(1

)專案集族:

(1)s->l=r

(2)s->r

(3)l->*r

(4)l->i

(5)r->l

此文法的lr(

0)專案集規範族為:

i0:

s'->

·si4:

l->*

·rs->

·l=r

r->

·ls->

·rl->

·*rl->

·*rl->

·il->

·ii5:

l->i

·r->

·li6:

s->l=

·ri1:

s'->s

·r->

·li2:

s->l

·=rl->

·*rr->l

·l->

·ii3:

s->r

·i7:

l->*r

·i8:

r->l

·i9:

s->l=r

·lalr(1

)專案集族構建過程詳解(略去了記錄新專案操作):將i0

,s'->

·s,#壓棧。接著各專案集自生符壓棧

只有i0有生成符:

i0,l->·*r,=

i0,l->·i,=

棧中的狀態為:i0,

s'->

·s,#

i0,l->

·*r,=

i0,l->

·i,=

接下來,處理棧頂。

彈出:i0

,l->

·i,=

傳播得:

i5,l->i·,=

。止住。

彈出:i0,l->

·*r,=傳播得:i4,l->*·r,=。此項可以傳播,又可以自生成。先不急傳播,儲存一下自生成的專案:

i4,r->

·l,=

i4, l->

·*r,=

i4, l->

·i,=

棧狀態:i0,

s'->

·s,# i0

,l->·*r,=

i4,r->

·l,=

i4, l->

·*r,=

i4, l->

·i,=

好i4, l->*·r,=接著往下傳播,得到i7, l->*r·,=。止住。

彈出:i4, l->·i,=傳播得i5,l->i·,=。止住。注意,此項已經存在。

彈出i4, l->·*r,=傳播得:i4, l->*·r,=。此項已經傳播過了。(演算法應該有個機制記錄專案是否被傳播過)

彈出:i4,r->·l,=傳播得:i8, r->l·,=。止住。

彈出:i0,l->·*r,=傳播得:i4, l->*·r,=。已傳播過。

彈出i0,

s'->

·s,#此時,它還沒有自生成,不著急傳播。它會生成:

i0,s->

·l=r,#

i0,s->

·r,#

i0,l->

·i,#

i0,l->

·*r,#

i0,r->

·l,#

而這些專案都是可以傳播的,所有都得入棧(我的天呀,還有這麼多!)。入棧後,棧狀態為:

i0,s->

·l=r,#

i0,s->

·r,#

i0,l->

·i,#

i0,l->

·*r,#

i0,r->

·l,#i0,

s'->

·s,#傳播得:i1, s'->s·,#不能繼續了。

彈出:i0,r->

·l,#傳播得:i2,r->l·,#

。止住。

彈出:i0,l->

·*r,#傳播得:i4,l->*·r,#。此項又自生成:

i4,r->

·l,#

i4,l->

·*r,#

i4,l->

·i,#

此時棧頂狀態:

i0,s->

·l=r,#

i0,s->

·r,#

i0,l->

·i,#

i4,r->

·l,#

i4,l->

·*r,#

i4,l->

·i,#

i4,l->*

·r,#傳播得i7,l->*r·,#

彈出:i4,l->·i,#傳播得:i5,l->i·,#

彈出:i4,l->·*r,#傳播得:i4,l->*·r已經傳播過了。

彈出:i4,r->·l,#傳播得:i8,r->l·,#。

彈出:i0,l->

·i,#傳播得:i5,l->i·,#(i5中已有,所以要注意冗餘處理)

彈出:i0,s->·r,#傳播得:i3,s->r·,#

彈出:i0,s->·l=r,#傳播得:i2,s->l·=r,#,沒有自生成項,但可以傳播,故接著傳播得:i6,s->l=·r,#,此項自生成:

i6,r->

·l,#

i6,l->

·*r,#

i6,l->

·i,#

此時棧狀態為:

i6,r->

·l,#

i6,l->

·*r,#

i6,l->

·i,#

傳播i6,s->l=·r,#得:i9,s->l=r·,#

彈出:i6,l->·i,#傳播得:i5,l->i·,#

彈出:i6,l->·*r,#傳播得:i4,l->*·r,#已經處理過了。

彈出:i6,r->·l,#傳播得:i8,r->l·,#到此為止棧終於空了!

lalr(1

)專案集族也構建好了!

i0:

i1:

i2:

i3:

i4: i0,

s'->

·s,#

i1, s'->s

·,#i2,s->l

·=r,#

i3,s->r

·,#i4,l->*

·r,=/#

i0,l->

·*r,=/#

i2,r->l

·,#i4,r->

·l,=/#

i0,l->

·i,=/#

i4,l->

·*r,=/#

i0,s->

·l=r,#

i4,l->

·i,=/#

i0,s->

·r,#

i0,r->

·l,#

i5:

i6:

i7:

i8:

i9:

i5,l->i

·,=/#

i6,s->l=

·r,#

i7, l->*r

·,=/#

i8, r->l

·,=/#

i9,s->l=r

·,#i6,r->

·l,#

i6,l->

·*r,#

i6,l->

·i,#

構建LALR(1)專案集族

構建 lalr 1 專案集族 構造 lalr 1 專案有兩種思路。一種是 先構造lr 1 專案,再合併同心專案 另一種是 先構造lr 0 專案,再為為其配上搜尋符。本文介紹第二種方法。搜尋符生成有兩種方法。一是,自己生成。二是,上一專案集傳播獲得的。專案集之間傳播搜尋符遇到的問題是 若多個專案集可以...

S1專案 專案集

s1專案實施期間,並行開展了其他6個專案,其中與3個存在關聯。碰到的問題如下,乙個業務需求,可以拖長達兩個月。兩個系統互相推脫,對於由哪個系統承載,無法達成共識 對接系統提出的要求,業務對財務 財務對上游系統,兩個專案組調研 方案不同步,進度受影響,方案面臨大改 介面開發,各系統進度不一致 都走企業...

ITPM HW1 專案 專案集 專案組合

中譯基本概念 project 專案獨創的 臨時性的工作 programs 專案集一組相互關聯且被協調管理的專案 protfolio 專案組合 一組因戰略目標而組合管理的專案 專案集 operation 運營維持生產或服務持續執行的過程 比如,對於任意一家企業來說 中譯基本概念 project man...