版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、編譯原理課程設計報告設計題目 編譯代碼生成器設計 學生姓名 班 級 學 號 指導老師 成 績 一、課程設計的目的 編譯原理課程兼有很強的理論性和實踐性,是計算機專業(yè)的一門非常重要的專業(yè)基礎課程,它在系統(tǒng)軟件中占有十分重要的地位,是計算機專業(yè)學生的一門主修課。為了讓學生能夠更好地掌握編譯原理的基本理論和編譯程序構(gòu)造的基本方法和技巧,融會貫通本課程所學專業(yè)理論知識,提高他們的軟件設計能力,特設定該課程的課程設計,通過設計一個簡單的PASCAL語言(EL語言)的編譯程序,提高學生設計程序的能力,加深對編譯理論知識的理解與應用。二、課程設計的要求1、 明確課程設計任務,復習編譯理論知識,查閱復印相關(guān)的
2、編譯資料。2、 按要求完成課程設計內(nèi)容,課程設計報告要求文字和圖表工整、思路清晰、算法正確。3、 寫出完整的算法框架。4、 編寫完整的編譯程序。 三、課程設計的內(nèi)容 課程設計是一項綜合性實踐環(huán)節(jié),是對平時實驗的一個補充,課程設計內(nèi)容包括課程的主要理論知識,但由于編譯的知識量較復雜而且綜合性較強,因而對一個完整的編譯程序不適合平時實驗。通過課程設計可以達到綜合設計編譯程序的目的。本課程的課程設計要求學生編寫一個完整的編譯程序,包括詞法分析器、語法分析器以及實現(xiàn)對簡單程序設計語言中的邏輯運算表達式、算術(shù)運算表達式、賦值語句、IF語句、While語句以及dowhile語句進行編譯,并生成中間代碼和直
3、接生匯編指令的代碼生成器。四、總體設計方案及詳細設計總體設計方案:1.總體模塊主程序詞法分析程序語法分析程序中間代碼生成程序2.表2.1 各種單詞符號對應的種別碼單詞符號種別碼 單詞符號種別碼bgin1:17If2:=18Then3<20wile4<>21do5<=22end6>23lettet(letter|digit)*10>=24dight dight*11=25+13;2614(27*15)28/16#0詳細設計: 4.1界面導入設計 (1)一共三個選項:choice 1-cifafenxi choice 2-yufafenxi choice 3-z
4、hongjiandaima (2)界面演示 圖一 圖二 圖三 4.2詞法分析程序置初值調(diào)用掃描子程序輸出單詞二元組輸入串結(jié)束結(jié)束否是(1)流程圖設計(2)具體功能的具體設計1、cifafenxi( ) 首先設置progn來接收輸入的語句,以#來結(jié)束; 調(diào)用掃描子程序 scaner1( ),每一次得到一個類型碼; 用switch判別相應輸出; 直到syn1=0為止。2、掃描子程序scaner1( )-掃描輸入的語句 首先設置3個變量:token1用來存放構(gòu)成單詞符號的字符串;sum1用來存放整型單詞;syn1用來存放單詞符號的類型碼。 有關(guān)scaner1()中關(guān)鍵點解析: while(ch=
5、39; ')|(ch='n') ch=progp+; ;忽略空格 if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A') while(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A')|(ch>='0')&&(ch<='9
6、') tokenm+=ch; ch=progp+; ;判別標識符 for(n=0;n<6;n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; ;標識符是否是關(guān)鍵字 if(ch>='0')&&(ch<='9') while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' ch=progp+; ;判別整數(shù) (3) 詞法分析的運行結(jié)果 輸入begin x:=1; y:=1+2;end
7、 # 輸出4.3語法分析程序 (1) 具體功能的具體設計 1.yufafenxi()-分析程序 給出算術(shù)表達式文法,進行適當?shù)奈姆ㄗ儞Q輸入表達式;輸出表達式語法是否正確。 2.子程序的功能描述 (3) 語法分析的運行結(jié)果 分析成功圖 分析失敗圖 4.4 中間代碼生成程序(1)總體描述采用遞歸下降(自上而下)的語法制導翻譯法。在前兩次試驗的基礎上改進。詞法分析程序 à 語法分析程序 à 語義分析程序 à編譯器。不斷完善,不斷改進。漸變的過程。單詞符號及種別表單詞符號種別編碼單詞值main1int 2float3double4char5if 6else 7do8whi
8、le9l(l|d)*10內(nèi)部字符串 ( +|-| ) d*(.dd* | )( e ( +|-| ) dd*|) 20二進制數(shù)值表示=21+22- 23* 24/ 25(26)272829,30;31>32>=33<34<=35=36!=37 (2)程序結(jié)構(gòu)描述 (3) 程序的功能描述從文件中讀入表達式,輸出其四元式的結(jié)果序列 是否為main?調(diào)用scanner是否為(?調(diào)用scanner是否為)?調(diào)用scanner調(diào)用語句塊分析函數(shù)staBlock出錯處理 遞歸下降示意圖 (4)詳細功能描述void scanner(); /掃描void lrparser(); voi
9、d staBlock(int *nChain); /語句塊void staString(int *nChain); /語句串void sta(int *nChain); /語句void fuzhi(); /賦值語句void tiaojian(int *nChain); /條件語句void xunhuan(); /循環(huán)語句char* E(); /Expresiion表達式char* T(); /Term項char* F(); /Factor因子char *newTemp(); /自動生成臨時變量void backpatch(int p,int t); /回填int merge(int p1,in
10、t p2); /合并p1和p2void emit(char *res,char *num1,char *op,char *num2); /生成四元式void emit(char *res,char *num1,char *op,char *num2) 該函數(shù)的功能是生成一個三地址語句送到四式表中 char *newTemp()該函數(shù)的功能是會動一個新的臨時變量,臨時變量名產(chǎn)生的 順序是T1,T2,T3,.int merge(int p1,int p2)該函數(shù)的功能是將以P1,P2為鏈首的兩條鏈合并成一條鏈,返回時的函數(shù)值作為合并后的鏈首。void backpatch(int p,int t)該
11、函數(shù)的功能是把P所鏈接的每個四元式的第四區(qū)段(result段)都回 填t。void fuzhi()該函數(shù)的功能是對賦值語句進行分析。void tiaojian(int *nChain)該函數(shù)的功能是對條件語句進行分析。void xunhuan()該函數(shù)的功能是對循環(huán)語句進行分析。(4) 結(jié)果演示 圖一 簡單語句生成四元式 圖二 if語句的四元式生成 圖三 循環(huán)語句四元式生成(5)匯編生成if(strcmp(fourComi.opera,"=")=0) printf("Move AX,%1sn",fourComi.arg1); printf("M
12、ove %5s,Axn",fourComi.result);if(strcmp(fourComi.opera,"+")=0) printf("Mov AX,%1sn",fourComi.arg1); printf("ADD Ax,%1sn",fourComi.arg2);printf("Mov %1s,Axn",fourComi.result);if(strcmp(fourComi.opera,"-")=0) printf("Mov AX,%1sn",fourCom
13、i.arg1); printf("SUB Ax,%1sn",fourComi.arg2); printf("Mov %1s,Axn",fourComi.result);if(strcmp(fourComi.opera,"*")=0) printf("Mov AL,%1sn",fourComi.arg1); printf("MUL %1sn",fourComi.arg2); printf("Mov %1s,Axn",fourComi.result);if(strcmp(four
14、Comi.opera,"/")=0) printf("Mov AX,%1sn",fourComi.arg1); printf("DIv %1sn",fourComi.arg2); printf("Mov %1s,ALn",fourComi.result);if(strcmp(fourComi.opera,"goto")=0) printf("jmp L%1sn",i); 結(jié)果演示五、課程設計的體會與總結(jié) 經(jīng)過一個星期的編譯原理課程設計,本人在陳宏建老師的指導下,順利完成該課程
15、設 計。通過該課程設計,收獲頗多。 詞法分析的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據(jù)掃描到單詞符號的第一個字符的種類,拼出相應的單詞符號。通過本試驗的完成,更加加深了對詞法分析原理的理解。 通過本次試驗,了解了語法分析的運行過程,主程序大致流程為:“置初值”à調(diào)用scaner函數(shù)讀下一個單詞符號à調(diào)用IrParseà結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin”à不是則“出錯處理”,若是則“調(diào)用scaner函數(shù)”à調(diào)用語句串分析函數(shù)à“判斷是否為end”à不是則“出錯處理”
16、,若是則調(diào)用scaner函數(shù)à“判斷syn=0&&kk=0是否成立”成立則說明分析成功打印出來。不成立則“出錯處理”。 一、對實驗原理有更深的理解通過該課程設計,掌握了什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務,熟悉了編譯程序總流程框圖,了解了編譯程序的生成過程、構(gòu)造工具及其相關(guān)的技術(shù)對課本上的知識有了更深的理解,課本上的知識師機械的,表面的。通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機上實現(xiàn),把原來以為很深奧的書本知識變的更為簡單,對實驗原理有更深的理解。二、對該理論在實踐中的應用有深刻的理解通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機上實現(xiàn),知道和理解
17、了該理論在計算機中是怎樣執(zhí)行的,對該理論在實踐中的應用有深刻的理解。三、激發(fā)了學習的積極性通過該課程設計,全面系統(tǒng)的理解了編譯原理程序構(gòu)造的一般原理和基本實現(xiàn)方法。把死板的課本知識變得生動有趣,激發(fā)了學習的積極性。把學過的計算機編譯原理的知識強化,能夠把課堂上學的知識通過自己設計的程序表示出來,加深了對理論知識的理解。以前對與計算機操在這次課程設計中,我就是按照實驗指導的思想來完成。加深了理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實現(xiàn),培養(yǎng)實踐動手能力和程序開發(fā)能力的目的。 附錄-程序清單#include<math.h>#include<stdlib.h>#include<fs
18、tream>#include<iostream>using namespace std;#define MAX 100char inputstream50; /存儲輸入句子int temp1=0; /數(shù)組下標int right1; /判斷輸出信息int m2=0,sum2=0;/sum用于計算運算符的個數(shù) /m用于標記輸入表達式中字符的個數(shù) char JG='A'char strMAX;/用于存輸入表達式int tokene=0;/左括號的標志char prog180,token18,ch1;int syn1,p1,m1,n1,sum1;char *rwtab
19、16="begin","if","then","while","do","end"int r1 ;char prog80; /存放所有輸入字符 char token8; /存放詞組 char ch; /單個字符 int syn,p,m,n,i; /syn:種別編碼 double sum; int count; int isSignal; /是否帶正負號(0不帶,1負號,2正號)int isError;int isDecimal; /是否是小數(shù) double decimal;
20、/小數(shù) int isExp; /是否是指數(shù) int index; /指數(shù)冪 int isNegative; /是否帶負號 double temp; int temp2;int repeat; /是否連續(xù)出現(xiàn)+,-int nextq;int kk; /臨時變量的標號int ntc,nfc,nnc,nnb,nna;char *rwtab9="main","int","float","double","char","if","else","do&quo
21、t;,"while" structchar result10; /字符串(字符數(shù)組)char arg110;char opera10;char arg210;fourCom20; /結(jié)構(gòu)體數(shù)組 cifafenxi();yufafenxi();zhongjiandaima();scaner1();void e();void e1();void t();void t1();void f();void lrparser(); void staBlock(int *nChain); /語句塊void staString(int *nChain); /語句串void sta(int
22、*nChain); /語句void fuzhi(); /賦值語句void tiaojian(int *nChain); /條件語句void xunhuan(); /循環(huán)語句char* E(); /Expresiion表達式char* T(); /Term項char* F(); /Factor因子char *newTemp(); /自動生成臨時變量void backpatch(int p,int t); /回填int merge(int p1,int p2); /合并p1和p2void emit(char *res,char *num1,char *op,char *num2); /生成四元式v
23、oid scanner(); /掃描void lrparser()int nChain;nfc=ntc=1;nextq=1;if(syn=1) /mainscanner();if(syn=26) /(scanner();if(syn=27) /)scanner();staBlock(&nChain);elseprintf("缺少右括號n");else printf("缺少左括號n");elseprintf("缺少mainn");/<語句塊> := ''<語句串>''voi
24、d staBlock(int *nChain) /語句塊if(syn=28) /scanner();staString(nChain);/backpatch(*nChain,nextq);if(syn=29) /scanner(); /讀下一個elseprintf("缺少號n");elseprintf("缺少號n");/<語句串>:=<語句><語句>void staString(int *nChain) /語句串sta(nChain);backpatch(*nChain,nextq);while(syn=31) /;s
25、canner();sta(nChain);/backpatch(*nChain,nextq-1);void sta(int *nChain) /語句if(syn=10)fuzhi();/*nChain=0;else if(syn=6) /iftiaojian(nChain);else if(syn=8) /doxunhuan();/<條件語句>->if(<條件>)<語句塊>void tiaojian(int *nChain)char res10,num110,num210,op10;int nChainTemp;/<條件>-><
26、表達式><關(guān)系運算符><表達式>if(syn=6) /ifscanner();/strcpy(num1,E();if(syn=26) /(scanner();strcpy(num1,E();if(syn<=37)&&(syn>=32) switch(syn)case 32:strcpy(op,">");break;case 33:strcpy(op,">=");break;case 34:strcpy(op,"<");break;case 35:strcpy(
27、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);/nfc=nextq+1;ntc=nextq; /記住if語句位置emit("0","if",num1,"goto"); nfc=next
28、q; /if中表達式為假emit("0","","","goto");/第一個0已回填backpatch(ntc,nextq); /ntc鏈接的所有四元式都回填nextqif(syn=27) /)scanner();staBlock(&nChainTemp); /語句塊*nChain=merge(nChainTemp,nfc);/<循環(huán)語句>:=do <語句塊>while <條件>void xunhuan()char res10,num110,num210,op10;in
29、t nChainTemp;if(syn=8) /donnc=nextq; /記住if語句位置,emit之后nextq就變了/emit("0","if",num1,"goto"); scanner();staBlock(&nChainTemp); /語句塊if(syn=9) /whilescanner();if(syn=26) /(scanner();strcpy(num1,E();if(syn<=37)&&(syn>=32) switch(syn)case 32:strcpy(op,"&g
30、t;");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");scanner();strcpy(num2,E();strcat(num1,op);s
31、trcat(num1,num2);nnb=nextq;emit("0","if",num1,"goto"); backpatch(nnb,nnc);nna=nextq;emit("0","","","goto");backpatch(nna,nextq);if(syn=27) /)scanner();void fuzhi() /賦值語句只有1個操作數(shù)char res10,num10; /num操作數(shù)if(syn=10) /字符串strcpy(res,tok
32、en); /結(jié)果scanner();if(syn=21) /=scanner();strcpy(num,E();emit(res,num,"=","");elseprintf("缺少=號n");char* E() /Expression表達式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)|
33、(syn=23) /+ -if(syn=22) /+strcpy(op,"+");elsestrcpy(op,"-");scanner();strcpy(num2,T();strcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);return num1;char* T() /Term項char *res,*num1,*op,*num2;res=(char *)malloc(10);num1=(char *)malloc(10);op=(char *)malloc(10);num2=(char
34、 *)malloc(10);strcpy(num1,F();while(syn=24)|(syn=25) /* /if(syn=24) strcpy(op,"*");elsestrcpy(op,"/");scanner();strcpy(num2,F();strcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);return num1;char* F() /Factor因子char *res;res=(char *)malloc(10);if(syn=10) /字符串strcpy(res,t
35、oken);scanner();else if(syn=20) /二進制數(shù)itoa(int)sum,res,10); /整數(shù)轉(zhuǎn)換為字符串scanner();else if(syn=26) /(scanner();res=E();if(syn=27) /)scanner();else isError=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
36、 p;/將p所鏈接的每個四元式的第四個分量都回填tvoid backpatch(int p,int t) int w,circle=p;while(circle) /circle不為0的時候w=atoi(fourComcircle.result); /四元式circle第四分量內(nèi)容/strcpy(fourComcircle.result,t); /把t填進四元式circle的第四分量sprintf(fourComcircle.result,"%d",t);circle=w; /w記錄的是鏈條上下一個四元式,移動!return;int merge(int p1,int p2)
37、 /合并p1和p2char circle,nResult;if(p2=0)nResult=p1;elsenResult=circle=p2;while(atoi(fourComcircle.result) /四元式第四個分量不為0circle=atoi(fourComcircle.result); /strcpy(fourComcircle.result,p1);sprintf(fourComcircle.result,"%s",p1);/目的是用p1的值覆蓋0return nResult; /p2是頭,p1覆蓋0,接在p2后邊void emit(char *res,cha
38、r *num1,char *op,char *num2)strcpy(fourComnextq.result,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+; /從prog中讀出一個字符到ch中 while(ch=' '|ch='n') /跳過空字
39、符(無效輸入) ch=progp+; if(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z') /ch是字母字符 while(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z')|(ch>='0')&&(ch<='9') tokenm+=ch
40、; /ch=>token ch=progp+; /讀下一個字符 tokenm+='0' p-; /回退一格 syn=10; /標識符 /如果是"begin","if","then","while","do","end"標識符中的一個 for(n=0;n<9;n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; else if(ch>='0')&&(ch<='
41、9') IsNum: if(isSignal=1) /tokenm+='-' while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' /ch中數(shù)字本身是當做字符存放的 ch=progp+; if(ch='.') isDecimal=1; ch=progp+; count=0; /之前忘了清零,123.123+123.123#兩個浮點數(shù)就無法識別 while(ch>='0')&&(ch<='9
42、9;) /pow(x,y)計算x的y次冪 temp=(ch-'0')*pow(0.1,+count); decimal=decimal+temp; /AddToDec(); 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') /指數(shù) index=index*10+ch-&
43、#39;0' ch=progp+; /10的冪 /123e3代表123*10(3) /sum=sum*pow(10,index);是錯誤的 if(isNegative) sum=sum*pow(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
44、=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')&&(temp2<='9')&&(repeat=1)isSignal=2;ch=progp+;repeat=0;goto IsNum;if(temp2='+')|(temp2='-')&&(repeat=0) /如果重復出現(xiàn)符號,才將后邊的+,-視為正負號repeat=1;/ch=progp+;syn=22;break;case '-':temp2=progp;tokenm+=ch;if(temp2&g
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 寵物寄養(yǎng)中心2025年度會員制寄養(yǎng)服務協(xié)議3篇
- 2025年度大米產(chǎn)業(yè)鏈上下游資源整合及供應鏈管理服務合同3篇
- 2025年度航空運輸租賃合同范本:全新合作協(xié)議3篇
- 二零二五年度新型木工次結(jié)構(gòu)建筑構(gòu)件加工與施工合同3篇
- 2025貨物采購合同樣書
- 二零二五年度企業(yè)數(shù)字化轉(zhuǎn)型與客戶關(guān)系管理服務合同3篇
- 2025年度一手新房全款合同簡易版(含智能家居)3篇
- 2025年度農(nóng)村土地置換項目合作協(xié)議書
- 二零二五年度熱處理設備生產(chǎn)與市場分析合同3篇
- 二零二五年度農(nóng)村危房改造回遷房買賣合同
- 企業(yè)內(nèi)部申請北京工作居住證管理制度
- 《深色名貴硬木家具》學習分享
- 最新監(jiān)督學模擬試卷及答案解析
- DS12C887電子時鐘(附程序)
- 新產(chǎn)品試制流程管理辦法
- 王牌電話交換機說明書
- 列管式換熱器-換熱面積計算
- 25m預應力混凝土簡支T梁橋設計(共30頁)
- 高一學生文理分班意向表
- 高等傳熱學部分答案
- 地球物理學進展投稿須知
評論
0/150
提交評論