编译原理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集合有没有#,要看产生式的结构(产生式右端)。