




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、.甘肅政法學(xué)院編譯原理課程設(shè)計題 目 C語言編譯器實現(xiàn)計算機科學(xué)學(xué)院計算機科學(xué)與技術(shù)專業(yè)10 級 計本 班學(xué) 號: 201081010137 姓 名: 楊青虎 指導(dǎo)教師: 李 霞 完成時間: 2013 年 6 月 目 錄一、 原理11、簡介12、單詞符號及種別表示13、語法結(jié)構(gòu)定義如下:2二、運行環(huán)境3三、 算法設(shè)計思想31、詞法分析主要算法32、語法分析主要算法33、語義分析主要算法4四、 程序流程圖5五、運行測試結(jié)果8六、心得體會9七、源代碼9;C語言編譯器實現(xiàn)一、 原理1、簡介 編譯程序的工作過程一般可以分為五個階段:詞法分析、語法分析、語義分析與中間代碼產(chǎn)生、優(yōu)化、目標(biāo)代碼生成。每一個
2、階段在功能上是相對獨立的,它一方面從上一個階段獲取分析的結(jié)果來進行分析,另一方面由將結(jié)果傳遞給下一個階段。由編譯程序的五個階段就對應(yīng)了編譯系統(tǒng)的結(jié)構(gòu)。表格管理出錯處理單詞符號語法單元中間代碼中間代碼目標(biāo)代碼語法分析器語義分析與中間代碼生成器優(yōu)化器目標(biāo)代碼生成器詞法分析器2、單詞符號及種別表示1單詞符號種別編碼main1int 2float3double4char5if 6else 7do8while9l(l|d)*10dd* 20=21+22- 23* 24/ 25(26)272829,30;31>32>=33<34<=35=36!=3701000ERROR-13、語法
3、結(jié)構(gòu)定義如下:<程序> := main()<語句塊> <語句塊> := <語句串> <語句串>:=<語句><語句><語句>:=<賦值語句>|<條件語句>|<循環(huán)語句><賦值語句>:=ID=<表達式> <條件語句>:=if<條件><語句塊> <循環(huán)語句>:=do <語句塊>while <條件><條件>:=<表達式><關(guān)系運算符><
4、表達式> <表達式> := <項> +<項>|-<項><項> := <因子>*<因子>|/<因子><因子> :=ID|num|(<表達式>)<關(guān)系運算符> := <|<=|>|>=|=|!二、運行環(huán)境Windows 系統(tǒng) Visual C+ 6.0三、 算法設(shè)計思想1、詞法分析主要算法這部分對源文件進行分析,允許/* */注釋。從源文件依次讀取字符,對字符進行分析,組成字符串、數(shù)字、關(guān)系符等固定含義的token符,并把它們添加到tok
5、en鏈中,如果遇到非法字符報錯并退出程序。2、語法分析主要算法這部分對Token鏈進行分析,利用自底向上的分析方法,構(gòu)建SLR(1)分析表的過程是手工完成的。語法分析的同時構(gòu)建語法樹,移進時創(chuàng)建葉子,規(guī)約時創(chuàng)建節(jié)點。3、語義分析主要算法這部分對語法樹從左到右進行遍歷,節(jié)點記錄了規(guī)約式的編號,遍歷到節(jié)點時就進行相應(yīng)處理。語義分析主要檢查變量、函數(shù)是否被定義或重定義,同時產(chǎn)生四元式。函數(shù)一覽表void scanner(); void lrparser(); void staBlock(int *nChain); void staString(int *nChain);void sta(int *n
6、Chain); void fuzhi(); void tiaojian(int *nChain); void xunhuan(); char* E(); char* T(); char* F(); char *newTemp(); void backpatch(int p,int t); int merge(int p1,int p2); void emit(char *res,char *num1,char *op,char *num2);四元組結(jié)構(gòu)體定義:structchar result10; char arg110;char opera10;char arg210;fourCom20;
7、四、 程序流程圖初始化調(diào)用scanner讀下一個單詞符號調(diào)用irparser循環(huán)輸出四元式fourcom結(jié)束圖1 主函數(shù)流程圖是否main否是調(diào)用scanner是否是(否調(diào)用scanner是是否是)否是調(diào)用scanner出錯處理調(diào)用語句塊分析函數(shù)stablock圖2 遞歸下降分析分析程序流程圖 是否是否是調(diào)用scanner調(diào)用語句串分析函數(shù)stastring調(diào)用scanner出錯處理是否是否圖3 語句塊分析流程圖調(diào)用語句分析函數(shù)sta回溯,調(diào)用backpatch是否是;否調(diào)用scanner是出錯處理調(diào)用語句分析函數(shù)sta圖4 語句串分析流程圖是否是字符串調(diào)用賦值語句分析函數(shù)fuzhi是否是否是
8、if否是調(diào)用條件語句分析函數(shù)tiaojian是否是do否是調(diào)用循環(huán)語句分析函數(shù)xunhuan圖5 語句分析流程圖五、運行測試結(jié)果正確程序結(jié)果錯誤程序結(jié)果:報錯?。?)錯誤程序結(jié)果:報錯?。?)六、心得體會這次的課程設(shè)計,最大的收獲就是清楚了編譯的整個過程,在學(xué)習(xí)編譯原理這門課程之時,在做設(shè)計的過程中和詞法分析、語法分析、語義分析聯(lián)系起來, 非常清晰的理解了簡單編譯器實現(xiàn)過程。讀完了一個完整的源程序,知道了它里面的功能??煲约敖Y(jié)構(gòu)組織,也明白了編譯的基本原理.。在實驗中加深了在課堂上說學(xué)到編譯原理知識的理解,實驗中實踐了書本上的知識和原理。通過這次課程設(shè)計也使我認(rèn)識到自己的不足。首先這些代碼我并
9、不能獨立完成,而是在網(wǎng)上查閱了大量資料,以及在許多同學(xué)的幫助下才完成的。其次平時對編譯原理的各個部分理解的不錯,平時實驗做的也還可以,只是在做這次的課程設(shè)計的時候需要把整個編譯的過程整體的思路搞清楚。通過看以前的筆記和課本,我了解了各個階段間的連接,最終使得本次課程設(shè)計的順利完成。七、源代碼#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>char prog80; char token8; char ch; int syn,p,m,n,i; double su
10、m; int count; int isSignal; int isError;int isDecimal; double decimal; int isExp; int index; int isNegative; double temp; int temp2;int repeat; int nextq;int kk; int ntc,nfc,nnc,nnb,nna;char *rwtab9="main","int","float","double","char","if"
11、,"else","do","while"structchar result10; char arg110;char opera10;char arg210;fourCom20; void scanner(); void lrparser(); void staBlock(int *nChain); void staString(int *nChain);void sta(int *nChain); void fuzhi(); void tiaojian(int *nChain); void xunhuan(); char* E();
12、char* T(); char* F(); char *newTemp(); void backpatch(int p,int t); int merge(int p1,int p2); void emit(char *res,char *num1,char *op,char *num2); void main()p=0;count=0;isDecimal=0;index=0;repeat=0;kk=0;printf("n請輸入待編譯程序:n");doch=getchar();progp+=ch;while(ch!='#');p=0;isError=0;sc
13、anner();lrparser();for(i=1;i<nextq;i+) printf("n%dt",i);printf("(%5s %5s %5s t%5s )n",fourComi.arg1,fourComi.opera,fourComi.arg2,fourComi.result);void lrparser()int nChain;nfc=ntc=1;nextq=1;if(syn=1) scanner();if(syn=26) scanner();if(syn=27)scanner();staBlock(&nChain);else
14、printf("缺少右括號n");else printf("缺少左括號n");elseprintf("缺少mainn");void staBlock(int *nChain) if(syn=28) scanner();staString(nChain);if(syn=29) scanner(); elseprintf("缺少號n");elseprintf("缺少號n");void staString(int *nChain) sta(nChain);backpatch(*nChain,nextq
15、);while(syn=31) scanner();sta(nChain);void sta(int *nChain) if(syn=10)fuzhi();else if(syn=6) tiaojian(nChain);else if(syn=8) xunhuan();void tiaojian(int *nChain)char res10,num110,num210,op10;int nChainTemp;if(syn=6) scanner();if(syn=26) scanner();strcpy(num1,E();if(syn<=37)&&(syn>=32)
16、switch(syn)case 32:strcpy(op,">");break;case 33:strcpy(op,">=");break;case 34:strcpy(op,"<");break;case 35:strcpy(op,"<=");break;case 36:strcpy(op,"=");break;case 37:strcpy(op,"!=");break;default:printf("error");scanne
17、r();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);ntc=nextq; emit("0","if",num1,"goto"); nfc=nextq; emit("0","","","goto");backpatch(ntc,nextq); if(syn=27) scanner();staBlock(&nChainTemp); *nChain=merge(nChainTemp,nfc);voi
18、d xunhuan()char res10,num110,num210,op10;int nChainTemp;if(syn=8) nnc=nextq; scanner();staBlock(&nChainTemp); if(syn=9) scanner();if(syn=26) scanner();strcpy(num1,E();if(syn<=37)&&(syn>=32) switch(syn)case 32:strcpy(op,">");break;case 33:strcpy(op,">=");br
19、eak;case 34:strcpy(op,"<");break;case 35:strcpy(op,"<=");break;case 36:strcpy(op,"=");break;case 37:strcpy(op,"!=");break;default:printf("error");scanner();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);nnb=nextq;emit("0","if&
20、quot;,num1,"goto"); backpatch(nnb,nnc);nna=nextq;emit("0","","","goto");backpatch(nna,nextq);if(syn=27) scanner();void fuzhi() char res10,num10; if(syn=10) strcpy(res,token);scanner();if(syn=21) scanner();strcpy(num,E();emit(res,num,"=",&qu
21、ot;");elseprintf("缺少=號n");char* E()char *res,*num1,*op,*num2;res=(char *)malloc(10);num1=(char *)malloc(10);op=(char *)malloc(10);num2=(char *)malloc(10);strcpy(num1,T();while(syn=22)|(syn=23) if(syn=22)strcpy(op,"+");elsestrcpy(op,"-");scanner();strcpy(num2,T();st
22、rcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);return num1;char* T() char *res,*num1,*op,*num2;res=(char *)malloc(10);num1=(char *)malloc(10);op=(char *)malloc(10);num2=(char *)malloc(10);strcpy(num1,F();while(syn=24)|(syn=25) /* /if(syn=24) strcpy(op,"*");elsestrcpy(op,"/
23、");scanner();strcpy(num2,F();strcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);return num1;char* F() char *res;res=(char *)malloc(10);if(syn=10)strcpy(res,token);scanner();else if(syn=20) itoa(int)sum,res,10);scanner();else if(syn=26) scanner();res=E();if(syn=27) scanner();else isErr
24、or=1;elseisError=1;return res;char *newTemp()char *p;char varTemp10;p=(char *)malloc(10);kk+;itoa(kk,varTemp,10);strcpy(p+1,varTemp);p0='T'return p;void backpatch(int p,int t) int w,circle=p;while(circle)w=atoi(fourComcircle.result); sprintf(fourComcircle.result,"%d",t);circle=w; r
25、eturn;int merge(int p1,int p2) char circle,nResult;if(p2=0)nResult=p1;elsenResult=circle=p2;while(atoi(fourComcircle.result)circle=atoi(fourComcircle.result); sprintf(fourComcircle.result,"%s",p1);return nResult; void emit(char *res,char *num1,char *op,char *num2)strcpy(fourComnextq.result
26、,res);strcpy(fourComnextq.arg1,num1);strcpy(fourComnextq.opera,op);strcpy(fourComnextq.arg2,num2);nextq+;void scanner() sum=0; decimal=0; m=0; for(n=0;n<8;n+) tokenn=NULL; ch=progp+; while(ch=' '|ch='n') ch=progp+; if(ch>='a')&&(ch<='z')|(ch>='
27、A')&&(ch<='Z') while(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z')|(ch>='0')&&(ch<='9') tokenm+=ch; ch=progp+; tokenm+='0' p-; syn=10; for(n=0;n<9;n+) if(strcmp(token,rwtabn)=0) syn
28、=n+1; break; else if(ch>='0')&&(ch<='9') IsNum:if(isSignal=1)while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' ch=progp+; if(ch='.') isDecimal=1; ch=progp+; count=0; while(ch>='0')&&(ch<='9') temp=(ch
29、-'0')*pow(0.1,+count); decimal=decimal+temp;ch=progp+; sum=sum+decimal; if(ch='e'|ch='E') isExp=1; ch=progp+; if(ch='-') isNegative=1; ch=progp+; while(ch>='0')&&(ch<='9') index=index*10+ch-'0' ch=progp+; if(isNegative) sum=sum*po
30、w(0.1,index); else sum=sum*pow(10,index); if(isSignal=1)sum=-sum;isSignal=0;p-; syn=20; else switch(ch) case '<': m=0; tokenm+=ch; ch=progp+; if(ch='=') syn=35; tokenm+=ch; else syn=34; p-; break; case '>': m=0; tokenm+=ch; ch=progp+; if(ch='=') syn=33; tokenm+=ch; else syn=32; p-; break; case '=': m=0; tokenm+=ch; ch=progp+; if(ch='=') syn=36; tokenm+=ch; else syn=21; p-; break; case '+':temp2=progp;tokenm+=ch;if(temp2>='0')&&(te
溫馨提示
- 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óng)村水電資源開發(fā)與農(nóng)村生態(tài)旅游合作協(xié)議(2025年度)
- 2025年度高新技術(shù)產(chǎn)業(yè)園區(qū)場地?zé)o償使用協(xié)議
- 二零二五年度勞務(wù)安全責(zé)任協(xié)議書(含安全設(shè)備更新)
- 二零二五年度公共停車場地下車庫車位轉(zhuǎn)讓及管理服務(wù)合同
- 2025年度智能交通管理系統(tǒng)研發(fā)公司合作成立協(xié)議
- 珠寶抵押貸款與品牌合作及銷售渠道建設(shè)協(xié)議
- 二零二五年度辦公室裝修設(shè)計施工安全防護合同
- 二零二五年度新房買賣合同房屋租賃權(quán)轉(zhuǎn)讓手續(xù)費協(xié)議
- 二零二五年度房屋置換金融產(chǎn)品全新房屋置換對方房屋置換及金融產(chǎn)品協(xié)議
- Boomer-XL3D鑿巖臺車(修訂版)
- 幼兒園小班故事《貪吃的小豬》課件
- 三年級(下)道德與法治第三單元教材分析課件
- Passport評估工具:項目復(fù)雜度評估表
- 南寧鐵路局招聘2023年高校畢業(yè)生133人筆試參考題庫(共500題)答案詳解版
- 軍用飛機改進方案
- 多發(fā)性肌炎的基本知識
- 《大學(xué)物理學(xué)》精美課件(全)
- 政府投資項目立項申請表-正面
- EGCs與腸道微環(huán)境相互作用的研究進展
- 新版-GSP-:中藥材、中藥飲片知識培訓(xùn)試題及答案
評論
0/150
提交評論