編譯原理構建first集合視頻-ag真人国际官网
⑴ 編譯原理——first集與follow集
first(a)為a的開始符或者首符號集。
如果兩個a產生式 a -> α | β ,且first(α)和first(β)不相交;
下一個輸入符號是x,若x∈first(α),則選擇 a->a ,若x∈first(β),則選擇 a->b 。
計算first(x)的方法
如果演算法看不懂,那我們來根據演算法來模擬一下!
因為求first集合如果有終結符號會比較好處理,所以我們逆順序進行實施;
應該一看明白了!
follow(a)指的是在某些句型中緊跟在a右邊的 終結符號 的集合
一步一步來看
2.1 第一次迭代
第一種情況: follow(t)=first(e')={ }
第二種情況 : follow(e')=follow(e)={ $ }
第一種情況: follow(t)=first(e')={ }
第二種情況 : follow(t)=follow(e')={ , $ }
第一種情況: follow(f)=first(t')={ * }
第二種情況 : follow(t')=follow(t)={ , $ }
第一種情況: follow(f)=first(t')={ * }
第二種情況 : follow(f)=follow(t')={ , * , $ }
第一種情況 : follow(e)={ $ , ) }
2.2 第二次迭代
由於我們列出了等值關系,所以只需要再走一次第一次迭代的過程就可以了!
因為主要是follow可能在變,所以我們只需要找到follow的等值關系即可
我在上面標出了第一次迭代的follow的最新版
下面我只要列出更新的即可
2.3 第三次迭代
第三次迭代就會發現 follow集合 不再發生改變,這時候規則結束,求出follow集合。
follow比較容易出錯,出錯的點主要在迭代過程的第二種情況的: a -> αbβ 且first(β)包含ε
我們容易忽略這種情況。
只要把每一次迭代過程都寫在紙上,尤其注重 follow集合 的等值!
⑵ 關於編譯原理first follow 和select
首先要明白這三個集的作用和用途,知道了他們是用來做什麼的之後,理解起來就簡單一些
first(a)集的作用是標示在替換非終結符a的時候,替換後的文法的首字母集合,語法分析程序根據這個來判斷給定的語言是否是合法的,是符合規則的。
follow(a)的作用是標示那些可以出現在a之後的字元,語法分析程序根據這個,在a可以被替換為e(空)的時候來進行判斷,看當前的文法是否是合法的。
這里簡單說明下,比如a->b,a->e(空) 當給定的語言是 bxxxxx的時候,根據第一句文法就可以判定句子合法,但是如果給的語言是cxxxxx的時候,因為a->可以替換為空,這時候就需要一句a的follow集來進行判斷,若a的follow集裡面含有c 則語言是合法的
select集的作用是將first集和follow集進行合並,如果兩個文法的左端都是a,若他們的select集交集為空,表明他們是兩個無關的,不會產生不確定性的文法,反之,則表明文法不是ll(1)文法
計算的公式很繁雜,理解了意思之後,看就能看出來。。。。
⑶ 編譯原理中firstvt和lastvt是什麼意思
firstvt和lastvt是為了畫算符優先關系表的(就是表裡面填優先大於小於等於的那個)。
然後要注意他們可都是終結符的集合。
firstvt
找firstvt的三條規則:如果要找a的firstvt,a的候選式中出現:
a->a.......,即以終結符開頭,該終結符入firstvt
a->b.......,即以非終結符開頭,該非終結符的firstvt入a的firstvt
a->ba.....,即先以非終結符開頭,緊跟終結符,則終結符入firstvt
lastvt
找lastvt的三條規則:如果要找a的lastvt,a的候選式中出現:
a->.......a,即以終結符結尾,該終結符入lastvt
a->.......b,即以非終結符結尾,該非終結符的lastvt入a的lastvt
a->.....ab,即先以非終結符結尾,前面是終結符,則終結符入firstvt
⑷ 編譯原理語法分析中,求first,follow集合時,要消除左遞歸嗎
如果題目是單純求first、follow集合,不需要消除左遞歸。但是,如果求first、follow集合是為了判斷文法是否為ll(1)文法的話,可以直接得出否定的結論(因為含有左遞歸的文法絕對不是ll(1)文法)。可以先對文法進行改寫,一般是消除左遞歸和提取左公共因子,然後再判斷。
⑸ 一道《編譯原理》求follow集題目,在線等答案
哥們,你這個問題中的一個產生式e』→ te』| e,應該是e-> te』 |ε這樣吧!否則不可能獲得如此結果。
關於求follow集合,龍書中說得很清楚,依據三條規則即可:
1、任何follow(s)都包含輸入終止符號,其中s是開始符號。
適用該條,因此follow(e』)中包含終止符號#。
2、如果存在產生式,a->αbβ,則將first(β)中除ε以外的符號都放入follow(b)中。
該條不適用,因為在上述所有產生式中不存在形如e『->αe』β這樣的產生式。
3、如果存在產生式,a->αb,或a->αbβ,其中first(β)中包含ε,則將follow(a)中的所有符號都放入follow(b)中。
適用該條,因為存在這樣的產生式e-> te』,使得follow(e』)=follow(e)成立。而follow(e)適用上述第二條,根據產生式f→(e)可求得為follow(e)={#,)}。
綜上,follow(e』)=follow(e)={#,)}。
⑹ 編譯原理計算first 集和follow集的簡單方法 s->bbs' s'->aas'|ε a->ab|c b->db' b'->bb'|ε 求計算過程
first : s'=a,ε
s=b
a=a,c
b=d
b'=b,ε
follow: s'=#
s=#
a=a
b=a
b'=a