




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、語義分析實驗報告1、 實驗目的:通過上機實習, 加深對語法制導翻譯原理的理解, 掌握將語法分析所識別的語法成分變換為中間代碼的語義翻譯方法。2、 實驗要求:采用遞歸下降語法制導翻譯法, 對算術表達式、 賦值語句進行語義分析并生成四元式序列。3、 算法思想:1、設置語義過程。( 1) emit(char *result,char *ag1,char *op,char *ag2)該函數的功能是生成一個三地址語句送到四元式表中。四元式表的結構如下:struct char result8;char ag18;char op8;char ag28;quad20;(2) char *newtemp()該函
2、數回送一個新的臨時變量名,臨時變量名產生的順序為t1,t2, char *newtemp(void) char *p;char m8;p=(char *)malloc(8);k+;itoa(k,m,10);strcpy(p+1,m);p0= t ;return(p);2、函數lrparser 在原來語法分析的基礎上插入相應的語義動作: 將輸入串翻譯成四元式序列。 在實驗中我們只對表達式、 賦值語句進行翻譯。4、 源程序代碼:#include<>#include<>#include<>#include<>structchar result12;ch
3、ar ag112;char op12;char ag212;quad;char prog80,token12;char ch;int syn,p,m=0,n,sum=0,kk;/p 是緩沖區 prog 的指針,m是 token 的指針char *rwtab6="begin","if","then","while","do","end"void scaner();char *factor(void);char *term(void);char *expression(void)
4、;int yucu();void emit(char *result,char *ag1,char *op,char *ag2);char *newtemp();int statement();int k=0;void emit(char *result,char *ag1,char *op,char *ag2)strcpy,result);strcpy,ag1);strcpy,op);strcpy,ag2);)char *newtemp()(char *p;char m12;p=(char *)malloc(12);k+;itoa(k,m,10);strcpy(p+1,m);p0='
5、t'return (p);)void scaner()(for(n=0;n<8;n+) tokenn=null;ch=progp+;while(ch='')(ch=progp;p+;)if(ch>='a'&&ch<='z')|(ch>='a'&&ch<=z)(m=0;while(ch>='0'&&ch<='9')|(ch>='a'&&ch<='z
6、9;)|(ch>='a'&&ch<=z) (tokenm+=ch;ch=progp+;)tokenm+='0'p-;syn=10;for(n=0;n<6;n+)if(strcmp(token,rwtabn)=0)(syn=n+1;break;)else if(ch>='0'&&ch<='9')(sum=o;while(ch>='0'&&ch<='9')(sum=sum*10+ch-'o'ch=p
7、rogp+;)p-;syn=11;if(sum>32767)syn=-1;)else switch(ch)(case'<':m=0;tokenm+=ch;ch=progp+;if(ch='>')(syn=21;tokenm+=ch;)else if(ch='=')syn=22;tokenm+=ch;)else(syn=23;p-;)break;case'>':m=0;tokenm+=ch;ch=progp+;if(ch='=')(syn=24;tokenm+=ch;)else(syn=20;
8、p-;)break;case':':m=0;tokenm+=ch;ch=progp+;if(ch='=')(syn=18;tokenm+=ch;)else(syn=17;p-;break;case'*':syn=13;token0=ch;break;case'/':syn=14;token0=ch;break;case'+':syn=15;token0=ch;break;case'-':syn=16;token0=ch;break;case'=':syn=25;token0=ch;b
9、reak;case'':syn=26;token0=ch;break;case'(':syn=27;token0=ch;break;case')':syn=28;token0=ch;break;case'#':syn=0;token0=ch;break;default: syn=-1;break;int lrparser() /cout<<" 調用 lrparser"<<endl;int schain=0;kk=0;if(syn=1)scaner();schain=yucu();if(s
10、yn=6)scaner();if(syn=0 && (kk=0)cout<<"success!"<<endl;elseif(kk!=1)cout<<" 缺 end!"<<endl;kk=1;elsecout<<" 缺 begin!"<<endl;kk=1;return(schain);int yucu()/ cout<<" 調用 yucu"<<endl;int schain=0;schain=statem
11、ent();while(syn=26)scaner();schain=statement();return(schain);int statement() /cout<<" 調用 statement"<<endl;char *eplace,*tt;eplace=(char *)malloc(12);tt=(char *)malloc(12);int schain=0;switch(syn)case 10:strcpy(tt,token);scaner();if(syn=18)scaner();strcpy(eplace,expression();em
12、it(tt,eplace,"","");schain=0;elsecout<<" 缺少賦值符!"<<endl;kk=1;return(schain);break;return(schain);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 (
13、);/ 調用 term 分析產生表達式計算的第一項eplacewhile(syn=15)|(syn=16)if(syn=15)strcpy(tt,"+");else strcpy(tt,"-");scaner();strcpy(ep2,term();/ 調用 term 分析產生表達式計算的第二項ep2/ 生成四元式送入四元式表strcpy(tp,newtemp(); / 調用 newtemp 產生臨時變量tp 存儲計算結果emit(tp,eplace,tt,ep2);strcpy(eplace,tp);return(eplace); char *term
14、(void)/ cout<<" 調用 term"<<endl;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=13)|(syn=14)if(syn=13)strcpy(tt,"*");else strcpy(tt,"/");/ 調用 factor 分析產生表達
15、式計算的第二項ep2/ 調用 newtemp 產生臨時變量tp 存儲計算結果/ 生成四元式送入四元式表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);/ 將標識符 token 的值賦給 fplacesca
16、ner();else if(syn=11)itoa(sum,fplace,10);scaner();else if(syn=27)scaner();fplace=expression();/ 調用 expression 分析返回表達式的值if(syn=28)scaner();elsecout<<" 缺) 錯誤 !"<<endl;kk=1;elsecout<<" 缺(錯誤 !"<<endl;kk=1;return(fplace);void main()p=0;cout<<"q*語義分析程
17、序*"<<endl;cout<<"please input string:"<<endl;do(ch);progp+=ch;while(ch!='#');p=0;scaner();lrparser();五、結果驗證:1、給定源程序begin a:=2+3*4; x:=(a+b)/c end#輸出結果mhkjckjtmkm h吾義夕斤捍 :k m! j< jo< km ihwfrplease input string:hegfin a: =2+3*4? x: = <a+)>/c end#tl=3*4t2=2+tia=t2td3t3/cx-t4 successtpress any key to continue2、源程序begin a:=9; x:=2*3-1; b:=(a+x)/2 end#
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟棗獼猴桃栽培技術分析
- 職業培訓講解
- 中醫內科頭痛診療體系
- 企業檔案培訓
- 商業綜合體室外攤位布局與路燈照明一體化施工合同
- 城市交通樞紐車輛收費員勞動派遣合同
- 《綠色建筑設計與施工監理合同》
- 礦山土地權屬變更與資源開采權許可協議
- 柴油發動機改裝服務合同范本
- 餐飲企業商鋪租賃及品牌拓展合同
- 公安院校公安專業招生政治考察表在校表現考察表面試表
- 2025年班組長個人職業素養知識競賽考試題庫500題(含答案)
- 網絡題庫財務會計知識競賽1000題(僅供自行學習使用)
- 2025海南中考:歷史必考知識點
- 2024-2025學年蘇教版七年級生物下冊知識點復習提綱
- A0726 非授權人員進入保密要害部門、部位審批表
- 食品營養標簽的解讀課件
- 二手新能源汽車充電安全承諾書
- 品質異常8D報告 (錯誤模板及錯誤說明)指導培訓
- 貴陽市建設工程消防整改驗收申請表
- 2021-2022學年云南省昆明市高一下冊物理期末調研試題(含答案)
評論
0/150
提交評論