「求解FOLLOW集的方法」

发布时间:2023-01-30 19:04:00

求解FOLLOW集的方法
刚刚学习FOLLW集时总是容易忽略一些条件而造成错误,学会FOLLOW集的求解对于编译原理的学习很重要,一旦求错就容易造成分析SLR1分析表时出现错误。
1、对文法中的每个A属于n,计算FLLOW(:
(1、对文法的开始符号S,将“$”加到FOLOW(S;
(、若A->aBb是一条规则,则把FIRST(中的非ε元素加到FOLLO(B;
(3若A->BA->aBb是一条规则且b=>ε,则把FOLLOW(A加到FOLOWB)中;
(4、反复使用((3,直到每个非终结符的FOLLOW集不再增大为止。

看完规则,难免觉得有些许枯燥,下面我将列举一个较复杂的例子,可以使用到上述的全部规则。
eg:设有文法G[A]
A→BC|gDBB→bCDC→DaBcaD→d|εE→gAf|c

计算该文法的每一个非终结符的FIRT集和FOLLW集。

解:1、FIST集的求解:
IRST(=FIRST(BcFIRST(gD
=FIRST(BFIRST(C∪{c}∪g
={b}∪IRST(∪{a}∪{c,,}
={a,,c,d,g}
同理:
FIRS(B)={b,ε}FIRST(C={,c,d}FIRS(D={d,ε}FIST(E={,c}

(2、接下来求解FOLLOW:
a、由于A是文法的开始符号,所以$属于FOLLOW(A,E→gAf则(2)可知f属于FOLOWA,所以FOLOW(A={f,$}

cl利用规
b、由A→BCc利用规则(FIRST(C中的非ε元素加到FOLLOW(B,利用规则(3)把FOLLOW(A)加到FOLO(中;所以a,c,d,f$属于FLO(B.此外,由A→gDB,C→DaB利用规则(3FLLOW(A,FOLO(加到FOLOW(B中,由于还没求FOLLOW(C,暂不求FOLLOW(B.

c、由A→BCc利用规则(2FIRST(c)加入FOLLOW(C,则c属于FOLLOWC,B→bCD利用规则(2FRST(D中的非ε元素加入FOLLOW(C,则d属FOLLO(C,当FIRST(D的元素为ε,紧跟随在C后面的是E,所以FIST(E的非ε元素也应计入FOLLOW(C,g也属于OLLOW(C所以FOLLOW(C={c,d}
由此可求得FOLLW(={a,cdf,g,$}
d、由A→gDB利用规则(2FIRT(B中的非ε元素加到FOLLOW(,bFOLO(D利用规则(FOLLWA加到FOLLO(D,则f,$属于FOLOWD。由B→bCE利用规则(2FIRST(E的非ε元素加到FOLLO(D中,g,c属于FOLLW(DC→DaB利用规则2FIRST(a加到FOLW(D中,则a属于FOLLOWD。则FOLLWD={ab,c,g,f,$
e、由B→bCDE利用规则(3FOLLOW(B加到FOLLOW(E)中,则FLLW(E=a,c,d,fg,$

「求解FOLLOW集的方法」

相关推荐