編譯原理語義分析報告實驗報告材料_第1頁
編譯原理語義分析報告實驗報告材料_第2頁
編譯原理語義分析報告實驗報告材料_第3頁
編譯原理語義分析報告實驗報告材料_第4頁
編譯原理語義分析報告實驗報告材料_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、語義分析實驗報告1、 實驗目的:通過上機實習,加深對語法制導翻譯原理的理解,掌握將 語法分析所識別的語法成分變換為中間代碼的語義翻譯方法。2、 實驗要求:采用遞歸下降語法制導翻譯法,對算術(shù)表達式、賦值語句 進行語義分析并生成四元式序列。三、算法思想:1'設置語義過程。(1) emit(char *result,char *ag1 ,char *op,char *ag2)該函數(shù)的功能是生成一個三地址語 句送到四元式表中。四元式表的結(jié)構(gòu)如下:structchar result8;char ag18;char op8;char ag28;quad20;char*newtemp()該函數(shù)回送一

2、個新的臨時變量名,臨時變量名產(chǎn)生的順序為T1 ,T2,char *newtemp(void) char *p;char m8;p=(char *)malloc(8);k+;itoa(k,m,10); strcpy(p+1,m);p0= r;return(p);)2、函數(shù)Irparser在原來語法分析的基礎上插入相應的語義動作: 將輸入串翻譯成四元式序列。在實驗中我們只對表達式、賦值語句進 行翻譯。四、源程/予代碼:#include<stdio.h> #include<string.h> #include<iostream.h>#include<stdl

3、ib.h> struct char result12;char ag112;char op12;char ag212;quad;char prog80,token12;char ch;int syn,p,m=O,n,sum=O,kk; /p 是緩沖區(qū) prog 的指針、m 是 token 的指針char *rwtab6=''begin,1f,",thenM,Hwhile,;'do,;,endn;void scaner();char *factor(void);char *term(void);char *expression(void);int yucu

4、();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(quad.result,result);strcpy(quad.ag15ag1);strcpy(quad.op,op);strcpy(quad.ag2,ag2);cout«quad.result«,f=n«quad.ag1«quad.op&#

5、171;quad.ag2«endl; )char *newtemp() (char *p;char m12;p=(char *)malloc(12);k+;itoa(k5m510);strcpy(p+13m);pO=t; return (p);)void scaner()(for(n=0;n<8;n+) tokenn=NULL;ch=progp+;while(ch= *) (ch=progp;P+;Hf(ch>='a'&&ch<='z')|(ch>='A,&&ch<='Z&#

6、39;) (m=O;while(ch>=,0'&&ch<='9')|(ch>='a'&&ch<='z')|(ch>="A'&&ch<='Z') < tokenm+=ch; ch=progp+;token m+='O'P-;syn=10;for(n=0;n<6;n+)if(strcmp(token,rwtabn)=0)syn=n+1; break;)else if(ch>='0

7、9;&&ch<=,9') (sum=0;while(ch>='0'&&ch<='9') (sum=sum*10+chO1;ch=progp+;P-;syn=11;if(sum>32767) syn=-1;else switch(ch)(case,<f:m=0;tokenm+=ch;ch=progp+;if(ch='>f)(syn=21;tokenm+=ch;)else if(ch=,=,)(syn=22; tokenm+=ch;)elsesyn=23;P-;)break;case

8、,>,:m=0;tokenm+=ch;ch=progp+;if(ch='=,)(syn=24; tokenm+=ch;jelse(syn=20;P-;)break;case,:l:m=0;tokenm+=ch;ch=progp+;if(ch='=,)fsyn=18; tokenm+=ch;elsesyn=17;P-;)break;case,*,:syn=13;token0=ch;break; case7,:syn=14;token0=ch;break;casef+f:syn=15;token0=ch;break; case,J:syn=16;token0=ch;break

9、;case =f:syn=25;token0=ch;break;case,;l: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()coutvv” 調(diào)用 lrparserH«endl; int schain=O;kk=O;if(syn=1)(scaner(); schain=yucu();if(syn=6)scaner()

10、; if(syn=O && (kk=O) cout«Hsuccess!H«endl;)elseif(kk!=1)coutvv” 缺 end!”vvendl;kk=1;)elsecoutvv” 缺 begin!"«endl;kk=1; return(schain);int yucu()“coutvv” 調(diào)用 yucu"«endl;int schain=O;schain=statement();while(syn=26)(scaner();schain=statement();)return(schain);int sta

11、tement()coutvv” 調(diào)用 statement"«endl;char *eplace,*tt;eplace=(char *)malloc(12);tt=(char *)malloc(12);int schain=O;switch(syn)(case 10:strcpy(tt,token);scaner();if(syn=18)scaner();strcpy(eplace,expression();emit(tt5eplace;n,;n,);schain=O;elsecoutvv”缺少賦值符r«endl;kk=1;return(schain);break;

12、return(schain);char *expression(void)char *tp,*ep25*eplace,*tt; tp=(char *)malloc(12); ep2=(char *)malloc(12); eplace=(char*)malloc(12); tt =(char *)malloc(12); strcpy(eplace,term ();if(syn=15)strcpy(tt,H+,f); elsewhile(syn=15)|(syn=16)/調(diào)用term分析產(chǎn)生表達式計算的第一項eplacestrcpy(tt/,J,); scaner();strcpy(ep2,te

13、rm();strcpy(tp,newtemp();emit(tp,eplace,tt,ep2);strcpy(eplace,tp);/調(diào)用term分析產(chǎn)生表達式計算的第二項ep2調(diào)用newtemp產(chǎn)生臨時變量tp存儲計算結(jié)果/生成四元式送入四元式表»return(eplace);char *term(void)/ coutvv” 調(diào)用 termH«endl; char *tp/ep2,*eplace,*tt; tp=(char *)malloc(12); ep2=(char*)malloc(12); eplace=(char *)malloc(12); tt=(char *

14、)malloc(12); strcpy(eplace,factor();while(syn=13)|(syn=14) df(syn=13)strcpy(tt,'*n); else strcpy(tt/7"); scaner();strcpy(ep2,factor(); strcpy(tp,newtemp(); emit(tp,eplace,tt,ep2); strcpy(eplace,tp);)return(eplace);/調(diào)用factor分析產(chǎn)生表達式計算的第二項ep2 char *factor(void)調(diào)用newtemp產(chǎn)生臨時變量tp存儲計算結(jié)果char *fpla

15、ce;生成四元式送入四元式表fplace=(char *)malloc(12); strcpy(fplace,flt);if(syn=1O)strcpy(fplace,token);/將標識符token的值賦給fplacescaner();else if(syn=11)dtoa(sum,fplace,10); scaner();)else if(syn=27) scaner();fplace=expression(); 調(diào)用 expression if(syn=28) 分析返回表達式的值scaner();else(cout«n 缺)錯誤!”vvendl;kk=1;)elsecout«"缺(錯誤!"«endl;kk=1;)return(fplace);void main()(P=o;coutvv” 語義分析程序 *-«endl;cout«,fPlease input string:n«endl; docin.get(ch); prog

溫馨提示

  • 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

提交評論