编译原理之First集合,Follow集合

对于First集合,follow集合的构造方法,我引用的是国防科技大学王挺老师的方法,我觉得这个讲的比较详细易懂;
编译原理之First集合,Follow集合
编译原理之First集合,Follow集合
下面用一道例题进行应用;
E->T|E+T T->F|T*F F->i |(E)的所有产生式的Follow集合,所有产生式右部的First集合。
第一步,消除左递归;
上式转化为:
(1)E->TE’
(2)E’->+TE’
(3)E’->ε
(4)T->FT’
(5) T’->*FT’
(6)T’->ε
(7)F->(E)
(8)F->i
FIRST(E)=FIRST(T)=FIRST(F)={ (,i}//由于T推导不出ε,所以后面的FIRST(E’)不加入FIRST(E),同理,(4)中的first(T’)不加入FIRST(T)。
FIRST(E’)={+,ε}//由于E’的推导中第一个字符就是+,为终结符,扫描后,first停止。(个人想法)
FIRST(T)=FIRST(F)={ (,i}
FIRST(T’)={ *,ε}
FIRST(F)={ (,i}

follow集合:
FOLLOW(E)= {),#},//E为开始符号,加入#,(7)式中FIRST( ))加入了FOLLOW(E)
FOLLOW(E’)= FOLLOW(E)={ ) ,# } //FOLLOW集合第三条规则,第一个产生式中E’是最后一个符号,所以FOLLOW(E’)中加入FOLLOW(E)。

FOLLOW(T)={FIRST(E’)-{ε}}∪FOLLOW(E)∪FOLLOW(E’) = { + , ) , # } //(2)式由follow规则2,first(E’)\ε加入follow(T)
(1)式可构成E->aTE’,a为ε,这样,follow(E)加入follow(T),同理,(2)中的follow(E’)加入FOLLOW(T)

FOLLOW(T’)= FOLLOW(T)= { + , ) , # }

FOLLOW(F)={FIRST(T’)-{ε}})∪FOLLOW(T)∪FOLLOW(T’) = {+,*,) ,# }