合肥工業(yè)大學編譯原理實驗報告(完整代碼版)_第1頁
合肥工業(yè)大學編譯原理實驗報告(完整代碼版)_第2頁
合肥工業(yè)大學編譯原理實驗報告(完整代碼版)_第3頁
合肥工業(yè)大學編譯原理實驗報告(完整代碼版)_第4頁
合肥工業(yè)大學編譯原理實驗報告(完整代碼版)_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、名的工至大于計算機與信息學院編譯原理實驗報告專業(yè)班級信息安全13-1班學生姓名及學號馬駿2013211869課程教學班號任課教師玄匚實驗指導教師玄匚實驗地點實驗樓機房20152016學年第二學期Word文檔實驗1詞法分析設計、實驗目的通過本實驗的編程實踐,使學生了解詞法分析的任務,掌握詞法分析程序設計的原理和構造方法,使學生對編譯的基本概念、原理和方法有完整的和清楚的理解,并能正確地、熟練地運用、實驗要求1、編程時注意編程風格:空行的使用、注釋的使用、縮進的使用等。2、將標識符填寫的相應符號表須提供給編譯程序的以后各階段使用。3、根據(jù)測試數(shù)據(jù)進行測試。測試實例應包括以下三個部分:全部合法的輸入

2、。各種組合的非法輸入。由記號組成的句子。4、詞法分析程序設計要求輸出形式:例:輸入VC+語言的實例程序:Ifi=0thenn+;a<=3b%);輸出形式為:單詞二元序列類型位置(行,歹U)(單詞種別,單詞屬性)for(1,for)關鍵字(1,1)i(6,i)標識符(1,2)=(4,=)關系運算符(1,3)120(5,0)常數(shù)(1,4)then(1,then)關鍵字(1,5)n(6,n)標識符(1,6)+ErrorError(1,7);(2,;)分界符(1,8)a(6,a)標識符(2,1)<=(4,<=)關系運算符(2,2)3bErrorError(2,4)%ErrorErro

3、r(2,4)(2,)分界符(2,5);(2,;)分界符(2,6)實驗容用VC+/VB/JAVA語言實現(xiàn)對C語言子集的源程序進行詞法分析。通過輸入源程序從左到右對字符串進行掃描和分解,依次輸出各個單詞的部編碼及單詞符號自身值;若遇到錯誤則顯示“Error”,然后跳過錯誤部分繼續(xù)顯示;同時進行標識符登記符號表的管理。以下是實現(xiàn)詞法分析設計的主要工作:(1)從源程序文件中讀入字符。(2)統(tǒng)計行數(shù)和列數(shù)用于錯誤單詞的定位。(3)刪除空格類字符,包括回車、制表符空格。(4)按拼寫單詞,并用(碼,屬性)二元式表示。(性性值一一token的機表示)(5)如果發(fā)現(xiàn)錯誤則報告出錯7(6)根據(jù)需要是否填寫標識符表

4、供以后各階段使用。四、實驗步驟1、根據(jù)流程圖編寫出各個模塊的源程序代碼上機調試。2、編制好源程序后,設計若干用例對系統(tǒng)進行全面的上機測試,并通過所設計的詞法分析程序;直至能夠得到完全滿意的結果。3、書寫實驗報告;實驗報告正文的容:功能描述:該程序具有什么功能?程序結構描述:函數(shù)調用格式、參數(shù)含義、返回值描述、函數(shù)功能;函數(shù)之間的調用關系圖。詳細的算法描述(程序總體執(zhí)行流程圖)。給出軟件的測試方法和測試結果。實驗總結(設計的特點、不足、收獲與體會)。五、實驗截圖先創(chuàng)建salaryfile.txt文件輸入Word 文檔Ifi=0thenn+;a<=3b%);六、核心代碼#include<

5、;iostream>#include<string>#include<fstream>#include<sstream>usingnamespacestd;constchar*salaryfile="salaryfile.txt"constintmax=40;stringidmax="do","end","for","if","printf","scanf","then","while

6、"/關鍵字stringsmax=",","","(",")","",T,"+","-","*","/","<","<=","=",">",">=","<>"/界符表算數(shù)運算符表關系運算符表stringkmax;/標識符stringcimax;/常數(shù)int

7、fjfpoint=5;/分界符表尾intmathpoint=9;/算數(shù)運算符表尾intcipointer=0;/常數(shù)表尾intidpointer=0;/關鍵字表尾intkpointer=0;/標識符表尾intfjf;/0不是分界符1是introwy=1;/識別輸入行位置introwx=1;/識別輸入列位置intoutkey=0;/打印控制0為數(shù)字后有字母其他可以voidsearcht(inti,stringm)/根據(jù)已識別的首字母識別字符串/cout<<"entersearcht!"<<endl;intx;if(i=0)/首字符是字母識別關鍵字/co

8、ut<<"aword!"<<endl;for(x=0;x<max;x+)Word 文檔if(idx=m)cout<<"(1,"<<idx<<")"<<關 鍵 字Word文檔("<<rowy<<","<<rowx<<")"<<endl;break;if(x=max)/不是關鍵字再識別標識符(for(x=0;x<max;x+)(if(kx=m)(c

9、out<<"(6,"<<m<<")"<<"標識符("<<rowy<<","<<rowx<<")"<<endl;break;if(x=max)/標識符表沒有時插入標識符(cout<<"(6,"<<m<<")"<<"標識符("<<rowy<<",&quo

10、t;<<rowx<<")"<<endl;kkpointer=m;kpointer+;)if(i=1)/識別常數(shù)(/cout«"anumber!"«endl;for(x=0;x<max;x+)(if(cix=m)(cout«"(5,"«x«")"«endl;break;)if(x=max)cout«"(5,"«m«")常數(shù)("<<row

11、y<<","<<rowx<<")"<<endl;cicipointer=m;cipointer+;)關系運算符if(i=2)/識別分界符算數(shù)運算符(/cout<<"asignal!”<<endl;for(x=0;x<max;x+)(if(sx=m)break;)/x-;if(x<6)(fjf=1;)if(x>5&&x<10)(if(outkey=1)(cout<<"(3,"<<sx<&

12、lt;")算數(shù)運算符("<<rowy<<","<<rowx<<")"<<endl;outkey=0;)fjf=0;)if(x>9&&x<max-1)(if(outkey=1)(cout<<"(4,"<<sx<<")關系運算符("<<rowy<<","<<rowx<<")"<<

13、endl;outkey=0;)fjf=0;)if(x=max)(if(outkey=1)(cout<<"ErrorError("<<rowy<<","<<rowx<<")"<<endl;outkey=0;fjf=0;voidwordlook(chart,stringsn)/識別首字符,分類識別字符串if(t>=48&&t<=57)searcht(1,sn);elseif(t>64&&t<91)|(t>9

14、6&&t<123)searcht(0,sn);elsesearcht(2,sn);voidsplit(strings)/分割字符串/cout<<s<<endl;stringnowmax;stringsn;intnowpointer=0;inti=0;intx;intsign=2;/非法數(shù)字標志intdiannumber=0;/數(shù)中點的個數(shù)for(x=0;x<s.length();x+)if(sx>64&&sx<91)|(sx>96&&sx<123)|(sx>=48&&

15、;sx<=57)|(x>0&&sx=46&&sign=1)判斷數(shù)字后跟字母還是字母后有數(shù)字if(i=0)if(sx>=48&&sx<=57)sign=1;elsesign=2;else(if(sign=1)(if(sx>=48&&sx<=57|sx=46)(if(sx=46)(if(diannumber=0)diannumber+;elsesign=0;elsesign=0;i+;if(x=(s.length()-1)(sn=s.substr(x-i+1,i);/cout«sn

16、1;"i="«i«endl;cout«sn«"if(sign=O)/數(shù)字后有字母的情況Word文檔cout«"ErrorError("«rowy«","«rowx«")"<<endl;else字母開頭的字符串/cout«" true"«endl;wordlook(sn0,sn);rowx+;elseif(x>0&&(sx-1>64&

17、;&s(x-1<91)|(sx-1>96&&s(x-1<123)|(sx-1>=48&&s(x-1<=57)/遇到分界符運算符如果前面是數(shù)字或字母(sn=s.substr(x-i,i);if(i>0)(/cout«sn«"i="«i«endl;cout«sn«"if(sign=O)Errorcout«"Error("«rowy«","«rowx

18、1;")"<<endl;else(/cout«"true"«endl;wordlook(sn0,sn);rowx+;)i=0;)stringll=s.substr(x,1);/判斷是運算符還是分界符wordlook(sx,ll);(i+;if(sx+1>64&&sx+1<91)|(sx+1>96&&sx+1<123)|(sx+1>=48&&sx+1<=57)/如果后面是數(shù)字或字母(sn=s.substr(x-i+1,i);/cout<

19、<sn<<"運算符i="<<i<<endl;cout<<sn<<""outkey=1;wordlook(sn0,sn);rowx+;i=0;if(fjf=1)(if(sx-1>64&&sx-1<91)|(sx-1>96&&sx-1<123)|(sx-1>=48&&sx-1<=57)/如果前面是數(shù)字或字母)elseif(i>0)(sn=s.substr(x-i,i);/cout<<sn<

20、;<"運算符i="<<i<<endl;cout<<sn<<""outkey=1;wordlook(sn0,sn);rowx+;i=0;)cout<<sx<<"(2,"<<sx<<")分界符("<<rowy<<","<<rowx<<")"<<endl;rowx+;/*if(ll="")(rowy+;

21、rowx=1;)*/);intmain()intx;stringinstring;/讀入一行stringsn;/*getline(cin,sn);/string帶空格輸入cout<<sn<<endl;chart=sn0;if(t>=48&&t<=57)searcht(1,sn);elseif(t>64&&t<91)|(t>96&&t<123)searcht(0,sn);elsesearcht(2,sn);*/ifstreaminputfile;/infilestreaminputfile

22、.open(salaryfile);/inputfile>>noskipws;if(!inputfile)cout<<"nofile"<<endl;stringpp;while(!inputfile.eof()getline(inputfile,pp);istringstreamistr(pp);stringppword;while(istr>>ppword)/按照空格分割字符串split(ppword);/*intbegin=0;/去掉字符串的所有空格begin=pp.find("",begin);/查找

23、空格在str中第一次出現(xiàn)的位置while(begin!=-1)/表示字符串中存在空格pp.replace(begin,1,"");/用空串替換str中從begin開始的1個字符begin=pp.find("",begin);/查找空格在替換后的str中第一次出現(xiàn)的位置*/cout<<"good"<<pp<<endl;/rowx+;rowy+;/換行rowx=1;return0;七、實驗總結通過本次試驗使我不僅對詞法分析器有了更深的了解,而且提高了編程能力,希望在以后的學習中可以解決詞法分析更多的問題

24、實驗2LL(1)分析法一、實驗目的通過完成預測分析法的語法分析程序,了解預測分析法和遞歸子程序法的區(qū)別和聯(lián)系使學生了解語法分析的功能,掌握語法分析程序設計的原理和構造方Word 文檔法,訓練學生掌握開發(fā)應用程序的基本方法。有利于提高學生的專業(yè)素質,為培養(yǎng)適應社會多方面需要的能力。、實驗要求1、編程時注意編程風格:空行的使用、注釋的使用、縮進的使用等。2、如果遇到錯誤的表達式,應輸出錯誤提示信息。3、對下列文法,用LL(1)分析法對任意輸入的符號用進行分析:(1) E->TG(2) G->+TG|TG(3) G->£(4) T->FS(5) S->*FS|

25、/FS(6) S->£F->(E)(8)F->i三、實驗容根據(jù)某一文法編制調試LL(1)分析程序,以便對任意輸入的符號用進行分析。構造預測分析表,并利用分析表和一個棧來實現(xiàn)對上述程序設計語言的分析程序。分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂容、向前看符號以及LL(1)分析表,對輸入符號用自上而下的分析過程。四、實驗步驟1、根據(jù)流程圖編寫出各個模塊的源程序代碼上機調試。2、編制好源程序后,設計若干用例對系統(tǒng)進行全面的上機測試,并通過所設計的LL(1講析程序;直至能夠得到完全滿意的結果。3、書寫實驗報告;實驗報告正文的容:寫出LL(1)分析法的思想及寫出符合

26、LL(1)分析法的文法。程序結構描述:函數(shù)調用格式、參數(shù)含義、返回值描述、函數(shù)功能;函數(shù)之間的調用關系圖。詳細的算法描述(程序執(zhí)行流程圖)。給出軟件的測試方法和測試結果。實驗總結(設計的特點、不足、收獲與體會)。五、實驗截圖六、核心代碼#include<iostream>#include<string>usingnamespacestd;stringpp;/輸出字符串stringhh="rn"/換行constintmax=50;intendfumax;/終止符序號表intendfupointer=8;charendfurealmax='+&#

27、39;,'-','*','/','(','i',')','#'intunendfumax;intunendfupointer=5;charunendfurealmax=E,'G',T,S,'F'Word文檔stringmakemathmax="E->TG","G->+TG","G->-TG","G->$","T->FS",&

28、quot;S->*FS","S->/FS","S->$","F->(E)","F->i"/0E->TG,1G->+TG,2G->-TG,3G->$,4T->FS,5S->*FS,6S->/FS,7S->$,8F->(E),9F->i/$代表空串stringbehaviormax="初始化","POP"intsmarttablemaxmax;/分析表intcheckendfu(c

29、harfu)/查終結符序號intx;for(x=0;x<endfupointer;x+)if(endfurealx=fu)break;if(x<endfupointer)returnx;elsereturn-1;intcheckunendfu(charfu)/查非終結符序號intx;for(x=0;x<unendfupointer;x+)if(unendfurealx=fu)break;if(x<unendfupointer)returnx;elsereturn-1;stringcheckmakemath(intx)/查產生式表returnmakemathx;intch

30、ecksmarttable(intx,inty)/查分析表returnsmarttablexy;classsmartboxpublic:smartbox()box0='#'box1='E'boxpointer=1;voidpush(charfu)boxpointer+;boxboxpointer=fu;charpop()chara=boxboxpointer;if(a!='#')/cout<<"pop:"<<boxpointer<<""<<a<<e

31、ndl;Word 文檔/stringstreamoss;/*pp=pp+"pop:"charbuffermax;sprintf(buffer,"%d",boxpointer);strings=buffer;pp=pp+""pp=pp+s;pp=pp+hh;*/boxpointer-;returna;voidcheck()if(checkendfu(boxboxpointer)!=-1)chara;/cout<<boxboxpointer<<checkendfu(boxboxpointer)<</ch

32、arbuffermax;/sprintf(buffer/pp=pp+boxboxpointer;/pp=pp+checkendfu(boxboxpointer);/pp=pp+""a=pop();/cout<<"out"<<a<<endl;charboxmax;intboxpointer;intmain()/TODO:Addextravalidationhere動作 "+hh;/pp=pp+"步驟分析棧剩余輸入串所用產生式/*rnsdfsds"strings1="sdsfsstr

33、ings3="aaaaaaaaaaaaa"s3=s3+s1;CStrings2(s3.c_str();/CStrings2=CString(s1);SetDlgItemText(IDC_EDIT2,s2);用SetDlgItemText(文本框ID,字符串),將文本框的容設置為字符串的容.SetDlgItemText(IDC_EDIT2,s2);*/MessageBox(str);stringstr;cin>>str;intx,y;for(x=0;x<max;x+)/初始化分析表99為錯誤代號for(y=0;y<max;y+)smarttablexy

34、=99;smarttable04=0;smarttable05=0;smarttable10=1;smarttable11=2;smarttable16=3;smarttable17=3;smarttable24=4;smarttable25=4;smarttable30=7;smarttable31=7;smarttable32=5;smarttable33=5;smarttable36=7;smarttable37=7;smarttable44=8;smarttable45=9;smartboxmark;charfu;charenterfu;intendfunumber;intunendf

35、unumber;stringreadyin;stringenter;/cin>>enter;/enter="i+i*i#"enter=str;/enter="(i)#"intcount=0;/步驟charbuffer1max;sprintf(buffer1,"%d",count);strings1=buffer1;pp=pp+s1+""/分析棧for(intqq1=0;qq1<=mark.boxpointer;qq1+)pp=pp+mark.boxqq1;for(qq1=0;qq1<10-m

36、ark.boxpointer;qq1+)pp=pp+/剩余輸入棧stringjiequ1=enter.substr(0,enter.length();pp=pp+jiequ1;for(intt1=0;t1<20;t1+)pp=pp+""pp=pp+"初始化"+hh;for(x=0;x<enter.length();)/步驟count+;charbuffermax;sprintf(buffer,"%d",count);strings=buffer;pp=pp+s+""/分析棧for(intqq=0;qq&

37、lt;=mark.boxpointer;qq+)pp=pp+mark.boxqq;for(qq=0;qq<10-mark.boxpointer;qq+)pp=pp+""/剩余輸入棧stringjiequ=enter.substr(x,enter.length()-x);pp=pp+jiequ;for(intt=0;t<x+10;t+)pp=pp+""enterfu=enterx;/cout<<"enterfu:"<<enterfu<<endl;mark.check();fu=mark.p

38、op();/cout<<"fu:"<<fu<<endl;if(fu='#')/&&enterfu='#')/cout<<"sucessed!over!"<<endl;pp=pp+"sucessed!over!"+hh;break;unendfunumber=checkunendfu(fu);endfunumber=checkendfu(enterfu);/cout<<unendfunumber<<endl

39、;/cout<<endfunumber<<endl;if(smarttableunendfunumberendfunumber=99)pp=pp+"error!"break;readyin=makemathsmarttableunendfunumberendfunumber;pp=pp+readyin;for(intddd=0;ddd<14-readyin.length();ddd+)pp=pp+""pp=pp+"POP,PUSH("for(y=readyin.length()-1;y>2;y-)p

40、p=pp+readyiny;pp=pp+")"+hh;/cout<<"readyin:"<<readyin<<endl;intfirsttime=0;for(y=readyin.length()-1;y>2;y-)/cout<<readyiny<<""if(readyiny!='$')mark.push(readyiny);if(firsttime=0)if(checkendfu(readyiny)!=-1)/cout<<"nowx

41、:"<<x<<""/步驟count+;charbuffermax;sprintf(buffer,"%d",count);strings=buffer;pp=pp+s+""/分析棧for(intqq=0;qq<=mark.boxpointer;qq+)pp=pp+mark.boxqq;for(qq=0;qq<10-mark.boxpointer;qq+)pp=pp+"")/剩余輸入棧stringjiequ=enter.substr(x,enter.length()-x);

42、pp=pp+jiequ;for(intt=0;t<x+10;t+)(pp=pp+"")pp=pp+"GETNEXT(I)"+hh;x+;/cout<<"nextx:"<<x<<""<<endl;firsttime=1;)mark.check();/cout<<endl;/pp=pp+hh;cout<<pp;return0;/CDialog:OnOK();七、實驗總結通過本次試驗使我不僅對11(1)分析法有了更深的了解,而且提高了編程能力,

43、希望在以后的學習中可以解決自動構造follow集的問題。實驗3LR(1)分析法一、實驗目的構造LR(1價析程序,利用它進行語法分析,判斷給出的符號用是否為該文法識別的句子,了解LR(K)分析方法是嚴格的從左向右掃描,和自底向上的語法分析方法。二、實驗要求1、編程時注意編程風格:空行的使用、注釋的使用、縮進的使用等。2、如果遇到錯誤的表達式,應輸出錯誤提示信息。3、程序輸入/輸出實例:輸入一以#結束的符號串(包括+*()i#):在此位置輸入符號串輸出過程如下:步驟狀態(tài)棧符號棧剩余輸入串動作10#i+i*i#移進i+i*i的LR分析過程步驟狀態(tài)棧符號棧輸入串動作說明1 0#i+i*i#ACTION

44、0,i=S5,狀態(tài)5入棧2 05#i+i*i#r6:FT歸約,GOTO(0,F)=3入棧3 03#F+i*i#r4:TfF歸約,GOTO(0,T)=3入棧4 02#T+i*i#E-T歸約,GOTO(0,E)=1入棧5 01#E+i*i#ACTION1,+=S6,狀態(tài)6入棧6 016#E+i*i#ACTION6,i=S5,狀態(tài)5入棧7 0165#E+i*i#r6:Ffi歸約,GOTO(6,F)=3入棧8 0163#E+F*i#r4:TfF歸約,GOTO(6,T)=9入棧9 0169#E+T*i#ACTION9,*=S7,狀態(tài)7入棧10 01697#E+T*i#ACTION7,i=S5,狀態(tài)5入棧

45、11 016975#E+T*i#r6:F-i歸約,GOTO(7,F)=10入棧12 0169710#E+T*F#r3:T-T*F歸約,GOTO(6,T)=9入棧13 0169#E+T#U:E-E+T,GOTO(0,E)=1入棧14 01#E#Acc:分析成功三、實驗容對下列文法,用LR(1)分析法對任意輸入的符號串進行分析:Word 文檔(1) E->E+T(2) E->T(3) T->T*F(4) T->F(5) F->(E)(6) F->i四、實驗步驟1、根據(jù)流程圖編寫出各個模塊的源程序代碼上機調試。2、編制好源程序后,設計若干用例對系統(tǒng)進行全面的上機測

46、試,并通過所設計的LR(1滸法分析程序;直至能夠得到完全滿意的結果。3、書寫實驗報告;實驗報告正文的容:描述LR(1語法分析程序的設計思想。程序結構描述:函數(shù)調用格式、參數(shù)含義、返回值描述、函數(shù)功能;函數(shù)之間的調用關系圖。詳細的算法描述(程序執(zhí)行流程圖)。給出軟件的測試方法和測試結果。五、實驗截圖六、核心代碼#include<iostream>#include<string>usingnamespacestd;intcount=1;stringpp;/輸出字符串stringhh="rn"/換行constintmax=100;charendfureal

47、max='i','+','*','(',')','#',E,T,'F'intendfupointer=8;Word文檔stringcreatwordmax="E->E+T","E->T","T->T*F","T->F","F->(E)","F->i"/(0)E->E+T(1)E->T(2)T->T*F(3)T->F(4)F->(E)(5)F->i/注意rj時j應對應數(shù)組下標intcheckendfu(charfu)/查終結符序號intx;for(x=0;x<=endfupoint

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論