版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上 編譯原理實(shí)驗(yàn)報(bào)告 姓名:葉玉虎 班級(jí):計(jì)122班 指導(dǎo)老師:王森玉 實(shí)驗(yàn)日期:2015/5/11實(shí)驗(yàn)內(nèi)容:1.求出每個(gè)非終結(jié)符的FIRST集合2.求出每個(gè)產(chǎn)生式右部的FIRST集合3.求出每個(gè)非終結(jié)符的Follow集合實(shí)驗(yàn)環(huán)境: Visual Studio2010實(shí)驗(yàn)?zāi)康? 讓同學(xué)們掌握FIRST集合和FOLLOW集合的求法實(shí)驗(yàn)代碼:#include<stdio.h>#include<string.h>#define MAX 50char cssMAXMAX;/保存所有的產(chǎn)生式int count=0;int cnt=0;struct L/保存
2、所有的終結(jié)符char ch;int flag;/1:能推出,0:不能,初值:-1int num;char firstMAX;int s;/first的長(zhǎng)度char followMAX;int l;/follow的長(zhǎng)度lMAX;/對(duì)輸入的格式進(jìn)行控制,并校驗(yàn)輸入是否符合格式int handle(char a)int len,i=0,j,k;len=strlen(a);while(ai!=10)if(ai='$')return 2;if(' '=ai)|(9=ai)i+;continue;if(ai>='A')&&(ai<
3、='Z')if(ai+1!='-')|(ai+2!='>')printf("產(chǎn)生式格式錯(cuò)誤n");return -1;elsej=i;k=0;while(aj!=' ')&&(aj!=9)&&(aj!='$')&&(aj!=10)if(aj='|')csscountk='0'count+;if(aj+1=' ')|(aj=9)|(aj='$')|(aj=10)printf(&qu
4、ot;產(chǎn)生式格式錯(cuò)誤n");return 0;csscount0=ai;csscount1=ai+1;csscount2=ai+2;k=3;j+;continue;csscountk=aj;k+;j+;csscountk='0'i=j;count+;elseprintf("產(chǎn)生式格式錯(cuò)誤n");return -1;return 0;/從鍵盤獲得輸入int input()char aMAX*MAX;int v;printf("輸入產(chǎn)生式,產(chǎn)生式之間以空格回車或Tab鍵分隔,并以$鍵結(jié)束.n");printf("用表示虛擬
5、符號(hào),終結(jié)符用大寫字母表示,其他字符表示非終結(jié)符n");while(1)fgets(a,MAX*MAX,stdin);v=handle(a);if(v=-1)return -1;if(v=2)return 0;/求出能推出的非終結(jié)符void seekEmpty()int i,j,k,t;int flag=0,flag2=0;int len,c;char aMAXMAX,ch;for(i=0;i<count;i+)strcpy(ai,cssi);/求出含有的非終結(jié)符的個(gè)數(shù),并把各終結(jié)符保存起來for(i=0;i<count;i+)for(j=0;j<cnt;j+)if
6、(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(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-;
7、elsec-;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é)符時(shí)從a中刪除該條記錄if(aij<'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
8、(ak,ak+1);c-;i-;flag2=0;continue;/如果產(chǎn)生式右邊為非終結(jié)符看看該終結(jié)符能不能推出for(j=3;j<len;j+)if(aij>='A')&&(aij<='Z')for(k=0;k<cnt;k+)if(aij=lk.ch)if(lk.flag=0)flag2=1;break;else if(lk.flag=1)for(t=j;t<len-1;t+)ait=ait+1;ailen-1='0'j-;len-;break;break;if(flag2)break;if(ai
9、3='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-;for(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;contin
10、ue;/求每個(gè)非終結(jié)符的First集合void seekFirstVn()int i,j,k,t,t1,t2,c,item;int len,s,flag=0,flag2=0,fchange;char aMAXMAX,chMAX;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
11、=ai3)flag=1;break;if(!flag)lj.firstlj.s=ai3;lj.s+;lj.firstlj.s='0'fchange=1;break;flag=0;*/從當(dāng)前列表a中刪除if(i!=c-1)for(j=i;j<c-1;j+)strcpy(aj,aj+1);c-;i-;continue;len=strlen(ai);/產(chǎn)生式右邊符號(hào)為終結(jié)符時(shí),將該終結(jié)符并入到左部的First集合中for(j=3;j<len;j+)if(aij<'A')|(aij>'Z')for(k=0;k<cnt;k+)
12、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+;lk.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)生式右邊符號(hào)為非終結(jié)符時(shí)else if(aij>='A')&&(aij<='Z')/*將該非終結(jié)符的FIRST集
13、合除去并入到當(dāng)前非終結(jié)符的FIRST集合中*/for(k=0;k<cnt;k+)if(aij=lk.ch)for(t=0;t<cnt;t+)if(ai0=lt.ch)for(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
14、)continue;elsebreak;if(!fchange)for(i=0;i<cnt;i+)if(li.flag)li.firstli.s=''li.s+;li.firstli.s='0'printf("FIRST(%c): %sn",li.ch,li.first);printf("n");break;/求產(chǎn)生式右部的First集合void seekFirstRight()struct Rightchar aMAX;char firstMAX;int s; rMAX;int i,j,k,t;int cnt=0,
15、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;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;else if(
16、ri.aj<'A')|(ri.aj>'Z')ri.firstri.s=ri.aj;ri.s+;ri.firstri.s='0'break;elsefor(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=
17、''ri.s+;ri.firstri.s='0'continue;elsebreak;for(i=0;i<cnt;i+)printf("FIRST(%s): %sn",ri.a,ri.first);printf("n");/求每個(gè)非終極符的Follow集合void seekFollow()int i,j,k,t,t1,t2,t3,c=0;int flag=0,len;int fchange;/判斷一次循環(huán)是否有改動(dòng)的地方char aMAXMAX,chMAX;for(i=0;i<count;i+)len=strl
18、en(cssi);for(j=3;j<len;j+)if(cssij>='A')&&(cssij<='Z')break;if(j!=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
19、9;)/判斷該非終結(jié)符的前一位是否為非終結(jié)符,是的話,/將其First集合去后并到其前一位非終結(jié)符的Follow集合中if(aij-1>='A')&&(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;i
20、f(t2=lk.l)fchange=1;lk.followlk.l=lt.firstt1;lk.l+;lk.followlk.l='0'break;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é)符時(shí)退出if(j=len-1)t3=j;strcpy(ch,ai);while(!flag)if(cht3>='A')&&(cht3<='Z')f
21、or(k=0;k<cnt;k+)if(ch0=lk.ch)for(t=0;t<cnt;t+)if(cht3=lt.ch)for(t1=0;t1<lk.l;t1+)for(t2=0;t2<lt.l;t2+)if(lk.followt1=lt.followt2)break;if(t2!=lt.l)continue;elsefchange=1;lt.followlt.l=lk.followt1;lt.l+;lt.followlt.l='0'if(lt.flag)cht3-='0'elseflag=1;t3-;break;break;elsebreak;flag=0;/如果當(dāng)前位為終結(jié)符,判斷其前一位是否為非終結(jié)符/是的話,將該終結(jié)符并到該非終結(jié)符的Follow集合中elseif(aij-1>='A')&&(aij-1<='Z')for(k=0;k<cnt;k+)if(aij-1=lk.ch)for(t=0;t&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公共設(shè)施管理的成本控制案例研究考核試卷
- 危險(xiǎn)化學(xué)品安全管理專項(xiàng)培訓(xùn)考核試卷
- 兒童服飾廣告拍攝模特聘用協(xié)議
- 醫(yī)療急救車司機(jī)管理準(zhǔn)則
- 能源集團(tuán)合同糾紛處理
- 醫(yī)院藥房管理制度藥品價(jià)格策略
- 稀土廠電氣安全規(guī)范
- 物流中心倉庫租賃協(xié)議
- 美甲店水電路施工合同
- 合租商業(yè)街區(qū)租賃合同
- 《養(yǎng)成良好習(xí)慣-鑄就精彩人生》-主題班會(huì)
- 瀝青路面厚度試驗(yàn)檢測(cè)記錄表(鉆芯法)
- 三年級(jí)中華優(yōu)秀傳統(tǒng)文化教案
- (新版教材)教科版一年級(jí)上冊(cè)科學(xué)全冊(cè)優(yōu)秀教學(xué)課件
- 人教版九年級(jí)上冊(cè) 初三 英語Unit8SectionA1a-1c課件
- 教師網(wǎng)絡(luò)培訓(xùn)簽到表
- 《大學(xué)日語》第一冊(cè) 第8課
- 2022年《內(nèi)蒙古自治區(qū)建設(shè)工程費(fèi)用定額》取費(fèi)說明
- 大學(xué)語文-魯迅風(fēng)波賞析-課件
- 設(shè)計(jì)概論第五章-設(shè)計(jì)的哲學(xué)-PPT課件(PPT 111頁)
- 寧波市建設(shè)工程資料統(tǒng)一用表(2022版)1 通用分冊(cè)
評(píng)論
0/150
提交評(píng)論