語義分析實驗報告三_第1頁
語義分析實驗報告三_第2頁
語義分析實驗報告三_第3頁
語義分析實驗報告三_第4頁
語義分析實驗報告三_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《編譯原理實踐》實驗三:中間代碼生成班級:計算機3班院系:數(shù)學與計算機學院組員:

實驗目的熟悉算術表達式的語法分析與中間代碼生成原理。實驗內容(1)設計語法制導翻譯生成表達式的四元式的算法。(2)編寫代碼并上機調試運行通過。輸入——算術表達式;輸出——語法分析結果,三地址指令形式的四元式代碼,若有錯誤將錯誤信息輸出。程序設計與實現(xiàn)步驟:(1)輸入待分析的字符串。語法如下:a.關鍵字:begin,if,then,while,do,end.b.運算符和界符::=+-*/<<=>>=<>=;()#c.其他單詞是標識符(ID)和整形常數(shù)(NUM):ID=letter(letter|digit)*,NUM=digitdigit*d.空格由空白、制表符和換行符組成。空格一般用來分隔ID、NUM、運算符、界符和關鍵字,詞法分析階段通常被忽略。(2)掃描字符串,采用遞歸向下進行分析。主要函數(shù):a.scaner()//詞法分析函數(shù),chartoken[8]用來存放構成單詞符號的字符串;b.parser()//語法分析,在語法分析的基礎上插入相應的語義動作:將輸入串翻譯成四元式序列。只對表達式、賦值語句進行翻譯。c.emit(char*result,char*arg1,char*op,char*ag2)//該函數(shù)功能是生成一個三地址語句返回四元式表中。d.char*newtemp()//該函數(shù)返回一個新的臨時變量名,臨時變量名產(chǎn)生的順序為T1,T2,…。四元式表的結構如下:struct{charresult[8];charag1[8];charop[8];charag2[8];}quad[20];(3)輸出為三地址指令形式的四元式序列。例如:語句串begina:=(3+2)/4*3+2end#,輸出的三地址指令如下:主要代碼:#include<stdio.h>#include<string.h>#include<stdlib.h>charprog[80],token[8];charch;intsyn,p,m,n,sum;intkk=0,ii,N,nn=0;intk=0,t,i=0;chartt;char*keywords[6]={"begin","if","then","while","do","end"};//關鍵字表。 intscaner(); intparser(); intstatement(); intsentence(); char*term(); char*factor(); char*expression(); voidemit(char*result,char*ag1,char*op,char*ag2); struct//四元式的結構。 { charresulted[8]; charag1ed[8]; charoped[8]; charag2ed[8]; }quad[20];voidmain(){p=0; printf("請輸入字符串,以#號結束:\n"); do { scanf("%c",&ch); prog[p++]=ch; }while(ch!='#');//沒有遇到結束符,則首先調用scaner()進行詞法分析,之后進行語義分析。 p=0; scaner(); parser();}char*newtemp(void)//返回一個新的臨時變量名,臨時變量名產(chǎn)生的順序為t1,t2,…。{ char*P; charM[8]; P=(char*)malloc(8); k++; itoa(k,M,10); strcpy(P+1,M); P[0]='t'; return(P);}intparser()//在語法分析的基礎上插入相應的語義動作:將輸入串翻譯成四元式序列。只對表達式、賦值語句進行翻譯。{ intschain=0; kk=0; if(syn==1) { scaner(); schain=sentence();//調用語句串分析函數(shù)進行分析。 if(syn=6)//“end”。 { scaner(); if(syn==0&&(kk==0)) printf("success"); } else { if(kk!=1) printf("缺end錯誤");//輸出“end”錯誤。 kk=1; } } else { printf("begin錯誤");//輸出“begin”錯誤。 kk=1; }return(schain);}intsentence()//語句串分析函數(shù)。{ intschain=0; schain=statement();//調用語句分析函數(shù)進行分析。 while(syn==26)//“;”。 { scaner(); schain=statement();//調用語句分析函數(shù)進行分析。 } return(schain);}intstatement()//語句分析函數(shù)。{ chartt[8],eplace[8]; intschain=0; switch(syn) { case10: strcpy(tt,token); scaner(); if(syn==18)//賦值語句。 { scaner(); strcpy(eplace,expression()); emit(tt,eplace,"",""); schain=0; } else { printf("缺少賦值號");//缺少“:=”錯誤。 kk=1; } return(schain); break; }}char*expression(void){ char*tp,*ep2,*eplace,*tt; tp=(char*)malloc(12);//分配空間。 ep2=(char*)malloc(12); eplace=(char*)malloc(12); tt=(char*)malloc(12); strcpy(eplace,term());//調用term分析產(chǎn)生表達式計算的第一項eplace。 while(syn==13||syn==14)//加減。 { strcpy(tt,token); scaner(); strcpy(ep2,term());//調用term()分析產(chǎn)生表達式計算的第二項ep2。 strcpy(tp,newtemp());//調用newtemp()產(chǎn)生臨時變量tp存儲計算結果。 emit(tp,eplace,tt,ep2);//生成四元式送入四元式表。 strcpy(eplace,tp); } return(eplace);}char*term(void){ char*tp,*ep2,*eplace,*tt; tp=(char*)malloc(12); ep2=(char*)malloc(12); eplace=(char*)malloc(12); tt=(char*)malloc(12); strcpy(eplace,factor()); while(syn==15||syn==16)//乘除。 { strcpy(tt,token); scaner(); strcpy(ep2,factor()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); } return(eplace);}char*factor(void){ char*fplace; fplace=(char*)malloc(12); strcpy(fplace,""); if(syn==10)//字母。 { strcpy(fplace,token); scaner(); } elseif(syn==11)//數(shù)字。 { itoa(sum,fplace,10); scaner(); } elseif(syn==27)//“(”。 { scaner(); strcpy(fplace,expression()); if(syn==28)//有“)”。 scaner(); else { printf("')'錯誤");//只有“(”,缺少“)”。 kk=1; } } else { printf("'('錯誤"); kk=1; } return(fplace);}voidemit(char*result,char*ag1,char*op,char*ag2)//生成一個三地址碼并返回到四元式代碼中。{ strcpy(quad[nn].resulted,result); strcpy(quad[nn].ag1ed,ag1); strcpy(quad[nn].oped,op); strcpy(quad[nn].ag2ed,ag2); printf("(%d)%s=%s%s%s\n",nn+1,quad[nn].resulted,quad[nn].ag1ed,quad[nn].oped,quad[nn].ag2ed); nn++;}scaner()//此函數(shù)為詞法分析。{for(n=0;n<8;n++)token[n]=NULL;ch=prog[p++];m=0;while(ch=='')ch=prog[p++];if((ch>='a')&&(ch<='z'))//判斷是否是字母。{ while((ch>='a')&&(ch<='z')||(ch>='0')&&(ch<='9'))//判斷下一個是否是字母或數(shù)字。 { token[m++]=ch;ch=prog[p++]; }token[m++]='\0';p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,keywords[n])==0)//判斷是否匹配關鍵字。 { syn=n+1;break; } }elseif(ch>='0'&&ch<='9')//判斷數(shù)字。{ sum=0; while((ch>='0')&&(ch<='9'))//判斷下一個是否是數(shù)字。 { sum=sum*10+(int)ch-'0';ch=prog[p++]; }p--;syn=11; }elseswitch(ch) {case'<'://是否是“<”。 m=0; token[m++]=ch;if(ch=='>')//是否是“>”。 { syn=21;token[m++]=ch; }elseif(ch=='=')//判斷下一個是否是“=”,即為判斷符號“<=”。 { syn=22; token[m++]=ch; }else { syn=20; ch=prog[p++]; }break;case'>'://是否是“>”。 m=0; token[m++]=ch; ch=prog[p++];if(ch=='=')//判斷下一個是否是“=”,即為判斷符號“>=”。 { syn=24; token[m++]=ch; }else { syn=23; p--;break; }break;case':'://是否是“:”。 m=0;token[m++]=ch;ch=prog[p++];if(ch=='=')//判斷下一個是否是“=”,即為判斷符號“:=”。 { syn=18; token[m++]=ch; }else { syn=17; p--; }break;case'+':syn=13;token[0]=ch;break;//判斷符號“+”。case'-':syn=14;token[0]=ch;break;//判斷符號“-”。case'*':syn=15;token[0]=ch;break;//判斷符號“*”。case'/':syn=16;token[0]=ch;break;//判斷符號“=”。case'=':syn=25;token[0]=ch;break;//判斷符號“;”。case';':syn=26;t

溫馨提示

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

評論

0/150

提交評論