編譯原理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)文法
計算的公式很繁雜,理解了意思之後,看就能看出來。。。。
❷ 編譯原理計算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
❸ 編譯原理:FIRST(A) 集合與FOLLOW(A)集合
1.設計一個演示窗口,包括幾本的操作按鈕和顯示窗口; 2.設計first集合和follow集合生成演算法 3.輸入文法,按要求顯示first集合和follow集合
❹ 編譯原理 FOLLOW集
因為有:
T→ F T』
T』→ *F T』
所以FIRST(T')是FOLLOW(F)的子集。所以 * 是FOLLOW(F)中的元素。
因為有:
T→ F T』
T』→ε
所以FOLLOW(T)是FOLLOW(F)的子集。
因為有:
E』→ +TE』
所以FIRST(E『)是FOLLOW(T)中的子集。所以FIRST(E『)是FOLLOW(F) 中的子集。
因為有:
E』→ +TE』
所以+是FIRST(E』)中的元素,所以+是FOLLOW(F)中的元素。
因為有:
E』→ ε
E → TE』
所以有:
FOLLOW(E)是FOLLOW(T)子集。前面有所以FOLLOW(T)是FOLLOW(F)的子集。所以有
FOLLOW(E)是FOLLOW(F)的子集,
由F → (E)|id
知 ) 是FOLLOW(E)的元素。所以 ) 是FOLLOW (F)的元素。
因為E是開始符號,所以有 $ 是FOLLOW(E)中的元素,所以 $ 是FOLLOW(F)中的元素。
綜上所述:
FOLLOW(F)= {*,+,),$}
❺ 編譯原理的follow集怎麼求
希望你最好能給幾個例子了,看所有右部產生式有與你要求的非終結符的式子,與你要求的非終結符後面的那個如果是終結符的話那麼它就應該屬於你要求的FLLOW集了,如果是非終結符的話,求那個非終結符的FIRST集也屬於你要求的。以後最好給個例子哈,不能的話很難回答你的。
❻ 編譯原理follow集與first集的計算
下面我將介紹一下我關於LL(1)文法部分的計算文法非終結符First集以及Follow集兩個知識點的理解。
首先是First集的計算部分,計算First集首先看我們原文法的左邊,原文法左邊不重復的都要進行First集的計算,計算時具體有以下三種情況:
(1)先看產生式後面的第一個符號,如果是終結符,那就可以直接把它寫到這個產生式的First集中,例如:產生式為M->nDc,那在First集中我們就可以直接寫上First (M)={ n };
(2)如果產生式後面的第一個符號是非終結符,就看這個非終結符的產生式,看的時候同樣利用前面的兩種看法;但是當產生式為ε時,則需要把ε帶入到待求First集的元素的產生式中再判斷。例如:A->Bc; B->aM;B->ε,求First(A)時,我們看到A的第一個產生式中的第一個符號是B,B是一個非終結符,所以我們就要接著看B的產生式,B的第一個產生式的第一個符號為a,a是一個終結符,直接把a寫入First(A),B的第二個產生式為ε,把ε帶入A->Bc中,A->c(注意:如果將B->ε帶入表達式後A的產生式為A->ε,ε不可以忽略),c是終結符,所以把c也寫入First(A),最後First (A)={ a,c }。
(3)當產生式右邊全為非終結符,且兩個非終結符又都可以推出ε時,我們需要把這個產生式的所有情況都列出來,再分析。例如:A->BC;B->b|ε;C->c|ε。我們把A的所有產生式利用上述兩種方法列出來就是A->bc,A->b;A->c,A->ε;最後First (A)={b,c, ε}。
接下來介紹一下Follow集的部分,先簡單介紹一下計算Follow集的大致規則。比如我們要求Follow(X),文法中多個產生式中含有X,則需要考慮多種情況,以下是具體計算時的三種情況:
(1)文法開始符:所有文法開始符的Follow集中都有一個#。
(2)S->αB的形式:求Follow(B),因為B的後面為空,把Follow(S)寫入B的Follow集中。
(3)S->αBβ的形式:求Follow(B),B後部不為空。
①當β是終結符時,直接把β寫入Follow(B)。
②當β是非終結符時,將First (β)(如果First(B)中有ε,就把ε刪掉)寫入Follow(B)中。(需要注意的是:如果β->ε,那麼原產生式就變成了S->αB,也就是第二種情況,這兩種情況都要算在Follow(B)中)。
❼ 一道《編譯原理》求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集
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集合 的等值!
❾ 編譯原理 怎麼求FOLLOW啊。。。
只要follow額,這樣,follow(E),把所有包含你要求的符號的產生式都找出來,有F -> (E)|id,那E後面就是),其他包含E的都沒有,所以follow(E)={),#},E『,包含E』的產生式有E -> TE',再由F -> (E)|id推出F -> (TE『)|id,則E』後面也有),則follow(E』)={),#};T,包含T的產生式有E -> TE'、E' -> +TE'|ε,T後面是E『(+TE'|ε),則T有+,,再根據F -> (E)|id,(TE')|id,E『又可以是空(ε),則T後面有),則follow(T)={+,),#}。 T『同理,包含T』的有T -> FT'、T' -> *FT'|ε,F -> (E)|id,推出F -> (TE『)|id,再推出F -> (FT'E')|id,E'可以推出ε,則T'後面有),由E -> TE'推出E -> FT『E',則T』後面是E『,E' -> +TE'|ε,則follw(T』)含有+,所以follow(T『)={+,),#}。
F嘛,自己推推,都是這樣做得
❿ 編譯原理follow集怎麼求例:s->xSNy|Nx;N->zN|空 答案:follow(S)={y,z,#},follw(N)={x,y}什麼時候有#
求某一非終結符的follow集,主要看產生式右端(含有該非終結符的右端)。
因為S是該文法的開始符,所以#在follow(S)中。在產生式S->xSNy的右端,S的後跟符號是first(Ny),即z和y。這樣follow(S)={y,z,#}
求follw(N)時,看產生式S->xSNy和S->Nx,在它們的右端都含有N,根據S->xSNy可知,y在follw(N)中;根據S->Nx可知,x在follw(N)中;這樣follw(N)={x,y}
雖然產生式N->zN的右端也含有N,但根據follow集合的定義,將follw(N)加入follw(N)中沒有意義,所以不用計算。
對於不是開始符的其他非終結符,其follow集合有沒有#,要看產生式的結構(產生式右端)。