first集和follow集的計算

2021-08-02 03:39:47 字數 1835 閱讀 7635

計算first集:

① 根據定義計算:

對每一文法符號x∈v 計算first(x)

(a) 若x∈vt,則first(x)=

(b) 若x∈vn,且有產生式x→a…,a∈vt, 則 a∈first(x)

(c) 若x∈vn,x→ε,則ε∈first(x)

(d) 若x, y1,y2,…,yn都∈vn,且有產生式x→y1 y2 …

yn;當y1 y2 … yi-1都ε時,(其中1≤i≤n),則first(y1)-

、first(y2) - 、…、first(yi-1)- ,first(yi)

都包含在first(x)中

(e) 當(d)中所有yi   ε,(i=1,2,…n),則

first(x)=first(y1)∪first(y2)∪…∪first(yn)∪

(f)反覆使用上述(b)~(e)步直到每個符號的first集合不再增

大為止

② 由關係圖法求文法符號的first集:

(a)每個文法符號對應圖中乙個結點,對應終結符的結點時用

符號本身標記,對應非終結符的結點用first(a)標記。這

裡a表示非終結符

(b)如果文法中有產生式a→αxβ,且α  ε,則從對應a的

結點到對應x的結點連一條箭弧

(c)凡是從first(a)結點有路徑可到達的終結符結點所標記的

終結符都為first(a)的成員

(d)由判別步驟1)確定ε是否為某非終結符first集的成員,

若是則將ε加入該非終結符的first集中

3)計算follow集:

① 根據定義計算:

對文法中每一 a∈vn 計算 follow(a)

(a)設s為文法中開始符號,把加入follow(s)中(這裡「#」為句子括號)

(b)若a→αbβ是乙個產生式,則把first(β)的非空元素加入

follow(b)中。

如果β  ε則把follow(a)也加入follow(b)中

(c)反覆使用(b)直到每個非終結符的follow集不再增大為止

② 由關係圖法求非終結符的follow集:

(a)文法g中的每個符號和「#」對應圖中的乙個結點,對應終結符和「#」的結點用符號本身標記。對應非終結符的結點(如a∈vn)則用follow(a)或first(a)標記

(b)從開始符號s的follow(s)結點到「#」號的結點連一條箭弧

(c)如果文法中有產生式a→αbβx,且β  ε,則從

follow(b)結點到first(x)結點連一條弧,當x∈vt時,則

與x相連

(d) 如果文法中有產生式a→αbβ,且β  ε,則從

follow(b)結點到follow(a)結點連一條箭弧

(e) 對每一first(a)結點如果有產生式a→αxβ,且

α  ε, 則從first(a)到first(x)連一條箭弧

(f)凡是從follow(a)結點有路徑可以到達的終結符或「#」號的結點,其所標記的終結符或」#」號即為follow(a)的成員

FIRST集 FOLLOW集 和 SELECT集

first a 為a的開始符或者首符號集。設g vt,vn,s,p 是上下文無關文法 first 特別的,若 能推導出 則規定 first 若x vt,則first x 簡單講,終結符的first集就是它本身 若x vn,且有產生式x a a vt,則 a first x x 則 first x 簡...

FIRST集和FOLLOW集的求法

follow集 若x a 則將終結符 加入first x 中 若x e 則將終結符e加入first x 中 e表示空集 若 x bc d,則將first b 所有元素 除了空集 加入first a 然後檢測first b 若first b 中不存在空集,則停止,若存在則向b的後面檢視,將first ...

編譯原理 FIRST集和FOLLOW集

自己的理解 例子如果x是乙個終結符,則first x x 如果x是乙個非終結符,則x y 1y2y 3 yk x rightarrow y 1y 2y 3 cdots y k x y1 y 2 y3 yk 其中k 1 k ge1 k 1。i k,a firs t yi 且fi rst y1 firs...