編譯原理構建first集合視頻
⑴ 編譯原理——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