編譯原理之求FIRST集

2021-09-22 13:03:26 字數 1091 閱讀 7725

vt是終結符集,vn是非終結符集,p為產生式集,s為開始的非終結符。(書上一般大寫的是非終結符,小寫是終結符)

以下的定義可直接不看,書上太抽象,又囉嗦,直接看紅字。

定義:設g=(vt,vn,p,s)是上下文無關文法。

first(a)=

若a=>*ε則規定ε∈first (a)。稱first(a)為a的開始符號集或首符號集。

first(a)集就是求從a出發推導出所有開頭的 終結符構成的集合。

s => ab

b => b

那麼first(s)  = ;因為b只能推出終結符 b ,s => ab,所以它的首個開始符號為

考慮以下情況,

s => ab

a => a

a => ε

b => b

b => ε      那麼此時first(s) = ,因為a有可能推出 ,當推出ε時,導致s => b,此時b又可以推出 ,所以最終

first(s) =

正式計算first集的語言描述如下:

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

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

若x∈vn,x => ε ,則 ε ∈ first(x)。

設g中有形如x→y1…yk的產生式,其中 x,y1…yk∈vn,且 y1…yi-1 均能 =>*ε(1≤i≤k),則first(y1)-,…, first(yi-1)-,first(yi) 都包含在first(x)中。

若對一切1≤i≤k,均有ε∈first(yi),則將ε符號加進first(x)。

簡單來說,

(1)如果是求的是終結符的first的集,那結果就是它本身;

(2)如果求非終結符的first集,就看它的產生式的首個符號是不是終結符,

(2.1)如果是該符號就是所求first集的一員;

(2.2)如果不是,那它就是非終結符,記為k,遞迴(2)重複上述步驟(非終結符推出空串的情況先不考慮);

(3)如果(2)中的 k 能推出 

ε,那麼 ε 也要加入first集中。

編譯原理 First集和Follow集的求法

自上而下分析 first集求法 first集合最終是對產生式右部的字串而言的,但其關鍵是求出非終結符的first集合,由於終結符的first集合就是它自己,所以求出非終結符的first集合後,就可很直觀地得到每個字串的first集合。1.直接收取 對形如u a 的產生式 其中a是終結符 把a收入到f...

編譯原理FIRST集合FOLLOW集的求法

first集合的求法 first集合最終是對產生式右部的字串而言的,但其關鍵是求出非終結符的first集合,由於終結符的first集合就是它自己,所以求出非終結符的first集合後,就可很直觀地得到每個字串的first集合。1.直接收取 對形如u a 的產生式 其中a是終結符 把a收入到first ...

編譯原理 FIRST集與FOLLOW集

first集合是對產生式右部的字串而言的,求取的是非終結符vt 或終結符 空字元 文法符號串 的開始符號集合,集合中包含的是由左部非終結符vt推導得到的終結符vn或空字元 以 表示乙個文法的字串,first 表示由 推導出的串的首個終結符或空字元組成的集合。規則 求文法符號x的first x 直到沒...