編譯原理上機實驗報告_第1頁
編譯原理上機實驗報告_第2頁
編譯原理上機實驗報告_第3頁
編譯原理上機實驗報告_第4頁
編譯原理上機實驗報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、編譯原理課內(nèi)實驗報告學院 計算機學院專業(yè)計算機科學與技術(shù)年級班別2012級6班學號3112006028學生姓名曾主賜輔導教師劉添添成績2014年12月一.完成內(nèi)容1 .擴充單詞:(1)保留字:for,step, until,char,real,return雙字符:*=,/=;(3)單字符:,*,/ ;2 .擴充語句:var a;begina:=1;doa:=a+1while a<5;write(a);end.二.設計思路1 .擴充單詞1)修改變量定義:void init()int i;for(i=0;i<=255;i+)ssymi=nul;ssym'+'=plus;

2、ssym'-'=minus;ssym'*'=times;ssym'/'=slash;ssym'('=lparen;ssym')'=rparen;ssym'='=eql;ssym','=comma;ssym'.'=period;ssym'#'=neq;ssym''=semicolon;ssym''=l1;ssym''=r1;/*設置保留字名字,按照字母順序便于折半查找*/strcpy(&(word0

3、0),"begin");strcpy(&(word10),"call");strcpy(&(word20),"char");strcpy(&(word30),"const");strcpy(&(word40),"do");strcpy(&(word50),"end");strcpy(&(word60),"for");strcpy(&(word70),"if");strcpy(&am

4、p;(word80),"odd");strcpy(&(word90),"procedure");strcpy(&(word100),"read");strcpy(&(word110),"real");strcpy(&(word120),"return");strcpy(&(word130),"step");strcpy(&(word140),"then");strcpy(&(word150),&quo

5、t;until");strcpy(&(word160),"var");strcpy(&(word170),"while");strcpy(&(word180),"write");/*設置保留字符號*/wsym0=beginsym;wsym1=callsym;wsym2=charsym;wsym3=constsym;wsym4=dosym;wsym5=endsym;wsym6=forsym;wsym7=ifsym;wsym8=oddsym;wsym9=procsym;wsym10=readsym;wsy

6、m11=realsym;wsym12=returnsym;wsym13=stepsym;wsym14=thensym;wsym15=untilsym;wsym16=varsym;wsym17=whilesym;wsym18=writesym;修改pl0.h頭文件里定義的全局數(shù)據(jù)# define norw 19# define txmax 100# define nmax 14# define al 10# define amax 2047# define levmax 3# define cxmax 200*/*關(guān)鍵字個數(shù)*/*名字表容量*/*number的最大位數(shù)*/*符號的最大長度*/*地

7、址上界*/*最大允許過程嵌套聲明層數(shù)0, lexmax*/*最多的虛擬機代碼數(shù)*/*符號*/ enum symbolnul,ident,number,plus,minus, times,slash,oddsym,eql,neq,lss,leq,gtr,geq, lparen,rparen, comma, semicolon,period, becomes, beginsym,endsym,ifsym,thensym,whilesym, writesym,readsym,dosym,callsym,constsym, varsym,procsym,forsym,stepsym,untilsym,

8、 charsym,realsym,returnsym,p,q,l1,r1;#define symnum 42 /*2)修改GetSym()方法:/*詞法分析,獲取一個符號*/int getsym() int i,j,k;while( ch=' '|ch=1011ch=9) getchdo;)if(ch>='a'&&ch<='z')(k=0;doif(k<al)ak=ch;k+;)getchdo;while(ch>='a'&&ch<='z'|ch>=

9、'0'&&ch<='9');ak=0;strcpy(id,a);i=0;j=norw-1;dok=(i+j)/2;if(strcmp(id,wordk)<=0)j=k-1;if(strcmp(id,wordk)>=0)i=k+1;while(i<=j);if(i-1>j)sym=wsymk;printf("保留字 n");elsesym=ident;printf("標識符 n");elseif(ch>='0'&&ch<='9&

10、#39;)k=0;num=0;sym=number;donum=10*num+ch-'0'k+;getchdo;while(ch>='0'&&ch<='9'); /* 獲取數(shù)字的值 */ k-;if(k>nmax)error(30);elseif(ch=':')/*檢測賦值符號*/getchdo;if(ch='=')sym=becomes;printf("kn");getchdo; else sym=nul;printf("n");/*不能識

11、別的符號*/elseif(ch='*')/*xiugai*/getchdo; if(ch='=') sym=p; printf("*=n"); getchdo; else sym=times; printf("*n"); getchdo;elseif(ch='/') getchdo; if(ch='=') sym=q;printf("/=n"); getchdo; else sym=slash; printf("八n");getchdo;elseif(

12、ch='<,)/*檢測小于或小于等于符號*/getchdo;if(ch='=')sym=leq;printf("<=n");getchdo;elsesym=lss;printf("<n");elseif(ch='>')/*檢測大于或大于等于符號*/getchdo;if(ch='=')sym=geq;printf(">=n");getchdo;elsesym=gtr;printf(">n"); else sym=ssymch;

13、/*當符號不滿足上述條件時,全部按照單 字符號處理*/printf("單字符 n");/getchdo;/richardif(sym!=period) getchdo;/end richardreturn 0;2 .擴充語句1)產(chǎn)生式以及語法描述圖:產(chǎn)生式:a:=1 do a:=a+1 while a<5語法描述圖:a:=1a:=a+1whilea<52)遞歸下降子程序:if(sym=dosym)getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlevwhilesym=true;statementdo(fsy

14、s,ptx,lev);if(sym=whilesym) getsymdo; conditiondo(nxtlev,ptx,lev); else error(18);3)舉例設計語句的pcode代碼:var a;begina:=1;doa:=a+1while a<5;write(a);end.1 int 0 42 int 0 13 sto 0 34 lod 0 35 lit 0 16 opr 0 27 sto 0 38 lod 0 39 lit 0 510 opr 0 1011 jpc 0 1312 jmp 0 413 lod 0 314 opr 0 1415 opr 0 1516 opr

15、 0 04)在遞歸下降子程序中增加語義動作:if(sym=dosym) cx1=cx;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevwhilesym=true;statementdo(fsys,ptx,lev); if(sym=whilesym) getsymdo;conditiondo(nxtlev,ptx,lev);cx2=cx;gendo(jpc,0,0);gendo(jmp,0,cx1); codecx2.a=cx; else error(18);三.運行測試1.擴充單詞的測試(貼運行結(jié)果截圖)ps:測試情況要全!圖片大

16、小合適!截圖如下所示:Input pl/0 file ?11.pl0 List object code ?<Y/N)y List symbol table ? <Y/N)y 0 begin保留字TABLE: NULL2 step保留字XXXX f192 until保留字2 char保留字2 real保留字return保留字2 *=單字符 單字符2 end.單字符.int 0 3! opr 0 0in pl/0 progpan iess any key to continue2.語句的測試(貼運行結(jié)果截圖) 截圖如下所示:Input pl/0 file ?22-pl0 List object code ?<¥/N>y List symbol table ?0 vai* a ;住留字fel1 begin保留字TABLE: 1 u

溫馨提示

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

評論

0/150

提交評論