lemon
原始碼分析——專案
follow
集求法
都知道follow
集是針對非終結符的,而
lemon
中的專案follow
集是針對專案的,指的是專案產生式左部非終結符follow
集。
知道了專案
follow
集,它的求法也自然清楚了。這裡把專案分成兩類,它們的
follow
a.
號點不在最左的專案,
follow
集**於生產式相同,點號在它前面的專案。
b.
點號在最左的專案,
follow
集就是生產式左部非終結符
follow
集。非終結符
follow
集的計算方法:
1.
對於方法的開始符
s,將用於表示輸入結束的
』$』符放入
follow(s)
中;2.
若
a->αb
β是乙個產生式,則把
first(β)/
加至follow(b)中;
3.
若
a->αb
是乙個產生式,或
a->αb
β是乙個產生式,且β
->
ε,則把
follow(a)
加至follow(b)中。
以狀態專案的生成過程介紹專案
follow
集的計算。
開始狀態中的所有專案都是
b型別專案,於是計算開始符
follow
集,也就是方法
1,對就**為(
findstates):
for(rp=sp->rule; rp; rp=rp->nextlhs)
對當前狀態中的專案進行closure運算,也就是要產生b類的專案,此時運用方法2與方法3計算,對應**(configlist_closure
函式中):
for(newrp=sp->rule; newrp; newrp=newrp->nextlhs)
else
if( xsp->type==multiterminal )
else }
if( i==rp->nrhs ) plink_add(&cfp->fplp,newcfp);//
運用方法3}
運用方法
3時,並沒有進行真正的
follow
拷貝,而只是做了乙個記錄,在後面一起
「結賬」。這裡也可以看出,
config
會將自己的
follow
集傳給自己的
fplp
域。求完閉包後,就開始傳播了,傳播產生
a型專案。些時的
follow
集,直接由上級往下傳就行了。**位於函式
buildshifts
中:for
(bcfp=cfp; bcfp; bcfp=bcfp->next)
這裡也只是做了個標記,並沒有真正傳播
follow
集。從plink_add
(&new->bplp,bcfp);
可以看出
bplp
暫存著可以將
follow
集傳播給本專案的專案。
最後將標記轉換成實際上的傳播。
首先,把
bplp
轉換為fplp
(findlinks
):for
(i=0; i
nstate; i++)
} }
再將專案的
follow
集,傳給它的
fplp
(findfollowsets
):void
findfollowsets(struct
lemon *lemp)
} cfp->status = complete; }
} }while( progress ); }
LEMON原始碼分析筆記 分割原始碼
lemon 原始碼分析筆記 分割原始碼 五千多行 集於乙個檔案,這不是什麼明智之舉。根據原始碼中的提示,可以程式設計乙個分割程式。分割程式的工作是,識別出檔名,並把用它建立檔案,寫入相應內容。在處理過程式,記錄標頭檔案。在識別出原始檔時,把在其前的標頭檔案 include 進去。理論上這樣做是可行的...
Android原始碼設計模式分析專案
該系列文章已經根據技術發展 實戰需求以及讀者您的反饋重寫所有章節,並且加入更加深入的核心機制分析以及模式在android開發中的實戰,以便幫助大家更系統的學習。書籍已經出版,購買位址在為 android原始碼設計模式解析與實戰 另外,我們的聯絡郵箱為 coder.h gmail.com,謝謝。設計模...
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...