LEMON原始碼分析 專案FOLLOW集求法

2021-05-24 23:43:02 字數 2220 閱讀 4600

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