版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、編譯原理實驗報告:葉玉虎班級:計122班指導(dǎo)老師:王森玉實驗日期:2015/5/11實驗內(nèi)容:實驗環(huán)境:VisualStudio2010實驗?zāi)康模鹤屚瑢W(xué)們掌握FIRST集合和FOLLOW集合的求法實驗代碼:#include<stdio.h>#include<string.h>#defineMAX50charcssMAXMAX;/保存所有的產(chǎn)生式intcount=0;intcnt=0;structL/保存所有的終結(jié)符charch;intflag;/1:能推出e,0:不能,初值:-1intnum;charfirstMAX;ints;/first的長度charfollowMA
2、X;intl;/follow的長度lMAX;對輸入的格式進(jìn)行控制,并校驗輸入是否符合格式inthandle(chara)intlen,i=0,j,k;len=strlen(a);while(ai!=10)if(ai='$')return2;if(''=ai)|(9=ai)i+;continue;if(ai>='A,)&&(ai<=,Z')if(ai+1!='-')|(ai+2!='>')printf("產(chǎn)生式格式錯誤n");return-1:elsej=i;k=
3、0;while(aj!=',)&&(aj!=9)&&(aj!=,$,)&&(aj!=10)if(aU=T)csscountk='0'count+;if(aj+1=-)|(aj=9)|(aj=-$-)|(aj=io)printf("產(chǎn)生式格式錯誤n");return0;csscount0=ai;csscount1=ai+1;csscount2=ai+2;k=3;j+;continue;csscountk=aj;k+;j+;csscountk='0'i=j;count+;elseprintf
4、("產(chǎn)生式格式錯誤n");return-1;return0;從鍵盤獲得輸入intinput()(charaMAX*MAX;intv;printf("輸入產(chǎn)生式,產(chǎn)生式之間以空格回車或Tab鍵分隔,并以$鍵結(jié)束.n");printf("用表示虛擬符號£,終結(jié)符用大寫字母表示,其他字符表示非終結(jié)符n");while(1)(fgets(a,MAX*MAX,stdin);v=handle(a);if(v=-1)return-1;if(v=2)return0;求出能推出e的非終結(jié)符voidseekEmpty()(inti,j,k,t;
5、intflag=0,flag2=0;intlen,c;charaMAXMAX,ch;for(i=0;i<count;i+)(strcpy(ai,cssi);求出含有的非終結(jié)符的個數(shù),并把各終結(jié)符保存起來for(i=0;i<count;i+)(for(j=0;j<cnt;j+)(if(lj.ch=ai0)(lj.num+;flag=1;break;elseflag=0;if(!cnt)|(!flag)(lcnt.ch=ai0;lcnt.flag=-1;lcnt.num=1;lcnt.s=0;lcnt.l=0;cnt+;flag=1;continue;c=count;while(
6、c)(for(i=0;i<c;i+)(如果該終結(jié)符推出£,從a中刪除所有帶有該終結(jié)符的產(chǎn)生式if(ai3='')(ch=ai0;for(j=0;j<c;j+)(if(ch=aj0)(if(j!=c-1)(for(k=j;k<c-1;k+)strcpy(ak,ak+1);c-;j-;else(c-;j-;for(j=0;j<cnt;j+)if(ch=lj.ch)(lj.flag=1;break;i-;continue;len=strlen(ai);for(j=3;j<len;j+)(當(dāng)該產(chǎn)生式右邊含有非終結(jié)符時從a中刪除該條記錄if(aij
7、<'A')|(aij>'Z')(flag2=1;break;if(flag2)(for(k=0;k<cnt;k+)(if(ai0=lk.ch)(lk.num-;if(lk.num=0)lk.flag=0;break;if(i!=c-1)for(k=i;k<c-1;k+)(strcpy(ak,ak+1);c-;i-;flag2=0;continue;如果產(chǎn)生式右邊為非終結(jié)符看看該終結(jié)符能不能推出£for(j=3;j<len;j+)(if(aij>='A')&&(aij<='
8、Z')(for(k=0;k<cnt;k+)(if(aij=lk.ch)(if(lk.flag=0)(flag2=1;break;elseif(lk.flag=1)(for(t=j;t<len-1;t+)ait=ait+1;ailen-1='0'j-;len-;break;break;if(flag2)break;if(ai3='0')(ch=ai0;for(j=0;j<c;j+)(if(ch=aj0)(if(j!=c-1)(for(k=j;k<c-1;k+)strcpy(ak,ak+1);c-;j-;elsec-;j-;i-;fo
9、r(k=0;k<cnt;k+)(if(ch=lk.ch)(lk.flag=1;break;if(flag2)(for(k=0;k<cnt;k+)(if(ai0=lk.ch)(lk.num-;if(lk.num=0)lk.flag=0;if(i!=c-1)for(k=i;k<c-1;k+)(strcpy(ak,ak+1);c-;i-;flag2=0;continue;求每個非終結(jié)符的First集合voidseekFirstVn()(inti,j,k,t,t1,t2,c,item;intlen,s,flag=0,flag2=0,fchange;charaMAXMAX,chMAX;
10、for(i=0;i<count;i+)strcpy(ai,cssi);c=count;while(1)fchange=0;for(i=0;i<c;i+)右部為£,將£并入到左部的First中if(ai3='')/*for(j=0;j<cnt;j+)if(lj.ch=ai0)for(k=0;k<lj.s;k+)if(lj.firstk=ai3)flag=1;break;if(!flag)lj.firstlj.s=ai3;lj.s+;lj.firstlj.s='0'fchange=1;break;flag=0;*/從當(dāng)前列
11、表a中刪除if(i!=c-1)for(j=i;j<c-1;j+)strcpy(aj,aj+1);c-;i-;continue;len=strlen(ai);產(chǎn)生式右邊符號為終結(jié)符時,將該終結(jié)符并入到左部的First集合中for(j=3;j<len;j+)(if(aij<'A')|(aij>'Z')(for(k=0;k<cnt;k+)(if(ai0=lk.ch)(for(t=0;t<lk.s;t+)(if(aij=lk.firstt)(flag=1;break;if(!flag)(lk.firstlk.s=aij;lk.s+;l
12、k.firstlk.s='0'fchange=1;flag=0;break;從a中刪除該條產(chǎn)生式if(i!=c-1)for(k=i;k<c-1;k+)strcpy(ak,ak+1);c-;i-;break;產(chǎn)生式右邊符號為非終結(jié)符時elseif(aij>='A')&&(aij<='Z')(/*將該非終結(jié)符的FIRST集合除去£并入到當(dāng)前非終結(jié)符的FIRST集合中*/for(k=0;k<cnt;k+)if(aij=lk.ch)(for(t=0;t<cnt;t+)(if(ai0=lt.ch)(f
13、or(t1=0;t1<lk.s;t1+)(for(t2=0;t2<lt.s;t2+)(if(lk.firstt1=lt.firstt2)(break;if(t2=lt.s)&&(lk.firstt1)!='')(fchange=1;lt.firstlt.s=lk.firstt1;lt.s+;lt.firstlt.s='0'break;break;if(lk.flag)continue;elsebreak;if(!fchange)(for(i=0;i<cnt;i+)(if(li.flag)(li.firstli.s='
14、39;li.s+;li.firstli.s='0'printf("FIRST(%c):%sn",li.ch,li.first);printf("n");break;求產(chǎn)生式右部的First集合voidseekFirstRight()structRightcharaMAX;charfirstMAX;ints;rMAX;inti,j,k,t;intcnt=0,len,len1,flag=0;for(i=0;i<count;i+)for(j=0;j<cnt;j+)if(!strcmp(cssi+3,rj.a)flag=1;break
15、;if(flag)flag=0;continue;strcpy(rj.a,cssi+3);rj.s=0;cnt+;for(i=0;i<cnt;i+)len=strlen(ri.a);for(j=0;j<len;j+)遇到終結(jié)符if(ri.aj=)(ri.firstri.s=''ri.s+;ri.firstri.s='0'break;elseif(ri.aj<'A')|(ri.aj>'Z')(ri.firstri.s=ri.aj;ri.s+;ri.firstri.s='0'break;else
16、(for(k=0;k<cnt;k+)(if(ri.aj=lk.ch)(len1=strlen(lk.first);for(t=0;t<len1;t+)(if(lk.firstt!='')(ri.firstri.s=lk.firstt;ri.s+;ri.firstri.s='0'break;if(lk.flag)(if(j=len-1)(ri.firstri.s=''ri.s+;ri.firstri.s='0'continue;elsebreak;for(i=0;i<cnt;i+)(printf("FIR
17、ST(%s):%sn",ri.a,ri.first);printf("n");求每個非終極符的Follow集合voidseekFollow()(inti,j,k,t,t1,t2,t3,c=0;intflag=0,len;intfchange;/判斷一次循環(huán)是否有改動的地方charaMAXMAX,chMAX;for(i=0;i<count;i+)(len=strlen(cssi);for(j=3;j<len;j+)(if(cssij>='A')&&(cssij<='Z')(break;if(j!
18、=len)(strcpy(ac,cssi);c+;l0.followl0.l='#'l0.l+;l0.followl0.l='0'while(1)(fchange=0;for(i=0;i<c;i+)(len=strlen(ai);for(j=3;j<len;j+)(if(aij>='A')&&(aij<='Z')(判斷該非終結(jié)符的前一位是否為非終結(jié)符,是的話,將其First集合去£后并到其前一位非終結(jié)符的Follow集合中if(aij-1>='A')&
19、&(aij-1<='Z')(for(k=0;k<cnt;k+)(if(aij-1=lk.ch)(for(t=0;t<cnt;t+)(if(aij=lt.ch)(for(t1=0;t1<lt.s;t1+)(if(lt.firstt1='')continue;for(t2=0;t2<lk.l;t2+)if(lt.firstt1=lk.followt2)break;if(t2=lk.l)(fchange=1;lk.followlk.l=lt.firstt1;lk.l+;lk.followlk.l='0'break;
20、break;如果該非終結(jié)符是最后一位,將該產(chǎn)生式左部非終結(jié)符的Follow集合加入到當(dāng)前非終結(jié)符的Follow集合中.然后從當(dāng)前終結(jié)符開始向右判斷是否為非終結(jié)符,是的話,進(jìn)行相應(yīng)處理循環(huán)直到當(dāng)前非終結(jié)符推不出£或當(dāng)前為終結(jié)符時退出if(j=len-1)(t3=j;strcpy(ch,ai);while(!flag)(if(cht3>='A')&&(cht3<='Z')(for(k=0;k<cnt;k+)(if(ch0=lk.ch)(for(t=0;t<cnt;t+)(if(cht3=lt.ch)(for(t1=0
21、;t1<lk.l;t1+)(for(t2=0;t2<lt.l;t2+)if(lk.followt1=lt.followt2)break;if(t2!=lt.l)continue;else(fchange=1;lt.followlt.l=lk.followt1;lt.l+;lt.followlt.l='0'if(lt.flag)cht3-='0'else(flag=1;t3-;break;break;elsebreak;flag=0;如果當(dāng)前位為終結(jié)符,判斷其前一位是否為非終結(jié)符是的話,將該終結(jié)符并到該非終結(jié)符的Follow集合中else(if(aij-1>='A')&&(aij-1<='Z')(for(k=0;k<cnt;k+)(if(aij-1=lk.ch)(for(t=0;t<lk.l;t+)if(aij=lk.followt)break;if(t=lk.l)(fchange
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人住宅租賃中介協(xié)議協(xié)議版
- 物聯(lián)網(wǎng)驅(qū)動的工業(yè)互聯(lián)網(wǎng)平臺技術(shù)創(chuàng)新研究
- 二零二五年度貨車司機勞動合同規(guī)范3篇
- 星際之旅-科技如何改變我們的工作方式
- 科技助力閱讀學(xué)生閱讀習(xí)慣與能力的現(xiàn)代養(yǎng)成法
- 個人與單位2024年度委托代理合同3篇
- 二零二五年橡膠車間承包經(jīng)營協(xié)議范本3篇
- 二零二五年度精裝房裝修材料采購與配送協(xié)議3篇
- 2025年度船舶租賃與船舶租賃法律援助合同3篇
- 2025年度美容學(xué)徒實習(xí)培訓(xùn)及就業(yè)跟蹤服務(wù)合同4篇
- 2024年社區(qū)警務(wù)規(guī)范考試題庫
- 2024年食用牛脂項目可行性研究報告
- 消防安全隱患等級
- 溫室氣體(二氧化碳和甲烷)走航監(jiān)測技術(shù)規(guī)范
- 部編版一年級語文下冊第一單元大單元教學(xué)設(shè)計
- 《保單檢視專題》課件
- 北京地鐵13號線
- 2023山東春季高考數(shù)學(xué)真題(含答案)
- 職業(yè)衛(wèi)生法律法規(guī)和標(biāo)準(zhǔn)培訓(xùn)課件
- 高二下學(xué)期英語閱讀提升練習(xí)(二)
- 民事訴訟證據(jù)清單模板
評論
0/150
提交評論