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 直到沒...