編譯原理課程設(shè)計C語言編譯器的實現(xiàn)_第1頁
編譯原理課程設(shè)計C語言編譯器的實現(xiàn)_第2頁
編譯原理課程設(shè)計C語言編譯器的實現(xiàn)_第3頁
編譯原理課程設(shè)計C語言編譯器的實現(xiàn)_第4頁
編譯原理課程設(shè)計C語言編譯器的實現(xiàn)_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余23頁可下載查看

下載本文檔

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

文檔簡介

1、編譯原理課程設(shè)計報告設(shè)計題目編譯代碼生成器設(shè)計學(xué)生姓名班級學(xué)號指導(dǎo)老師一、課程設(shè)計的目的編譯原理課程兼有很強(qiáng)的理論性和實踐性,是計算機(jī)專業(yè)的一門非常重要的專業(yè)基礎(chǔ)課程,它在系統(tǒng)軟件中占有十分重要的地位,是計算機(jī)專業(yè)學(xué)生的一門主修課。為了讓學(xué)生能夠更好地掌握編譯原理的基本理論和編譯程序構(gòu)造的基本方法和技巧,融會貫通本課程所學(xué)專業(yè)理論知識,提高他們的軟件設(shè)計能力,特設(shè)定該課程的課程設(shè)計,通過設(shè)計一個簡單的PASCA曲言(EL語言)的編譯程序,提高學(xué)生設(shè)計程序的能力,加深對編譯理論知識的理解與應(yīng)用。二、課程設(shè)計的要求1、明確課程設(shè)計任務(wù),復(fù)習(xí)編譯理論知識,查閱復(fù)印相關(guān)的編譯資料。2、按要求完成課程設(shè)

2、計內(nèi)容,課程設(shè)計報告要求文字和圖表工整、思路清晰、算法正確。3、寫出完整的算法框架。4、編寫完整的編譯程序。三、課程設(shè)計的內(nèi)容課程設(shè)計是一項綜合性實踐環(huán)節(jié),是對平時實驗的一個補(bǔ)充,課程設(shè)計內(nèi)容包括課程的主要理論知識,但由于編譯的知識量較復(fù)雜而且綜合性較強(qiáng),因而對一個完整的編譯程序不適合平時實驗。通過課程設(shè)計可以達(dá)到綜合設(shè)計編譯程序的目的。本課程的課程設(shè)計要求學(xué)生編寫一個完整的編譯程序,包括詞法分析器、語法分析器以及實現(xiàn)對簡單程序設(shè)計語言中的邏輯運(yùn)算表達(dá)式、算術(shù)運(yùn)算表達(dá)式、賦值語句、IF語句、While語句以及do-while語句進(jìn)行編譯,并生成中間代碼和直接生匯編指令的代碼生成器。四、總體設(shè)計

3、方案及詳細(xì)設(shè)計總體設(shè)計方案:1 .總體模塊2.表2.1各種單詞符號對應(yīng)的種別碼單詞符號種別碼單詞符號種別碼bginIf12:=1718Then320wile421do523lettet(letter|digit)*10=24dightdight*11=25+1326一14(27*15)28/16#0詳細(xì)設(shè)計:1.1 界面導(dǎo)入設(shè)計case 32: 一共三個選項:case 33: choice1cifafenxicase 34: choice2yufafenxicase 35: choice3zhongjiandaimacase 33: 界面演示圖一C:DOCniEll甘賓畫exB惻M.w打腳耳腳

4、即邪兩抑酬物耳腳耳腳曲抑陰耳蛇曲腳耳腳具聊聊chnice1一一(;if&fenxichoice2af&nxichnicc32hongjiiandaimacmrLPT3PUSE-SH-W3m-XJH.UIdQxu景2=工w后與基VUIBPU.s-sunqz:&ot茗箏II總0-t亨揖它二mttlssggtls蕓=sss=莖=s=ssgg莖S莖裝HSSS5莖=題.“-專3工與總As1緊喜aXSH一蕓三wbsI孝-llvrrIBMpile-與二6:nd-5SJHEdIXJ.Ed三i-gl卓gssinsnisssssBsiissslssssaqvp-s-allnlze甥2015:完=Z-3-OPJpf

5、pIsio_o4.2詞法分析程序(1)流程圖設(shè)計(2)具體功能的具體設(shè)計1、cifafenxi()首先設(shè)置progn來接收輸入的語句,以#來結(jié)束;調(diào)用掃描子程序scaner1(,每一次得到一個類型碼;用switch判別相應(yīng)輸出;直到syn1=0為止。2、掃描子程序scaner1()掃描輸入的語句首先設(shè)置3個變量:token1用來存放構(gòu)成單詞符號的字符串;sum1用來存放整型單詞;syn1用來存放單詞符號的類型碼。有關(guān)scaner1()中關(guān)鍵點(diǎn)解析:while(ch=)|(ch=n)ch=progp+;忽略空格if(ch=a)|(ch=A)while(ch=a)|(ch=A)|(ch=0)&(c

6、h=9)tokenm+=ch;ch=progp+;判別標(biāo)識符for(n=0;n=0)&(ch=0)&(ch=9)sum=sum*10+ch-0;ch=progp+;)(3)詞法分析的運(yùn)行結(jié)果輸入beginx:=1;y:=1+2;end#輸出t:C:D0CU1E11esttry,exe1-一11-Ueleone!t(cifafcnxiJ_-_pleaseinputa?tring:?nbeginK:=l;驢I*2;endtbeyin1)sc10)(:17J=曲)(111);26)(yIfl)(:17)=10)111J(*135211);26)(end10J(ta)語法分析程序(1)具體功能的具體設(shè)

7、計.yufafenxi()分析程序給出算術(shù)表達(dá)式文法,進(jìn)行適當(dāng)?shù)奈姆ㄗ儞Q輸入一一表達(dá)式;輸出一一表達(dá)式語法是否正確2.子程序的功能描述(3)語法分析的運(yùn)行結(jié)果分析成功圖-C=DacmenftsandSettingslcnin)I桌面,衽建文件末Ii,Debug*lain.bkcchoice1cifafenxichoice2iiufaFenxichoice3r=zhongjlain山鼻ina軸期*醐版KimitiK郵it穌*翻軸抑帥抑imitititit*。穌*翻軸抑林yeleone*1*TEJ-FT*F-iEIET-FT,F-iT-*FTJF-i一產(chǎn)分析成功JJ分析失敗圖:,C:PocuBen

8、tsand0式1111工式111皿。桌面1新建文件夾:11)m11八1-.石.choice1cifafenxichoice2yufafenxichoice3-ahonjjiandaina請輸入您要分析的-yeleone?!字符串以1結(jié)頁人為空字符;t*#E-TEJT-FTJrj-rrj-x分析失敗二中間代碼生成程序(1)總體描述采用遞歸下降(自上而下)的語法制導(dǎo)翻譯法。在前兩次試驗的基礎(chǔ)上改進(jìn)。詞法分析程序語法分析程序語義分析程序編譯器。不斷完善,不斷改進(jìn)。漸變的過程。單詞符號及種別表單詞符號種別編碼單詞值main1int2float3double4char5if6else7do8while9

9、l(l|d)*10內(nèi)部字符串(+|-|)d*(.dd*|)(e(+|-|)dd*|)20二進(jìn)制數(shù)值表示=21+22-23*24/25(26)272829,30;3132=3334=35=36!=37(2)程序結(jié)構(gòu)描述(3)程序的功能描述從文件中讀入表達(dá)式,輸出其四元式的結(jié)果序列遞歸下降示意圖調(diào)用scanner調(diào)用scanner調(diào)用scanner1調(diào)用語句塊分析函數(shù)出錯處理(4)詳細(xì)功能描述voidscanner。;/陽描voidlrparser();voidstaBlock(int*nChain);/語句塊voidstaString(int*nChain);/語句用voidsta(int*nC

10、hain);/語句voidfuzhi();/賦值語句voidtiaojian(int*nChain);/條件語句voidxunhuan();/循環(huán)語句char*E();/Expresiion表達(dá)式char*T();/Term項char*F();/Factor因子char*newTemp();/自動生成臨時變量voidbackpatch(intp,intt);回填intmerge(intp1,intp2);/合并p1和p2voidemit(char*res,char*num1,char*op,char*num2);生成四元式voidemit(char*res,char*num1,char*op,

11、char*num2)-該函數(shù)的功能是生成一個三地址語句送到四式表中char*newTemp()一該函數(shù)的功能是會動一個新的臨時變量,臨時變量名產(chǎn)生的順序是T1,T2,T3.intmerge(intp1,intp2)一該函數(shù)的功能是將以P1,P2為鏈?zhǔn)椎膬蓷l鏈合并成一條鏈,返回時的函數(shù)值作為合并后的鏈?zhǔn)?。voidbackpatch(intp,intt)該函數(shù)的功能是把P所鏈接的每個四元式的第四區(qū)段(result段)都回填tovoidfuzhi()該函數(shù)的功能是對賦值語句進(jìn)行分析。voidtiaojian(int*nChain)該函數(shù)的功能是對條件語句進(jìn)行分析。voidxunhuan()該函數(shù)的功

12、能是對循環(huán)語句進(jìn)行分析。(4)結(jié)果演不圖一簡單語句生成四元式imdin爵賽1皂口口賓商新建文件夾,1息1RX.MflflflssnnnKiinflflussttnnttiifflflflflsssnnttHittflsssttsnnttiiaflflttSttsnnBiiflflflSttsclmicc1-cifafcnxicIhDice瞿enac::choice3-rzJion9JiandAnaJPlaa.seinwtsourcestrinff:tx=ly-y*3;1C1x323CHT1y)圖二if語句的四元式生成-|oXinputyourstwteMtping士一nain3Cr+M除加號3

13、ifgoto3T2;zl圖三循環(huán)語句四元式生成Pleaseyou產(chǎn)rwiiinOK-l;=-d;4sourcie-strin-g!J1234&=di工5tifgoto16(5)匯編生成if(strcmp(fourComi.opera,=)=0)(printf(MoveAX,%1sn,fourComi.arg1);printf(Move%5s,Axn,fourComi.result);if(strcmp(fourComi.opera,+)=0)(printf(MovAX,%1sn,fourComi.arg1);printf(ADDAx,%1sn,fourComi.arg2);printf(Mov

14、%1s,Axn,fourComi.result);if(strcmp(fourComi.opera,-)=0)(printf(MovAX,%1sn,fourComi.arg1);printf(SUBAx,%1sn,fourComi.arg2);printf(Mov%1s,Axn,fourComi.result);if(strcmp(fourComi.opera,*)=0)(printf(MovAL,%1sn,fourComi.arg1);printf(MUL%1sn,fourComi.arg2);printf(Mov%1s,Axn,fourComi.result);if(strcmp(four

15、Comi.opera,/)=0)(printf(MovAX,%1sn,fourComi.arg1);printf(DIv%1sn,fourComi.arg2);printf(Mov%1s,ALn,fourComi.result);if(strcmp(fourComi.opera,goto)=0)(printf(jmpL%1sn,i);結(jié)果演示五、課程設(shè)計的體會與總結(jié)經(jīng)過一個星期的編譯原理課程設(shè)計,本人在陳宏建老師的指導(dǎo)下,順利完成該課程設(shè)計。通過該課程設(shè)計,收獲頗多。詞法分析的基本任務(wù)是從字符串表示的源程序中識別出具有獨(dú)立意義的單詞符號,其基本思想是根據(jù)掃描到單詞符號的第一個字符的種類,拼出相

16、應(yīng)的單詞符號。通過本試驗的完成,更加加深了對詞法分析原理的理解。通過本次試驗,了解了語法分析的運(yùn)行過程,主程序大致流程為:“置初值”調(diào)用scaner函數(shù)讀下一個單詞符號調(diào)用IrParse結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin”不是則“出錯處理”,若是則“調(diào)用scaner函數(shù)”調(diào)用語句串分析函數(shù)“判斷是否為end”不是則“出錯處理”,若是則調(diào)用scaner函數(shù)“判斷syn=0&kk=0是否成立”成立則說明分析成功打印出來。不成立則“出錯處理”。一、對實驗原理有更深的理解通過該課程設(shè)計,掌握了什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務(wù),熟悉了編譯程序總流程框圖,了

17、解了編譯程序的生成過程、構(gòu)造工具及其相關(guān)的技術(shù)對課本上的知識有了更深的理解,課本上的知識師機(jī)械的,表面的。通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機(jī)上實現(xiàn),把原來以為很深奧的書本知識變的更為簡單,對實驗原理有更深的理解。二、對該理論在實踐中的應(yīng)用有深刻的理解通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機(jī)上實現(xiàn),知道和理解了該理論在計算機(jī)中是怎樣執(zhí)行的,對該理論在實踐中的應(yīng)用有深刻的理解。三、激發(fā)了學(xué)習(xí)的積極性通過該課程設(shè)計,全面系統(tǒng)的理解了編譯原理程序構(gòu)造的一般原理和基本實現(xiàn)方法。把死板的課本知識變得生動有趣,激發(fā)了學(xué)習(xí)的積極性。把學(xué)過的計算機(jī)編譯原理的知識強(qiáng)化,能夠把課堂上學(xué)的知識通過自己設(shè)計的

18、程序表示出來,加深了對理論知識的理解。以前對與計算機(jī)操在這次課程設(shè)計中,我就是按照實驗指導(dǎo)的思想來完成。加深了理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實現(xiàn),培養(yǎng)實踐動手能力和程序開發(fā)能力的目的。附錄程序清單#include#include#include#includeusingnamespacestd;#defineMAX100charinputstream50;存儲輸入句子inttemp1=0;數(shù)組下標(biāo)intright1;判斷輸出信息intm2=0,sum2=0;/sum用于計算運(yùn)算符的個數(shù)/m用于標(biāo)記輸入表達(dá)式中字符的個數(shù)charJG=A;charstrMAX;/用于存輸入表達(dá)式inttokene=

19、0;/左括號的標(biāo)志charprog180,token18,ch1;intsyn1,p1,m1,n1,sum1;char*rwtab16=begin,if,then,while,do,end;intr1;charprog80;存放所有輸入字符chartoken8;存放詞組charch;帛個字符intsyn,p,m,n,i;syn:種別編碼doublesum;intcount;intisSignal;是否帶正負(fù)號(0不帶,1負(fù)號,2正號)intisError;intisDecimal;/是否是小數(shù)doubledecimal;小數(shù)intisExp;是否是指數(shù)intindex;指數(shù)哥intisNega

20、tive;/是否帶負(fù)號doubletemp;inttemp2;intrepeat;/是否連續(xù)出現(xiàn)+,-intnextq;intkk;臨時變量的標(biāo)號intntc,nfc,nnc,nnb,nna;char*rwtab9=main,int,float,double,char,if,else,do,while;structcharresult10;/字符串(字符數(shù)組)chararg110;charopera10;chararg210;fourCom20;結(jié)構(gòu)體數(shù)組cifafenxi();yufafenxi();zhongjiandaima();scaner1();voide();voide1();vo

21、idt();voidt1();voidf();voidlrparser();voidstaBlock(int*nChain);/語句塊voidstaString(int*nChain);/語句串voidsta(int*nChain);語句voidfuzhi();/賦值語句voidtiaojian(int*nChain);/條件語句voidxunhuan();循環(huán)語句char*E();/Expresiion表達(dá)式char*T();/Term項char*F();/Factor因子char*newTemp();/自動生成臨時變量voidbackpatch(intp,intt);/回填intmerge

22、(intp1,intp2);/合并p1和p2voidemit(char*res,char*num1,char*op,char*num2);/生成四元式voidscanner();掃描voidlrparser()intnChain;nfc=ntc=1;nextq=1;if(syn=1)/mainscanner();if(syn=26)/(scanner();if(syn=27)/)scanner();staBlock(&nChain);elseprintf(缺少右括號n);elseprintf(缺少左括號n);elseprintf(缺少mainn);語句塊:=語句串voidstaBlock(in

23、t*nChain)/語句塊if(syn=28)/scanner();staString(nChain);backpatch(*nChain,nextq);if(syn=29)/scanner();讀下一個elseprintf(缺少號n);elseprintf(缺少號n);/語句串:=語句;語句;voidstaString(int*nChain)/語高串sta(nChain);backpatch(*nChain,nextq);while(syn=31)/;scanner();sta(nChain);/backpatch(*nChain,nextq-1);)voidsta(int*nChain)/

24、語句(if(syn=10)(fuzhi();/*nChain=0;)elseif(syn=6)/if(tiaojian(nChain);)elseif(syn=8)/doxunhuan();)條件語句-if()-if(syn=6)/if(scanner();strcpy(num1,E();if(syn=26)/(scanner();strcpy(num1,E();if(syn=32)(switch(syn)(strcpy(op,);break;strcpy(op,=);break;strcpy(op,);break;strcpy(op,=);break;strcpy(op,=);break;s

25、trcpy(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=nextq;/if中表達(dá)式為假emit(0,goto);/第一個0已回填nextqbackpatch(ntc,nextq);/ntc鏈接的所有四元式都回填)if(syn=27)/)scanner();staBlock(&nChainTemp);語句塊*nChain=merge(nCh

26、ainTemp,nfc);)循環(huán)語句:=do語句塊while條件voidxunhuan()charres10,num110,num210,op10;intnChainTemp;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)case32:strcpy(o

27、p,);break;strcpy(op,=);break;strcpy(op,);break;strcpy(op,=);break;strcpy(op,=);break;strcpy(op,!=);break;default:printf(error);scanner();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);nnb=nextq;emit(0,if,num1,goto);backpatch(nnb,nnc);nna=nextq;emit(0,goto);backpatch(nna,nextq);if(syn=27)/)scanner

28、();voidfuzhi()賦值語句只有1個操作數(shù)charres10,num10;/num操作數(shù)if(syn=10)/字符串strcpy(res,token);結(jié)果scanner();if(syn=21)/=scanner();strcpy(num,E();emit(res,num,=,);elseprintf(缺少=號n);char*E()/Expression表達(dá)式char*res,*num1,*op,*num2;res=(char*)malloc(10);num1=(char*)malloc(10);op=(char*)malloc(10);num2=(char*)malloc(10);

29、strcpy(num1,T();while(syn=22)|(syn=23)/+-(if(syn=22)/+strcpy(op,+);elsestrcpy(op,-);scanner();strcpy(num2,T();strcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);returnnum1;char*T()/Term項(char*res,*num1,*op,*num2;res=(char*)malloc(10);num1=(char*)malloc(10);op=(char*)malloc(10);num2=(char*)

30、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);returnnum1;char*F()/Factor因子(char*res;res=(char*)malloc(10);if(syn=10)/字符串(strcpy(res,token);scanner();elseif(syn=20)/二進(jìn)制數(shù)(itoa(int)sum,res,10);/整數(shù)轉(zhuǎn)換為字符串scanner();)elseif(syn=26)/(scanner();res=E();if(syn=27)/)(scanner();)elseisError=1;)elseisError=1;returnres;)char*newTemp()(char*p;charvarTemp10;p=(char*)malloc(10);kk+;itoa(kk,varTemp,10);strcpy(p+1,v

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論