編譯原理--算符優(yōu)先分析算法.doc_第1頁(yè)
編譯原理--算符優(yōu)先分析算法.doc_第2頁(yè)
編譯原理--算符優(yōu)先分析算法.doc_第3頁(yè)
編譯原理--算符優(yōu)先分析算法.doc_第4頁(yè)
編譯原理--算符優(yōu)先分析算法.doc_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

編譯原理實(shí)驗(yàn) 目錄編譯原理實(shí)驗(yàn)1一 實(shí)驗(yàn)?zāi)康?二 實(shí)驗(yàn)過(guò)程12.1實(shí)驗(yàn)過(guò)程12.2 各種單詞符號(hào)對(duì)應(yīng)的種別碼12.3 算符優(yōu)先程序的功能2三 設(shè)計(jì)源碼2四 實(shí)驗(yàn)結(jié)果13一 實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)、編制并調(diào)試一個(gè)算符優(yōu)先分析算法,加深對(duì)此分析法的理解二 實(shí)驗(yàn)過(guò)程2.1實(shí)驗(yàn)過(guò)程先在算符棧置“”,然后開(kāi)始順序掃描表達(dá)式,若讀來(lái)的單詞符號(hào)是操作數(shù),這直接進(jìn)操作數(shù)棧,然后繼續(xù)讀下一個(gè)單詞符號(hào)。分析過(guò)程從頭開(kāi)始,并重復(fù)進(jìn)行;若讀來(lái)的是運(yùn)算符2 則將當(dāng)前處于運(yùn)算符棧頂?shù)倪\(yùn)算符1的入棧優(yōu)先數(shù)f與2的比較優(yōu)先函數(shù)g進(jìn)行比較。2.2 各種單詞符號(hào)對(duì)應(yīng)的種別碼單詞符號(hào)種別碼單詞符號(hào)種別碼Main1*17Int2/18Char3=39if4!=40else523while7=37letter(letter digit)*10=21digit digit*20;34=14(26+15)27-16等等2.3 算符優(yōu)先程序的功能 完成一個(gè)交互式面向?qū)ο蟮乃惴麅?yōu)先分析程序,而一個(gè)交互式面向?qū)ο蟮乃惴麅?yōu)先分析程序基本功能是:(1) 輸入文法規(guī)則(2) 對(duì)文法進(jìn)行轉(zhuǎn)換(3) 生成每個(gè)非終結(jié)符的FirstVT和LastVT(4) 生成算符優(yōu)先分析表(5) 再輸入文法符號(hào)(6) 生成移進(jìn)規(guī)約步驟三 設(shè)計(jì)源碼算符優(yōu)先分析器#include stdio.h#include stdlib.h#include iostream.hchar data2020; /算符優(yōu)先關(guān)系char s100; /模擬符號(hào)棧s char lable20; /文法終極符集char input100; /文法輸入符號(hào)串char string2010; /用于輸入串的分析int k; char a; int j; char q; int r; /文法規(guī)則個(gè)數(shù)int r1; int m,n,N; /轉(zhuǎn)化后文法規(guī)則個(gè)數(shù)char st1030; /用來(lái)存儲(chǔ)文法規(guī)則char first1010; /文法非終結(jié)符FIRSTVT集char last1010; /文法非終結(jié)符LASTVT集int fflag10=0; /標(biāo)志第i個(gè)非終結(jié)符的FIRSTVT集是否已求出int lflag10=0; /標(biāo)志第i個(gè)非終結(jié)符的LASTVT集是否已求出int deal(); /對(duì)輸入串的分析int zhongjie(char c); /判斷字符c是否是終極符int xiabiao(char c); /求字符c在算符優(yōu)先關(guān)系表中的下標(biāo)void out(int j,int k,char *s); /打印s棧void firstvt(char c); /求非終結(jié)符c的FIRSTVT集void lastvt(char c); /求非終結(jié)符c的LASTVT集void table(); /創(chuàng)建文法優(yōu)先關(guān)系表void main()int i,j,k=0; printf(請(qǐng)輸入文法規(guī)則數(shù):);scanf(%d,&r);printf(請(qǐng)輸入文法規(guī)則:n);for(i=0;ir;i+)scanf(%s,sti); /存儲(chǔ)文法規(guī)則,初始化FIRSTVT集和LASTVT集*/ firsti0=0; /*firsti0和lasti0分別表示sti0非終極符的FIRSTVT集和LASTVT集中元素的個(gè)數(shù)*/lasti0=0;for(i=0;ir;i+) /判斷文法是否合法for(j=0;stij!=0;j+)if(sti0Z)printf(不是算符文法!n); exit(-1);if(stij=A&stij=A&stij+1=Z)printf(不是算符文法!n); exit(-1); for(i=0;ir;i+)for(j=0;stij!=0;j+)if(stijZ)&stij!=-&stij!=&stij!=|)lablek+=stij;lablek=#;lablek+1=0; table();printf(每個(gè)非終結(jié)符的FIRSTVT集為:n); /輸出每個(gè)非終結(jié)符的FIRSTVT集for(i=0;ir;i+)printf(%c: ,sti0);for(j=0;jfirsti0;j+)printf(%c ,firstij+1);printf(n);printf(每個(gè)非終結(jié)符的LASTVT集為:n); /輸出每個(gè)非終結(jié)符的LASTVT集for(i=0;ir;i+)printf(%c: ,sti0);for(j=0;jlasti0;j+)printf(%c ,lastij+1);printf(n);printf(算符優(yōu)先分析表如下:n);for(i=0;lablei!=0;i+) printf(t%c,lablei);printf(n); for(i=0;ik+1;i+)printf(%ct,lablei);for(j=0;jk+1;j+)printf(%ct,dataij);printf(n);printf(請(qǐng)輸入文法輸入符號(hào)串以#結(jié)束:);scanf(%s,input); deal();void table()char text2010;int i,j,k,t,l,x=0,y=0;int m,n;x=0;for(i=0;ir;i+)firstvt(sti0);lastvt(sti0);for(i=0;i;elsetextxy=stij;y+;textxy=0;x+;y=0;r1=x;printf(轉(zhuǎn)化后的文法為:n);for(i=0;ix;i+) printf(%sn,texti);for(i=0;ix;i+) stringi0=texti0;for(j=3,l=1;textij!=0;j+,l+)stringil=textij;stringil=0;for(i=0;ix;i+)for(j=1;textij+1!=0;j+)if(zhongjie(textij)&zhongjie(textij+1)m=xiabiao(textij);n=xiabiao(textij+1);datamn=;if(textij+2!=0&zhongjie(textij)&zhongjie(textij+2)&!zhongjie(textij+1)m=xiabiao(textij);n=xiabiao(textij+2);datamn=;if(zhongjie(textij)&!zhongjie(textij+1)for(k=0;kr;k+)if(stk0=textij+1)break;m=xiabiao(textij);for(t=0;tfirstk0;t+)n=xiabiao(firstkt+1);datamn=;if(!zhongjie(textij)&zhongjie(textij+1)for(k=0;kr;k+)if(stk0=textij)break;n=xiabiao(textij+1);for(t=0;t;m=xiabiao(#);for(t=0;tfirst00;t+)n=xiabiao(first0t+1);datamn=;n=xiabiao(#);for(t=0;t;datann=;void firstvt(char c) int i,j,k,m,n;for(i=0;ir;i+)if(sti0=c)break;if(fflagi=0)n=firsti0+1;m=0;doif(m=2|stim=|)if(zhongjie(stim+1)firstin=stim+1;n+;elseif(zhongjie(stim+2)firstin=stim+2;n+;if(stim+1!=c)firstvt(stim+1);for(j=0;jr;j+)if(stj0=stim+1)break;for(k=0;kfirstj0;k+)int t;for(t=0;tn;t+)if(firstit=firstjk+1)break;if(t=n)firstin=firstjk+1;n+;m+;while(stim!=0);firstin=0;firsti0=-n;fflagi=1;void lastvt(char c)int i,j,k,m,n;for(i=0;ir;i+)if(sti0=c)break;if(lflagi=0)n=lasti0+1;m=0;doif(stim+1=0|stim+1=|)if(zhongjie(stim)lastin=stim;n+;elseif(zhongjie(stim-1)lastin=stim-1;n+;if(stim!=c)lastvt(stim);for(j=0;jr;j+)if(stj0=stim)break;for(k=0;klastj0;k+)int t;for(t=0;t)out(1,k,s);printf(%c,a);out(i+1,z,input);printf(規(guī)約n);doq=sj;if(zhongjie(sj-1)j=j-1;else j=j-2;x=xiabiao(sj);y=xiabiao(q);while(dataxy!=);int m,n,N;for(m=j+1;m=k;m+)for(N=0;Nr1;N+)for(n=1;stringNn!=0;n+)if(!zhongjie(sm)&!zhongjie(stringNn)if(zhongjie(sm+1)&zhongjie(stringNn+1)&sm+1=stringNn+1)sj+1=stringN0; break; elseif(zhongjie(sm)if(sm=stringNn)sj+1=stringN0; break; k=j+1;if(k=2&a=#)out(1,k,s);printf(%c,a);out(i+1,z,input);printf(結(jié)束n);printf(輸入串符合文法的定義!n);return 1; /輸入串符合文法的定義elseif(dataxy=|dataxy=) /移進(jìn)out(1,k,s);printf(%c,a);out(i+1,z,input);printf(移進(jìn)n);k+;sk=a;i+;elseprintf(nflase);return 0;printf(nflase);return 0;void out(int j,int k,char *s)int n=0;int i;for(i=j;i=k;i+)print

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論