




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、語義分析實(shí)驗(yàn)報(bào)告1、 實(shí)驗(yàn)?zāi)康模和ㄟ^上機(jī)實(shí)習(xí),加深對語法制導(dǎo)翻譯原理的理解,掌握將 語法分析所識(shí)別的語法成分變換為中間代碼的語義翻譯方法。2、 實(shí)驗(yàn)要求:采用遞歸下降語法制導(dǎo)翻譯法,對算術(shù)表達(dá)式、賦值語句 進(jìn)行語義分析并生成四元式序列。三、算法思想:1'設(shè)置語義過程。(1) emit(char *result,char *ag1 ,char *op,char *ag2)該函數(shù)的功能是生成一個(gè)三地址語 句送到四元式表中。四元式表的結(jié)構(gòu)如下:structchar result8;char ag18;char op8;char ag28;quad20;char*newtemp()該函數(shù)回送一
2、個(gè)新的臨時(shí)變量名,臨時(shí)變量名產(chǎn)生的順序?yàn)門1 ,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在原來語法分析的基礎(chǔ)上插入相應(yīng)的語義動(dòng)作: 將輸入串翻譯成四元式序列。在實(shí)驗(yàn)中我們只對表達(dá)式、賦值語句進(jìn) 行翻譯。四、源程/予代碼:#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)生表達(dá)式計(jì)算的第一項(xiàng)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)生表達(dá)式計(jì)算的第二項(xiàng)ep2調(diào)用newtemp產(chǎn)生臨時(shí)變量tp存儲(chǔ)計(jì)算結(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)生表達(dá)式計(jì)算的第二項(xiàng)ep2 char *factor(void)調(diào)用newtemp產(chǎn)生臨時(shí)變量tp存儲(chǔ)計(jì)算結(jié)果char *fpla
15、ce;生成四元式送入四元式表fplace=(char *)malloc(12); strcpy(fplace,flt);if(syn=1O)strcpy(fplace,token);/將標(biāo)識(shí)符token的值賦給fplacescaner();else if(syn=11)dtoa(sum,fplace,10); scaner();)else if(syn=27) scaner();fplace=expression(); 調(diào)用 expression if(syn=28) 分析返回表達(dá)式的值scaner();else(cout«n 缺)錯(cuò)誤!”vvendl;kk=1;)elsecout«"缺(錯(cuò)誤!"«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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年住宅水電安裝項(xiàng)目材料人工費(fèi)用合同
- 2025年印刷合同樣式
- 2025年倉儲(chǔ)合同保管責(zé)任規(guī)定
- 護(hù)工勞動(dòng)雇傭合同7篇
- 2025年醫(yī)療產(chǎn)品維護(hù)保養(yǎng)服務(wù)合同范本
- 2025年企業(yè)標(biāo)志牌定制與安裝合同
- 2025年醫(yī)療機(jī)構(gòu)建設(shè)施工合同示范文本
- 【采購合同】綠化采購合同5篇
- 學(xué)校體育設(shè)施管理維護(hù)合同
- 2025年甘肅省臨夏回族自治州單招職業(yè)傾向性測試題庫及完整答案一套
- 五險(xiǎn)一金繳費(fèi)明細(xì)表
- MT/T 655-1997煤礦用帶式輸送機(jī)托輥軸承技術(shù)條件
- GB/T 27648-2011重要濕地監(jiān)測指標(biāo)體系
- 全套教學(xué)課件《管理學(xué)基礎(chǔ)》
- “兩區(qū)三廠”專項(xiàng)施工方案
- (完整版)新標(biāo)準(zhǔn)大學(xué)英語視聽說教程3第二版整本書答案
- 第五章肺孢子菌病課件
- 【5A】雅思寫作課程課件
- Intercultural-Communica教學(xué)講解課件
- 青島版小學(xué)數(shù)學(xué)五年級(jí)上冊《用數(shù)對確定位置》課件
- 2023年鄭州衛(wèi)生健康職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試筆試模擬試題及答案解析
評(píng)論
0/150
提交評(píng)論