合肥工業(yè)大學(xué)編譯原理實(shí)驗(yàn)報(bào)告(完整代碼版)_第1頁(yè)
合肥工業(yè)大學(xué)編譯原理實(shí)驗(yàn)報(bào)告(完整代碼版)_第2頁(yè)
合肥工業(yè)大學(xué)編譯原理實(shí)驗(yàn)報(bào)告(完整代碼版)_第3頁(yè)
合肥工業(yè)大學(xué)編譯原理實(shí)驗(yàn)報(bào)告(完整代碼版)_第4頁(yè)
合肥工業(yè)大學(xué)編譯原理實(shí)驗(yàn)報(bào)告(完整代碼版)_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、計(jì)算機(jī)與信息學(xué)院編譯原理 實(shí)驗(yàn)報(bào)告專(zhuān)業(yè)班級(jí)信息安全 13-1 班Word 文檔學(xué)生姓名及學(xué)號(hào)馬駿 2013211869課程教學(xué)班號(hào) 任課教師宏芒實(shí)驗(yàn)指導(dǎo)教師宏芒實(shí)驗(yàn)地點(diǎn)實(shí)驗(yàn)樓機(jī)房20152016 學(xué)年第 二 學(xué)期實(shí)驗(yàn) 1 詞法分析設(shè)計(jì)、 實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)本實(shí)驗(yàn)的編程實(shí)踐, 使學(xué)生了解詞法分析的任務(wù), 掌握詞法分析程序設(shè) 計(jì)的原理和構(gòu)造方法,使學(xué)生對(duì)編譯的基本概念、原理和方法有完整的和 清楚的理解,并能正確地、熟練地運(yùn)用、 實(shí)驗(yàn)要求1、編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。2、將標(biāo)識(shí)符填寫(xiě)的相應(yīng)符號(hào)表須提供給編譯程序的以后各階段使用。3、根據(jù)測(cè)試數(shù)據(jù)進(jìn)行測(cè)試。測(cè)試實(shí)例應(yīng)包括以下三

2、個(gè)部分 : 全部合法的輸入。各種組合的非法輸入。由記號(hào)組成的句子。4、詞法分析程序設(shè)計(jì)要求輸出形式 :例:輸入 VC+ 語(yǔ)言的實(shí)例程序:If i=0 then n+;a= 3b %);輸出形式為:?jiǎn)卧~ 二元序列 類(lèi) 型 位置(行,列) (單詞種別,單詞屬性)for(1,for )關(guān)鍵字( 1, 1)i( 6,i )標(biāo)識(shí)符(1,2)12( 4 ,= )關(guān)系運(yùn)算符(1,3)0( 5,0 )常數(shù)(1,4)then( 1 , then)關(guān)鍵字(1,5)n(6,n )標(biāo)識(shí)符(1,6)+ErrorError(1,7)( 2, ; )分界符(1,8)a(6,a )標(biāo)識(shí)符(2,1)=(4,<= )關(guān)系運(yùn)

3、算符(2,2)3bErrorError(2,4)%ErrorError(2,4))( 2, ) )分界符(2,5)( 2, ; )分界符(2,6)三、實(shí)驗(yàn)容用 VC+/VB/JAVA 語(yǔ)言實(shí)現(xiàn)對(duì) C 語(yǔ)言子集的源程序進(jìn)行詞法分析。 通過(guò)輸入源程序從左到右對(duì)字符串進(jìn)行掃描和分解,依次輸出各個(gè)單詞的部編碼及單詞符號(hào)自身值;若遇到錯(cuò)誤則顯示“ Error”,然后跳過(guò)錯(cuò)誤部分繼續(xù)顯示 ;同時(shí)進(jìn)行標(biāo)識(shí)符登記符號(hào)表的管理。以下是實(shí)現(xiàn)詞法分析設(shè)計(jì)的主要工作: (1)從源程序文件中讀入字符。(2)統(tǒng)計(jì)行數(shù)和列數(shù)用于錯(cuò)誤單詞的定位。(3)刪除空格類(lèi)字符,包括回車(chē)、制表符空格。( 4)按拼寫(xiě)單詞,并用(碼,屬性)

4、二元式表示。 (屬性值 token 的機(jī) 表示 )( 5)如果發(fā)現(xiàn)錯(cuò)誤則報(bào)告出錯(cuò)7(6)根據(jù)需要是否填寫(xiě)標(biāo)識(shí)符表供以后各階段使用。四、實(shí)驗(yàn)步驟1、根據(jù)流程圖編寫(xiě)出各個(gè)模塊的源程序代碼上機(jī)調(diào)試。2、編制好源程序后, 設(shè)計(jì)若干用例對(duì)系統(tǒng)進(jìn)行全面的上機(jī)測(cè)試, 并通過(guò)所設(shè)計(jì) 的詞法分析程序;直至能夠得到完全滿(mǎn)意的結(jié)果。3、書(shū)寫(xiě)實(shí)驗(yàn)報(bào)告 ;實(shí)驗(yàn)報(bào)告正文的容:功能描述:該程序具有什么功能? 程序結(jié)構(gòu)描述:函數(shù)調(diào)用格式、參數(shù)含義、返回值描述、函數(shù)功能;函數(shù) 之間的調(diào)用關(guān)系圖。詳細(xì)的算法描述(程序總體執(zhí)行流程圖) 。給出軟件的測(cè)試方法和測(cè)試結(jié)果。實(shí)驗(yàn)總結(jié) (設(shè)計(jì)的特點(diǎn)、不足、收獲與體會(huì)) 。五、實(shí)驗(yàn)截圖先創(chuàng)建

5、 salaryfile.txt 文件輸入If i=0 then n+; a<= 3b %);六、核心代碼#include<iostream> #include<string> #include<fstream> #include <sstream> using namespace std;const char* salaryfile="salaryfile.txt"關(guān)鍵字const int max=40;string idmax="do","end","for"

6、,"if","printf","scanf","then","while"/表stringsmax=",","","(",")","","","+","-","*","/","<","<=","=",">&quo

7、t;,">=","<>"/界符表 算數(shù)運(yùn)算符表 關(guān)系運(yùn)算符表 string kmax;/ 標(biāo)識(shí)符string cimax;/ 常數(shù)int fjfpoint=5;/ 分界符表尾int mathpoint=9;/ 算數(shù)運(yùn)算符表尾int cipointer=0;/ 常數(shù)表尾int idpointer=0;/ 關(guān)鍵字表尾int kpointer=0;/ 標(biāo)識(shí)符表尾int fjf;/0 不是分界符 1 是int rowy=1;/ 識(shí)別輸入行位置int rowx=1;/ 識(shí)別輸入列位置int outkey=0;/ 打印控制 0 為數(shù)字后有字母 其他

8、可以void searcht(int i,string m)/ 根據(jù)已識(shí)別的首字母識(shí)別字符串 / cout<<"enter searcht!"<<endl;int x;if(i=0)/ 首字符是字母識(shí)別關(guān)鍵字/cout<<" a word!"<<endl;for(x=0;x<max;x+)if(idx=m)鍵字cout<<"(1,"<<idx<<")"<<" 關(guān) ("<<rowy&l

9、t;<","<<rowx<<")"<<endl;break;if(x=max)/ 不是關(guān)鍵字再識(shí)別標(biāo)識(shí)符for(x=0;x<max;x+)if(kx=m)識(shí)符cout<<"(6,"<<m<<") "<<" 標(biāo) ("<<rowy<<","<<rowx<<")"<<endl;break;if(x=max)/

10、 標(biāo)識(shí)符表沒(méi)有時(shí)插入標(biāo)識(shí)符識(shí)符cout<<"(6,"<<m<<") "<<" 標(biāo) ("<<rowy<<","<<rowx<<")"<<endl;kkpointer=m;kpointer+;if(i=1)/ 識(shí)別常數(shù)/ cout<<" a number!"<<endl;for(x=0;x<max;x+)if(cix=m)cout<<

11、;"(5,"<<x<<")"<<endl;break;if(x=max)cout<<"(5,"<<m<<")常數(shù)("<<rowy<<","<<rowx<<")"<<endl;cicipointer=m;cipointer+;關(guān)系運(yùn)算符if(i=2)/ 識(shí)別 分界符 算數(shù)運(yùn)算符/ cout<<" a signal!"

12、<<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<<") 算 數(shù) 運(yùn) 算 符 ("<<rowy<<","<<rowx<<")"<<endl;outkey=0;fjf=0;if(x>9&&x<max-1

13、)if(outkey=1)cout<<"(4,"<<sx<<") 關(guān) 系 運(yùn) 算 符 ("<<rowy<<","<<rowx<<")"<<endl;outkey=0;fjf=0;if(x=max)if(outkey=1)cout<<"Error Error ("<<rowy<<","<<rowx<<")"

14、;<<endl;outkey=0; fjf=0;void wordlook(char t,string sn)/ 識(shí)別首字符,分類(lèi)識(shí)別字符串 if(t>=48&&t<=57) searcht(1,sn);elseif(t>64&&t<91)|(t>96&&t<123) searcht(0,sn);else searcht(2,sn);void split(string s)/ 分割字符串/ cout<<s<<endl;string nowmax;string sn;int n

15、owpointer=0;int i=0;int x;int sign=2;/ 非法數(shù)字標(biāo)志int diannumber=0;/ 數(shù)中點(diǎn)的個(gè)數(shù)for(x=0;x<s.length();x+)if(sx>64&&sx<91)|(sx>96&&sx<123)|(sx>=48&&sx<=57)|(x>0&&sx=46&&sign=1)/ 判斷數(shù)字后跟字母還是字母后有數(shù)字if(i=0)if(sx>=48&&sx<=57)sign=1;else sig

16、n=2;elseif(sign=1)if(sx>=48&&sx<=57|sx=46)if(sx=46)if(diannumber=0)diannumber+;else sign=0;else sign=0;i+;if(x=(s.length()-1)sn=s.substr(x-i+1,i);if(i>0)/ cout<<sn<<" i="<<i<<endl;cout<<sn<<" "Errorif(sign=0)/ 數(shù)字后有字母的情況cout<

17、<" Error("<<rowy<<","<<rowx<<")"<<endl;else / 字母開(kāi)頭的字符串/ cout<<" true"<<endl;wordlook(sn0,sn);rowx+; elseif(x>0&&(sx-1>64&&sx-1<91)|(sx-1>96&&sx-1<123)|(sx-1>=48&&sx-

18、1<=57)/ 遇到分界符運(yùn)算符 如果前面是數(shù)字或字母sn=s.substr(x-i,i);if(i>0)/ cout<<sn<<" i="<<i<<endl;cout<<sn<<" "if(sign=0)Errorcout<<" Error("<<rowy<<,"<<rowx<<")"<<endl;else/ cout<<" t

19、rue"<<endl; wordlook(sn0,sn); rowx+;i=0;string ll=s.substr(x,1);/ 判斷是運(yùn)算符還是分界符wordlook(sx,ll);if(fjf=0)/ 是運(yùn)算符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<<sn<<" 運(yùn)算符 i="

20、;<<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ù)字或字母else if(i>0)sn=s.substr(x-i,i);/ cout<<sn<<" 運(yùn)算符 i="<&

21、lt;i<<endl;cout<<sn<<" "outkey=1;wordlook(sn0,sn);rowx+;i=0;cout<<sx<<" (2,"<<sx<<") 分 界 符 ("<<rowy<<","<<rowx<<")"<<endl;rowx+;/* if(ll="")rowy+;rowx=1;*/;int main()in

22、t x;string instring;/ 讀入一行string sn;/*getline(cin,sn);/ string 帶空格輸入 cout<<sn<<endl;char t=sn0;if(t>=48&&t<=57)searcht(1,sn);elseif(t>64&&t<91)|(t>96&&t<123) searcht(0,sn);else searcht(2,sn); */ifstream inputfile;/in file streaminputfile.open(sal

23、aryfile);/ inputfile>>noskipws;if(!inputfile)cout<<"no file"<<endl;string pp;while(!inputfile.eof()getline(inputfile,pp);istringstream istr(pp);string ppword;while(istr>>ppword)/ 按照空格分割字符串split(ppword);/*int begin = 0;/ 去掉字符串的所有空格begin = pp.find(" ",begin)

24、;/ 查找空格在 str 中第一次出現(xiàn)的位置while(begin != -1)/ 表示字符串中存在空格pp.replace(begin, 1, ""); / 用空串替換 str 中從 begin 開(kāi)始的 1 個(gè)字 符begin = pp.find(" ",begin); / 查找空格在替換后的 str 中第一次出現(xiàn) 的位置*/ cout<<"good "<<pp<<endl;/ rowx+;rowy+;/ 換行 rowx=1;return 0;七、實(shí)驗(yàn)總結(jié)通過(guò)本次試驗(yàn)使我不僅對(duì)詞法分析器有了更深的

25、了解,而且提高了編程能力,希望在以后的學(xué)習(xí)中可以解決詞法分析更多的問(wèn)題。實(shí)驗(yàn) 2 LL(1) 分析法、實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)完成預(yù)測(cè)分析法的語(yǔ)法分析程序,了解預(yù)測(cè)分析法和遞歸子程序法的 區(qū)別和聯(lián)系。使學(xué)生了解語(yǔ)法分析的功能,掌握語(yǔ)法分析程序設(shè)計(jì)的原理和構(gòu)造方法,訓(xùn)練學(xué)生掌握開(kāi)發(fā)應(yīng)用程序的基本方法。有利于提高學(xué)生的專(zhuān)業(yè)素質(zhì),為培養(yǎng)適應(yīng)社會(huì)多方面需要的能力。、實(shí)驗(yàn)要求1、編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。2、如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息。3、對(duì)下列文法,用 LL(1)分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析:(1)E->TG(2)G->+TG| TG(3)G->

26、 (4)T->FS(5)S->*FS|/FS(6)S-> (7)F->(E)(8)F->i三、實(shí)驗(yàn)容根據(jù)某一文法編制調(diào)試 LL ( 1 )分析程序,以便對(duì)任意輸入的符號(hào)串 進(jìn)行分析。構(gòu)造預(yù)測(cè)分析表,并利用分析表和一個(gè)棧來(lái)實(shí)現(xiàn)對(duì)上述程序設(shè)計(jì)語(yǔ)言的 分析程序。分析法的功能是利用 LL(1)控制程序根據(jù)顯示棧棧頂容、向前看符號(hào)以及 LL( 1)分析表,對(duì)輸入符號(hào)串自上而下的分析過(guò)程。四、實(shí)驗(yàn)步驟1、根據(jù)流程圖編寫(xiě)出各個(gè)模塊的源程序代碼上機(jī)調(diào)試。2、編制好源程序后, 設(shè)計(jì)若干用例對(duì)系統(tǒng)進(jìn)行全面的上機(jī)測(cè)試, 并通過(guò)所設(shè)計(jì) 的 LL(1)分析程序;直至能夠得到完全滿(mǎn)意的結(jié)果。

27、3、書(shū)寫(xiě)實(shí)驗(yàn)報(bào)告 ;實(shí)驗(yàn)報(bào)告正文的容:寫(xiě)出 LL(1)分析法的思想及寫(xiě)出符合 LL( 1)分析法的文法。程序結(jié)構(gòu)描述:函數(shù)調(diào)用格式、參數(shù)含義、返回值描述、函數(shù)功能;函數(shù) 之間的調(diào)用關(guān)系圖。詳細(xì)的算法描述(程序執(zhí)行流程圖) 。給出軟件的測(cè)試方法和測(cè)試結(jié)果。實(shí)驗(yàn)總結(jié) (設(shè)計(jì)的特點(diǎn)、不足、收獲與體會(huì)) 。五、實(shí)驗(yàn)截圖六、核心代碼#include<iostream>#include<string>using namespace std;string pp;/ 輸出字符串string hh="rn"/ 換行const int max=50;int endfum

28、ax;/ 終止符序號(hào)表int endfupointer=8;char endfurealmax='+','-','*','/','(','i',')','#'int unendfumax;int unendfupointer=5;char unendfurealmax='E','G','T','S','F'string makemathmax="E->TG",&q

29、uot;G->+TG","G->-TG","G->$","T->FS","S->*FS","S->/FS","S->$","F->(E)","F->i"/0 E->TG,1 G->+TG,2 G->-TG,3 G->$,4 T->FS,5 S->*FS,6 S->/FS,7 S->$,8F->(E),9 F->i/

30、$ 代表空串string behaviormax=" 初始化 ","POP"int smarttablemaxmax;/ 分析表int checkendfu(char fu)/ 查終結(jié)符序號(hào)int x;for(x=0;x<endfupointer;x+)if(endfurealx=fu)break;if(x<endfupointer)return x;else return -1;int checkunendfu(char fu)/ 查非終結(jié)符序號(hào)int x;for(x=0;x<unendfupointer;x+)if(unendfur

31、ealx=fu)break;if(x<unendfupointer)return x;else return-1;string checkmakemath(int x)/ 查產(chǎn)生式表return makemathx;int checksmarttable(int x,int y)/查分析表return smarttablexy;class smartboxpublic:smartbox()box0='#'box1='E'boxpointer=1;void push(char fu)boxpointer+; boxboxpointer=fu;char pop

32、()char a=boxboxpointer;if(a!='#')"<<a<<endl;/ cout<<"pop: "<<boxpointer<<"/stringstream oss;/*pp=pp+"pop: "char buffermax;sprintf(buffer,"%d",boxpointer);string s=buffer;pp=pp+" "pp=pp+s;pp=pp+hh;*/boxpointer-;re

33、turn a;void check()if(checkendfu(boxboxpointer)!=-1)char a;/ cout<<boxboxpointer<<checkendfu(boxboxpointer)<<"/char buffermax;/sprintf(buffer/pp=pp+boxboxpointer;/ pp=pp+checkendfu(boxboxpointer);/ pp=pp+" "a=pop();/ cout<<"out "<<a<<endl;

34、char boxmax;int boxpointer;int main()動(dòng)作"+hh;/ TODO: Add extra validation here/ pp=pp+" 步驟 分析棧 剩余輸入串 所用產(chǎn)生式/*string s1="sdsfs rnsdfsds"string s3="aaaaaaaaaaaaa"s3=s3+s1;CString s2(s3.c_str();/ CString s2=CString(s1);SetDlgItemText(IDC_EDIT2,s2);/ 用 SetDlgItemText( 文本框 ID,

35、字符串 ),將 文本框的容設(shè)置為字符串的容 .SetDlgItemText(IDC_EDIT2,s2);*/ MessageBox(str);string str;cin>>str;int x,y;for(x=0;x<max;x+) / 初始化分析表 99 為錯(cuò)誤代號(hào)for(y=0;y<max;y+)smarttablexy=99;smarttable04=0;smarttable05=0;smarttable10=1;smarttable11=2;smarttable16=3;smarttable17=3;smarttable24=4;smarttable25=4;s

36、marttable30=7;smarttable31=7;smarttable32=5;smarttable33=5;smarttable36=7;smarttable37=7;smarttable44=8;smarttable45=9;smartbox mark;char fu;char enterfu;int endfunumber;int unendfunumber;string readyin;string enter;/ cin>>enter;/enter="i+i*i#"enter=str;/enter="(i)#"int cou

37、nt=0;/ 步驟char buffer1max;sprintf(buffer1,"%d",count);string s1=buffer1;pp=pp+s1+" "/ 分析棧for(int qq1=0;qq1<=mark.boxpointer;qq1+)pp=pp+mark.boxqq1;for(qq1=0;qq1<10-mark.boxpointer;qq1+)pp=pp+" "/ 剩余輸入棧string jiequ1=enter.substr(0,enter.length();pp=pp+jiequ1;for(int

38、 t1=0;t1<20;t1+)pp=pp+" "pp=pp+"初始化 "+hh;for(x=0;x<enter.length();)/ 步驟count+;char buffermax;sprintf(buffer,"%d",count); string s=buffer; pp=pp+s+" "/ 分析棧for(int qq=0;qq<=mark.boxpointer;qq+)pp=pp+mark.boxqq;for(qq=0;qq<10-mark.boxpointer;qq+)pp=pp

39、+" "/ 剩余輸入棧string jiequ=enter.substr(x,enter.length()-x); pp=pp+jiequ;for(int t=0;t<x+10;t+)pp=pp+" "enterfu=enterx;/ cout<<"enterfu: "<<enterfu<<endl;mark.check();fu=mark.pop();/ cout<<"fu: "<<fu<<endl;if(fu='#')

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

41、dfunumber=99) pp=pp+"error!"break;readyin=makemathsmarttableunendfunumberendfunumber;pp=pp+readyin;for(int ddd=0;ddd<14-readyin.length();ddd+) pp=pp+" "pp=pp+"POP,PUSH("for(y=readyin.length()-1;y>2;y-) pp=pp+readyiny; pp=pp+")"+hh;/ cout<<"rea

42、dyin: "<<readyin<<endl;int firsttime=0;for(y=readyin.length()-1;y>2;y-)/ cout<<readyiny<<" "if(readyiny!='$')mark.push(readyiny);if(firsttime=0)if(checkendfu(readyiny)!=-1)/ cout<<"now x: "<<x<<" "/ 步驟count+;char

43、 buffermax;sprintf(buffer,"%d",count);string s=buffer;pp=pp+s+" "/ 分析棧for(int qq=0;qq<=mark.boxpointer;qq+)pp=pp+mark.boxqq;for(qq=0;qq<10-mark.boxpointer;qq+)pp=pp+" "/ 剩余輸入棧string jiequ=enter.substr(x,enter.length()-x);pp=pp+jiequ;for(int t=0;t<x+10;t+)pp=pp+

44、" "pp=pp+GETNEXT(I)"+hh;x+; cout<<pp;/cout<<"next x: "<<x<<firsttime=1;mark.check();cout<<endl;pp=pp+hh;<<endl;return 0;/CDialog:OnOK();七、實(shí)驗(yàn)總結(jié)通過(guò)本次試驗(yàn)使我不僅對(duì) ll(1)分析法有了更深的了解, 而且提高了編程能 力,希望在以后的學(xué)習(xí)中可以解決自動(dòng)構(gòu)造 follow 集的問(wèn)題。實(shí)驗(yàn) 3 LR(1) 分析法一、實(shí)驗(yàn)?zāi)康臉?gòu)造 LR(1

45、)分析程序,利用它進(jìn)行語(yǔ)法分析,判斷給出的符號(hào)串是否為該文 法識(shí)別的句子,了解 LR(K)分析方法是嚴(yán)格的從左向右掃描,和自底向 上的語(yǔ)法分析方法。二、實(shí)驗(yàn)要求1、編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。2、如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息。3、程序輸入 / 輸出實(shí)例:輸入一以 #結(jié)束的符號(hào)串 (包括 +*() i#):在此位置輸入符號(hào)串 輸出過(guò)程如下:步驟狀態(tài)棧符號(hào)棧剩余輸入串動(dòng)作i+i*i#移進(jìn)i+i*i 的LR分析過(guò)程步驟狀態(tài)棧 符號(hào)棧輸入串動(dòng)作說(shuō)明ACTION0,i=S5,狀態(tài) 5 入棧205#i+i*i#303#F+i*i#402#T+i*i#501#E+i

46、*i#10# i+i*i#6016r6: Fi 歸約 ,GOTO(0,F)=3 入棧r4: TF 歸約,GOTO(0,T)=3 入棧r2: ET歸約,GOTO(0,E)=1 入棧ACTION1,+=S6, 狀態(tài) 6 入棧1011121314#E+ i*i#E+i*i#r6: F i 歸約 ,GOTO(6,F)=3 入棧#E+F*i#r4: TF 歸約 ,GOTO(6,T)=9 入棧#E+T*i#ACTION9,*=S7,狀態(tài) 7 入棧ACTION6,i=S5,狀態(tài) 5 入棧016501630169i# ACTION7,i=S5, 狀態(tài) 5 入棧01697 #E+T*016975 #E+T*i#

47、 r6:Fi 歸約 ,GOTO(7,F)=10 入棧0169710 #E+T*F # r3: TT*F 歸約,GOTO(6,T)=9 入棧0169 #E+T # r1:E E+T,GOTO(0,E)=1 入棧01 #E # Acc:分析成功三、實(shí)驗(yàn)容對(duì)下列文法,用 LR(1)分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析:(1)E-> E+T(2)E->T(3)T-> T*F(4)T->F(5)F-> (E)(6)F-> i四、實(shí)驗(yàn)步驟1、根據(jù)流程圖編寫(xiě)出各個(gè)模塊的源程序代碼上機(jī)調(diào)試。2、編制好源程序后,設(shè)計(jì)若干用例對(duì)系統(tǒng)進(jìn)行全面的上機(jī)測(cè)試,并通過(guò)所設(shè)計(jì)的 LR(1)語(yǔ)法

48、分析程序;直至能夠得到完全滿(mǎn)意的結(jié)果。3、書(shū)寫(xiě)實(shí)驗(yàn)報(bào)告 ;實(shí)驗(yàn)報(bào)告正文的容:描述 LR(1)語(yǔ)法分析程序的設(shè)計(jì)思想。程序結(jié)構(gòu)描述:函數(shù)調(diào)用格式、參數(shù)含義、返回值描述、函數(shù)功能;函數(shù) 之間的調(diào)用關(guān)系圖。詳細(xì)的算法描述(程序執(zhí)行流程圖) 。給出軟件的測(cè)試方法和測(cè)試結(jié)果。五、實(shí)驗(yàn)截圖六、核心代碼#include<iostream>#include<string>using namespace std;int count=1;string pp;/ 輸出字符串string hh="rn"/ 換行const int max=100;char endfureal

49、max='i','+','*','(',')','#','E','T','F'int endfupointer=8;string creatwordmax="E->E+T","E->T","T->T*F","T->F","F->(E)","F->i"/ (0)E-> E+T (1)E->

50、T (2)T-> T*F (3)T->F (4)F-> (E) (5)F-> i/ 注意 rj 時(shí) j 應(yīng)對(duì)應(yīng)數(shù)組下標(biāo)int checkendfu(char fu)/ 查終結(jié)符序號(hào)int x;for(x=0;x<=endfupointer;x+)if(endfurealx=fu)break;if(x<=endfupointer)return x;else return -1;class actiongo/ 原子動(dòng)作public:actiongo()/ cout<<"eroor! wrong action or goto creat&qu

51、ot;<<endl; actype=4;action(int i,int j)actype=i;number=j;/ cout<<i<<" "<<j<<endl;int actype;/0=s 1=r 2=acc 3=goto 表 4=wrong int number;actiongo smarttablemaxmax;class stylebox/ 狀態(tài)棧public:stylebox()box0=0;boxpointer=0;void push(int style)boxpointer+;boxboxpoint

52、er=style;int pop()int a=boxboxpointer;boxpointer-;/cout<<"pop now"<<endl;return a;int boxmax;int boxpointer;class readybox/ 已歸約棧public:readybox()box0='#'boxpointer=0;void push(char fu)boxpointer+;boxboxpointer=fu;char pop()char a=boxboxpointer;boxpointer-;return a;char

53、boxmax;int boxpointer;int program(stylebox&style,readybox&ready,char fu,int icount,string ptr,intcontrol)/ 返回是否需要移進(jìn)信號(hào)if(control=1)/char bermax;sprintf(ber,"%d",count);string st=ber;pp=pp+st+" "count+;/pp=pp+" "for(int qq=0;qq<=style.boxpointer;qq+) char bssma

54、x;sprintf(bss,"%d",style.boxqq);string st=bss;pp=pp+st;for(qq=0;qq<10-style.boxpointer;qq+)pp=pp+" "for( qq=0;qq<=ready.boxpointer;qq+)pp=pp+ready.boxqq;for(qq=0;qq<10-ready.boxpointer;qq+)pp=pp+" "for(int dj=icount;dj<ptr.length();dj+)pp=pp+ptrdj;pp=pp+&quo

55、t; "/int i=style.pop();/ 如果是 s 則狀態(tài)還要入棧/ cout<<" 現(xiàn)在狀態(tài) "<<i; int j=checkendfu(fu); if(j=-1) pp=pp+"error!"return 4;/wrong!/ cout<<" 現(xiàn)在符號(hào) : "<<fu<<" "<<j<<endl;int checkstyle=smarttableij.actype;/ 查表if(checkstyle=4)p

56、p=pp+"error!"return 4;/wrong!if(checkstyle=0|checkstyle=3)style.push(i);/ 如果是 s 則狀態(tài)還要入棧if(checkstyle=0)/cout<<"ACTION"<<i<<","<<fu<<"=S"<<smarttableij.number<<",狀態(tài) "<<smarttableij.number<<"入棧

57、"<<endl;pp=pp+"ACTION"char buffermax;sprintf(buffer,"%d",i);string s=buffer;pp=pp+s;pp=pp+","pp=pp+fu;pp=pp+"=S"char bufmax;sprintf(buf,"%d",smarttableij.number); s=buf;pp=pp+s;pp=pp+", 狀態(tài) "pp=pp+s+" 入棧 "+hh;if(checksty

58、le=3)/入棧cout<<i<<","<<endfurealj<<")="<<smarttableij.number<<" "<<endl;char bfmax;sprintf(bf,"%d",i);string s=bf;pp=pp+s;pp=pp+","+endfurealj+")="char bfffmax;sprintf(bfff,"%d",smarttablei

59、j.number);s=bfff;pp=pp+s+" 入棧 "+hh;ready.push(fu);style.push(smarttableij.number);/ cout<<style.boxstyle.boxpointer<<endl;return 1;/ 移進(jìn)if(checkstyle=1)string l=creatwordsmarttableij.number;歸約,GOTO("/ cout<<"r"<<smarttableij.number+1<<": "<<l<<"pp=pp+"r"int dd=smarttableij.number+1;char bfcmax;sprintf(bfc,"%d",dd);string ss=bfc;pp=pp+ss+": "+l+" 歸約 ,GOTO("char n;/pop 用的int x;/

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論