




已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
實驗三 語義分析程序?qū)崿F(xiàn)一、實驗設(shè)計在實現(xiàn)詞法、語法分析程序的基礎(chǔ)上,編寫相應(yīng)的語義子程序,進行語義處理,加深對語法制導(dǎo)翻譯原理的理解,進一步掌握將語法分析所識別的語法范疇變換為某種中間代碼(四元式)的語義分析方法?;緦嶒烆}目:對文法G2中的產(chǎn)生式添加語義處理子程序,完成運算對象是簡單變量(標(biāo)識符)和無符號數(shù)的四則運算的計值處理,將輸入的四則運算轉(zhuǎn)換為四元式形式的中間代碼。語法制導(dǎo)翻譯模式是在語法分析的基礎(chǔ)上,增加語義操作來實現(xiàn)的,實際上是對前后文無關(guān)文法的一種擴展。一般而言,首先需要根據(jù)進行的語義分析工作,完成對給定文法的必要拆分和語義動作的編寫,從而為每一個產(chǎn)生式都配備相應(yīng)的語義子程序,以便在進行語法分析的同時進行語義解釋。即在語法分析過程中,每當(dāng)用一個產(chǎn)生式進行推導(dǎo)或歸約時,語法分析程序除執(zhí)行相應(yīng)的語法分析動作之外,還要調(diào)用相應(yīng)的語義子程序,以便完成生成中間代碼、查填有關(guān)表格、檢查并報告源程序中的語義錯誤等工作。每個語義子程序需指明相應(yīng)產(chǎn)生式中各個符號的具體含義,并規(guī)定使用該產(chǎn)生式進行分析時所應(yīng)采取的語義動作。這樣,語法制導(dǎo)翻譯程序在對源程序從左到右進行的一遍掃描中,既完成語法分析任務(wù),又完成語義分析和中間代碼生成方面的工作。本實驗要求從編譯器的整體設(shè)計出發(fā),重點通過對實驗二中語法分析程序的擴展,完成一個編譯器前端程序的編寫、調(diào)試和測試工作,形成一個將源程序翻譯為中間代碼序列的編譯系統(tǒng)。二、程序代碼在詞法分析和語法分析的基礎(chǔ)上,完成了語義的分析,同樣采用了頭文件的形式,在VC+6.0中運行#include#include#include#include#include#includecifa.h#includefenxibiao.h# define PL 15 /+# define MI 16 /-# define MU 17# define DI 18#define acc 100#define MAXState 20#define NUMBER 9/表達式的個數(shù)#define MAXTEMP 10/最多臨時變量的個數(shù)int StateMAXState;/狀態(tài)棧int i=0;int CURRENTSTATE=0;/標(biāo)識當(dāng)前狀態(tài)int LENGTHNUMBER=1,3,3,1,3,3,1,3,1;/表達式右邊的長度int length;int index;/索引int Yes=0;/判斷是否結(jié)束int tag=0;/判斷是否需要調(diào)用詞法程序/extern char * cifa();double e1,t4,f7;/整形char e1220,t4220,f7220;/字符型int TEMPMAXTEMP;int temp=0;int biaoshifu=0;FILE * fp;void REPORT_ERROR()Yes=1;long f1=ftell(fp);char ch=fgetc(fp);fseek(fp,-1,1);printf(語法錯誤,第%d個字符%C處n,f1,ch);void Accept()Yes=1;/printf(語法分析成功n);int INDEX(char a)/獲取當(dāng)前字符串對應(yīng)的索引int i;switch (a)case E:i=8;return(i);break;case T:i=9;return(i);break;case F:i=10;return(i);break;default: REPORT_ERROR();return(0); break;void Gen(int a,double i1,double i2,int t)/輸出四元式switch(a)case PL:printf(+,%g,%g,%d)n,i1,i2,t);break;case MI:printf(-,%g,%g,%d)n,i1,i2,t);break;case MU:printf(*,%g,%g,%d)n,i1,i2,t);break;case DI:printf(/,%g,%g,%d)n,i1,i2,t);break;default:break;void yuyi(int n)/語義子程序switch(n)case 1: temp+;/產(chǎn)生臨時變量,Gen(PL,e1,t4,temp);e1=temp;break;case 2:temp+;/產(chǎn)生臨時變量,TEMPtempGen(MI,e1,t4,temp);e1=temp;break;case 3:e1=t4;break;case 4:temp+;Gen(MU,t4,f7,temp);t4=temp;break;case 5:temp+;Gen(DI,t4,f7,temp);t4=temp;break;case 6:t4=f7;break;case 7:f7=e1;break;case 8:f7=FCON;break;default :printf(errorn);break;void Gen2(int a,char *i1,char *i2,int t)/輸出四元式switch(a)case PL:printf(+,%s,%s,%d)n,&i1,&i2,t);break;case MI:printf(-,%s,%s,%d)n,&i1,&i2,t);break;case MU:printf(*,%s,%s,%d)n,&i1,&i2,t);break;case DI:printf(/,%s,%s,%d)n,&i1,&i2,t);break;default:break;void fuzhi(char *a,char *b)/將數(shù)組b賦值給數(shù)組avoid yuyi2(int n)/語義子程序switch(n)case 1: temp+;/產(chǎn)生臨時變量Gen2(PL,e12,t42,temp);e120=temp;break;case 2:temp+;/產(chǎn)生臨時變量,TEMPtempGen2(MI,e12,t42,temp);e120=temp;break;case 3:/e12=t42;strcpy(e12,t42);break;case 4:temp+;Gen2(MU,t42,f72,temp);t420=temp;break;case 5:temp+;Gen2(DI,t42,f72,temp);t420=temp;break;case 6:/t42=f72;strcpy(t42,f72);break;case 7:/f72=e12;strcpy(f72,e12);break;case 8:/f72=TOKEN0;strcpy(f72,TOKEN);break;default :printf(errorn);break;void INPUT(int a)index=a;int index2=0;if(TableCURRENTSTATEindex!=acc)if (TableCURRENTSTATEindex=0)/報錯REPORT_ERROR();else if (TableCURRENTSTATEindex20)/移近 i+; Statei=TableCURRENTSTATEindex; CURRENTSTATE=Statei; else /規(guī)約tag=1;length=LENGTHTableCURRENTSTATEindex-20; i=i-length;/指針回退 switch(TableCURRENTSTATEindex-20)case 1: case 2:case 3:index2=8;break;case 4:case 5:case 6:index2=9;break;case 7:case 8:index2=10;break;default :REPORT_ERROR();break;if (biaoshifu!=1)/不是標(biāo)識符yuyi(TableCURRENTSTATEindex-20);/規(guī)約調(diào)用語義子程序elseyuyi2(TableCURRENTSTATEindex-20);/規(guī)約調(diào)用語義子程序CURRENTSTATE=Statei;i+; Statei=TableCURRENTSTATEindex2;CURRENTSTATE=Statei;else Accept();CURRENTSTATE=0;void main() int res; State0=0; if(fp=fopen(b.txt,r)=NULL) printf(file open error!n); exit(0); else res=cifa(fp); if(start=1)/文件以begin開始 do res=cifa(fp);if(end=0) fseek(fp,-1,1);/文件指針回退一個*/ do if(tag=0) res=cifa(fp); tag=0; if (res=26) biaoshifu=1;res=res-20; INPUT(res); while(Yes!=1);/一個語法句子翻譯完成 Y
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)科心臟瓣膜病病人的護理
- 胎膜早破護理
- 支氣管哮喘護理
- 門診護理專案改善
- 白血病病人的護理查房
- 三大改造試題及答案
- 幼兒園小班美術(shù)教案《堆雪人》
- 培訓(xùn)學(xué)校新學(xué)期動員大會
- 熊貓爬樹測試題及答案
- 運動養(yǎng)生與健康
- 工程研究中心組建方案投資可行性報告
- 部編版三年級下語文易錯字
- 偵察基礎(chǔ)知識課件
- 2025-2030中國網(wǎng)球行業(yè)發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025中國國新控股有限責(zé)任公司招聘7人筆試參考題庫附帶答案詳解
- 酒店客戶關(guān)系管理試題及答案
- 高壓氧試題(含答案)
- 傳染病人轉(zhuǎn)診制度
- Notre-Dame de Paris 巴黎圣母院音樂劇歌詞(中法雙語全)
- 物理學(xué)史考試題庫及答案(含各題型)
- 深靜脈血栓預(yù)防和護理評估
評論
0/150
提交評論