计算first集合和follow集合--编译原理.docx

上传人:太** 文档编号:97950447 上传时间:2024-07-08 格式:DOCX 页数:41 大小:24.90KB
返回 下载 相关 举报
计算first集合和follow集合--编译原理.docx_第1页
第1页 / 共41页
计算first集合和follow集合--编译原理.docx_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《计算first集合和follow集合--编译原理.docx》由会员分享,可在线阅读,更多相关《计算first集合和follow集合--编译原理.docx(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、计算first集合和follow集合姓名:彦清学号:E10914127一.实验目的输入:任意的上下文无关文法。输出:所输入的上下文无关文法一切非终结符的力75才集合和后。小集合。二,实验原理设文法G=(Vn , Vt , P , S ),则首字符集为:*=FIRST ( a ) =a | a ap z aeVT # azpeV*o*=若a s , eg FIRST ( a 由定义可以看出,FIRST ( a )是指符号串a能够推导出的所有符号串中处于串首的终结符号组成的集合。所以FIRST集也称为首符号集。设a = xiX2Xn , FIRST ( a)可按下列方法求得: t=biaoyoue

2、.rq;if(t= = l) for(sum;shizie.rightq! = ,0,;)sum + +;y = sum-1;if(q = =y)kongshie.kongzuo=l;break;)else break;)int al,a2;/*第二次扫描判断转为否的式子*/彳0尸0叫巾曰巾(+ + n:un:o=n)joj尸 乙!qsueip沦949吟bbn jui:001四4!导聿H!J苴长(:|eajq:0=onz6uo|,eiqs6uo|=onz6uo|,ieiqs6uo|(0= = noX6uo|,e!qs6uo| 00 0=二noX6uo|Te!i|s6uo|)j!(T = jon

3、z6uo|-e!qs6uo|?9?g- = jonz6uo|-e!qs6uo|?g?gip|-e!Z!qs=ip|-e!Z!qs)!:|eajq(e=Te)j! (+ +乙出u乙出o二乙e)oj(+l2u=i 立 o=R)oj(+4-ge:u = ge:o=SB)Jo):(“#:叫巾日巾)比却s(1; =onz6uo|,fe!qs6uo|)j! as|9(乙!qsu!叫内回3M却Io唱6!叫4甲=0乙!qsu!|Cz. = 0lM6u-se!Z!qs 领 B=丁山用四小小(+如=口0伸)oj:(叫!岳日皿叫巾Se!i)】D】s(X = ionz6uocge!qs6uo|)j!(jj9r8e!z

4、iqs= = 9enq6u-se!Z!qs - 8,=iG,)J!(+8立口8 出 o=8e)oj(T-(jq6u-se!Ziqs)u9|4S)=9e)!1(叫巾可皿叫巾SB巾)比(I = jonz6uo|,e!qs6uo|)j!UprkB!Z!qs= = 9eiq6u-ge!ziqs 00 片=iSe)J!(+e!ue:o=e)oj片e3q(z产o用6!se!Z!qs毛毛B=唱6!七日!与乎为(Z=9叫q6!“se!Z!qs 领 M=仔叫呼吠叼彳邛为 (+9B;0. = i9BlM6u-se!Z!qs:o=9B)JOelsestrcat(fjia5.fjihe,fjia8.fjihe);求f

5、ollow集合follow fw100;int bl,b2zb3,b4,b5,b6,b7zb8zb9,bl0;char Iinshi52;for(bl=0;bln;bl+) fwbl.fow0 = 0,;fw .fow =fw0.fowl 二 ,0,;for(b8=0;b8n;b8+) if(shizib8.left=shizi0.left)fwb8.fow0=,#1;fwb8.fowl=,0,;)int el;for(el=0;el2;el + +)for(b2=0;b2n;b2 + +)for(b3=0;b3 = A,&shizib2.rightb3 = ,a,&shizib2.right

6、b3 + l = ,z)linshi5l = 0;for(b9=0;b9 = A,&shizib2.rightb3 + l = ,Z) for(b4=0;b4n;b4+)if(shizib2.rightb3+l =shizib4.left) if(kongshib4.kongzuo! = l)for(bl0=0;bl0n;bl0+)strcat(fwblO.fowzfjib4.fjihe);)else for(b5=0;b5TEo=e)oj(+ +乙12u = 乙出o=乙1e)oj(:Q尸乙叫巾工工用乙巾(+Tie-uTie:o=Tie)JOjWieZibite 刈1001乙内盘s!j(:(M

7、OJ乙 qMMOJ,-qMJ)WA。Qj3q!Z!qs=二七qiq6u,乙 q!Z!qs)j!char linshi3100;char Iinshi42;int al5,al6,al7=0,al9=0,a21,al8;for(al5=0;al5n;al5 + +) for(a21=0;a2199;a21+)linshi3a21 = 0;)for(al6=0;al6n为止。当一个文法中存在e产生式时,例如,存在A-E ,只有知道哪些符号可以合法地出现 在非终结符A之后,才能知道是否选择A-e产生式。这些合法地出现在非终结符A之后 的符号组成的集合被称为FOLLOW集合。下面我们给出文法的FOLL

8、OW集的定义。设文法 GS= ( VN , Vt , P, S),则FOLLOW (A) =a | S=. Aa ,aeVTo*=若 S .A , FOLLOW (AX由定义可以看出,FOLLOW ( A )是指在文法GS的所有句型中,紧跟在非终结符A 后的终结符号的集合。al6+;)for(al7=0;al7=strlen(linshi3);al7+)if(linshi3al7 = =fjial5.fjiheal6)break;/if(linshi3al7 =,0,) linshi40=fjial5.fjiheal6;linshi4l = ,0,;strcat(linshi3Jinshi4)

9、;)strcat(fji2al5.fjihe2Jinshi3);follow2 fw2100;int bllzbl2,bl3;for(bll=0;blln;bll + 4-) fw2bll.fow20 = ,0,;)for(bl2=0;bl2 = n;bl2 + +)for(bl3=0;bl3n;bl3 + +) if(bl2! = bl3shizibl2Jeft=shizibl3deft)strcat(fwbl2.fowzfwbl3.fow);)char linshi6100;char Iinshi72;int bl5,bl6,bl7,bl9=0,b21,bl8;for(bl5=0;bl5n

10、;bl5 + 4-) for(b21=0;b2199;b21+)linshi6b21 = ,0,;)for(bl6=0;bl6strlen(fwbl5.fow);bl6+)if(bl6=0)Iinshi70=fwbl5.fowbl6;linshi7l = ,0,;strcat(linshi6Jinshi7);bl6+;)for(bl7=0;bl7=strlen(linshi6);bl7+)if(linshi6bl7 = =fwbl5.fowbl6)break;/if(linshi6bl7 = = 0) Iinshi70=fwbl5.fowbl6;linshi7l = ,0,;strcat(li

11、nshi6,linshi7);)Strcat(fw2bl5.fow2,linshi6);)int cl,c2;cout “非终结符 n first 集合“ endl; fji20.fjihe2 endl;cout shiziO.left for(cl=l;cln;cl+4-)fo r(c2=0;c2 cl;c2 + +) if(shizicl.left!=shizic2Jeft&c2=(cl-l)cout shizicl.left fji2cl.fjihe2endl;)int dl,d2;cout “ 非终结符“ n follow 集合 endl;coutn shiziO.left f w2

12、0 .f o w2 e n d I;for(dl = l;dln;dl+)for(d2=0;d2dl;d2 + +) if(shizidl.left!=shizid2.left&d2 = = (dl-l) fw2 d 1 .fow2 endl;cout , shizidl.left FilesMicrosoft Visual StudioMyPro ject saerDebugaer. exe*请输入产生式的条数:10请从开始符输入产生式空用,”表示,产生式由字母组成):S-ABS-bC ft-tt ft-b B-tt B-aD C-AD C-bD-aSD-c非终结符ABC非2冬结符ABCDP

13、ress anyFirst集合 ttba ttb tta bacac folio”集合ttac n q nkey to continueFOLLOW集可按下列方法求得:(1 ) 对于文法G的开始符号S ,有# FOLLOW (S);(2 )若文法G中有形如B-xAy的规则,其中x , yV *,则FIRST (y) - G FOLLOW (A);(3 ) 若文法GS中有形如B-xA的规则,或形如B-xAy的规则且egFIRST( y ), 其中 x , yev * ,贝!J FOLLOW ( B ) G FOLLOW (A);三、源程序#include#include产生式struct css

14、char left;charzhuan;用-表示箭头char right20;);空标志struct kong(int kongzuo;int kongyou;);struct biaoji第三步扫描式子的右部标记号(int r100;);struct first初步求first集合时用 char fjihe200;);struct first2保存最终的first集合 char fjihe2200;);struct fol low 初步求follow集合时用 char fow200;);struct folIow2保存最终的follow集合 char fow2200;);void main(

15、) inti,n,k;产生式条数css shizi100;kong kongshi100;cout,!请输入产生式的条数n(n100) : “n;cout请从开始符输入产生式(空用铲 表示,产生式由字母组成):endl;for(i=0;i shizii.left shizii.zhuan shizii.right;)int l,mj,hgf;for(l=0;ln;l + +)for(m=0;m = a & shizil.rightm = z)(kongshil.kongyou=0; break;)for(j=0;j = n;j + +)for(h=0;hn;h + +) if(j= = h)b

16、reak;if(shizij.left=shizih.left)if(kongshij.kongyou =0 & kongshih.kongyou =0)kongshij.kongzuo=kongshih.kongzuo=0;break;)int d,s,a,q,w,e;char linshi;biaoji biaoyou100;for(d=0;dn;d + +)(if(!(kongshid.kongzuo= = l|kongshid.kongyou =0)(for(s=0;shizid.rights! = 0;s+)for(a=0;a = n;a + +) linshi=shizid.rights;if(linshi=shizia.left & kongshia.kongzuo= = l) biaoyoud.rs = l;)else kongshid.kongyou=0;)int $河川;第三部-1sum=O;for(e=0;en;e+)for(q=O;shizi e.rightq ! = 0;q + +)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁