1、n为止。当一个文法中存在产生式时,例如,存在A-,只有知道哪些符号可以合 法地出现在非终结符A之后,才能知道是否选择Af产生式。这些合法地出现 在非终结符A之后的符号组成的集合被称为FOLLOW集合。下面我们给出文 法的FOLLOW集的定义。设文法 G|S= (Vn, Vr, P, S),贝IFOLLOW (A) =a | S=. Aa aevTo若 S=A, #e FOLLOW (A)o由定义可以看出,FOLLOW (A)是指在文法GS的所有句型中,紧跟在 非终结符A后的终结符号的集合。FOLLOW集可按下列方法求得:(1)对于文法GS的开始符号S,有#eFOLLOW (S);(2)若文法G
2、S中有形如B-xAy的规则,其中x, yV*,则FIRST (y) -cGFOLLOW (A);(3)若文法GS中有形如B-*xA的规则,或形如B-*xAy的规则且丘 FIRST (y),負中 x, yev 贝0 FOLLOW (B) GFOLLOW (A);3.实验内容计算first集合和follow集合4.实验心得通过上机实验我对文法符号的FIRST集和FOLLOW集有了更深刻的理解, 已经熟练的掌握了求解的思想和方法,同时也锻炼了自己的动手解决问题的能 力,对编程能力也有所提高。5.实验代码与结果#includestringalgorithmusing namespace std;用于存
3、放每个终结符的用于存放每个非终结符/用于存放每个非终结#define MAXS 50 int NONEMAXS=0; string strings;/产生式 string Vn;/非终结符 string Vt;/ 终结符 string firstMAXS; first 集 string FirstMAXS;/ 的first集 string FollowMAXS; 符的follow集 int N;/产生式个数百匸2du (00lx(uh4a_E:d)pu!t (zbvnl匸a-EdQQMHAm卫d)!t+o6ua一煌一d(Mv0HEO4+ZV0)04:34.E(F M1S)1N po H足N後/
4、26 一6usca- 6uMIS 10ES elseif(Vt.find(pi.leftj)100)Vt +=pi.leftj; for(j=0;jv(int)pi.right.length();j+)if(!(pi.rightj=A&pi.rightj100) Vt +=pi.rightj;elseif(Vn.find(pi.rightj)100) Vn+=pi.rightj;void getlr(STR *p,int i)int j; for(j=0;jvstrings .l ength();if(stringsj=-stringsj+1=)pi .l eft=strings substr
5、(0,j);pi .right=strings .substr(j+2,stringsength()-j); 对每个文法符号求first集string Letter_First(STR *p,char ch)int t;(Vt .find(ch)100)firstVt .find(ch)=ch; return firstVt find(ch)-1;(Vn.find(ch)for(int i=0;i1O0) if(FirstVn.find(ch).find(pi.right0)1OO) FirstVn.find(ch)+=pi.right0;if(pi.right0=*if(FirstVn.fi
6、nd(ch).find()FirstVn find(ch)+=(Vn .find(pi .right0)if(pi .right length()=1)string ff; ff=Letter_First(p,pi right0); for(int i_i=0;i_ivfflength();i_i+) if( FirstVn.find(ch).find(ffi_i)FirstVn.find(ch)+=ffi_i;for(intj=0;jvpi.rightength();string TT;TT=Letter_First(p,pi rightj);(TT. find(10 0)&(j+1)vpi
7、 .right .1 ength() )sort(TT begin(),TT .end();string tt;t=1;tFirstVn.find(ch)+=TTt; for(t=0;TT.length();t+) break;return FirstV n. find(ch);/求每个非终结符的Follow集string Letter_Follow(STR *p,char ch) int t,k;NONEV n. find(ch)+; if(NONEVn .find(ch)=2) NONEVn .find(ch)=0; return FollowV n. find(ch);for(int j
8、=0;jFollowVn .find(ch)+=ggk;string FF;jj=j+1;jjvpi.right.length();jj+)TT=Letter_First(p,pi rightjj);(TT .find(100)&(jj+1)10 0&TTt!FF+=TTt;if( FF.find(TTt) FF+=TTt; break;if(FF.find(for(k=0;kFollowVn.find(ch)+=FFk; for(k=0;if(FollowVn .find(ch) .find(FFk)FF k!FollowVn .find(ch)+=FFk;string dd;dd=Lett
9、er_Follow(p,pi .left0);NONEVn .find(pi .1 eft0)=0; for(k=0;kvdd length();if(FollowVn.find(ch).find(ddk)FollowVn.find(ch)+=ddk;return FollowVn.find(ch);void result()coutvvn该文法不是LL(1)型文法vvendl;主函数int main()int i,j,k;COUtVV请输入产生式总数:cinn请输入各产生式(*代表 空):STR *p=new STRMAXS;for(i=0;cinstrings; getlr(p,i);VN
10、VT(p);coutvvendl;n= 非 终 结 符vvtFIRSTttFOLLOWvvendl;Vnength(); vvVnivvttstring pp;pp=Letter_First(p,Vni);j+lvpp length();coutvvppjvv,coutvvpppp .l ength()-1vvFollow0+=# string ppp;ppp=Letter_Follow(p,Vni);k+lvppp .l ength();coutvvpppkvvcoutvvpppppp.length()-1vv result();coutnreturn 0;幘输入各产生式(刈弋表空):K-ABE-bGfl-fi-bB-aDC-ADhD-aSD -c非终结符FIRSTFOLLOUA*.bB*,a#Cb,a,cDApC
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1