構建
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...