版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、計算機與信息學院 編譯原理 實驗報告專 業(yè) 班 級 信息安全13-1班 學生姓名及學號 馬駿 2013211869 課程教學班號 任 課 教 師 李宏芒 實驗指導教師 李宏芒 實驗地點 實驗樓機房 2015 2016 學年第 二 學期實驗1 詞法分析設計一、 實驗目的 通過本實驗的編程實踐,使學生了解詞法分析的任務,掌握詞法分析程序設計的原理和構(gòu)造方法,使學生對編譯的基本概念、原理和方法有完整的和清楚的理解,并能正確地、熟練地運用二、 實驗要求 1、編程時注意編程風格:空行的使用、注釋的使用、縮進的使用等。 2、將標識符填寫的相應符號表須提供給編譯程序的以后各階段使用。 3、根據(jù)測試數(shù)據(jù)進行測
2、試。測試實例應包括以下三個部分: u 全部合法的輸入。 u 各種組合的非法輸入。 u 由記號組成的句子。 4、詞法分析程序設計要求輸出形式: 例:輸入vc+語言的實例程序: if i=0 then n+; a= 3b %); 輸出形式為: 單詞 二元序列 類 型 位置(行,列) (單詞種別,單詞屬性) for (1,for ) 關(guān)鍵字 (1,1) i ( 6,i ) 標識符 (1,2) = ( 4,= ) 關(guān)系運算符 (1,3) 12 0 ( 5,0 ) 常數(shù) (1,4) then ( 1,then) 關(guān)鍵字 (1,5) n (6,n ) 標識符 (1,6) + error error (1,
3、7) ; ( 2, ; ) 分界符 (1,8) a (6,a ) 標識符 (2,1) = (4,= ) 關(guān)系運算符 (2,2) 3b error error (2,4) % error error (2,4) ) ( 2, ) ) 分界符 (2,5) ; ( 2, ; ) 分界符 (2,6) 三、 實驗內(nèi)容用 vc+/vb/java 語言實現(xiàn)對 c 語言子集的源程序進行詞法分析。通過輸入源程序從左到右對字符串進行掃描和分解,依次輸出各個單詞的內(nèi)部編碼及單詞符號自身值;若遇到錯誤則顯示“error”,然后跳過錯誤部分繼續(xù)顯示 ;同時進行標識符登記符號表的管理。 以下是實現(xiàn)詞法分析設計的主要工作:
4、 (1)從源程序文件中讀入字符。 (2)統(tǒng)計行數(shù)和列數(shù)用于錯誤單詞的定位。 (3)刪除空格類字符,包括回車、制表符空格。 (4)按拼寫單詞,并用(內(nèi)碼,屬性)二元式表示。(屬性值token的機內(nèi)表示) (5)如果發(fā)現(xiàn)錯誤則報告出錯 7 (6)根據(jù)需要是否填寫標識符表供以后各階段使用。 四、實驗步驟1、根據(jù)流程圖編寫出各個模塊的源程序代碼上機調(diào)試。 2、 編制好源程序后,設計若干用例對系統(tǒng)進行全面的上機測試,并通過所設計的詞法分析程序;直至能夠得到完全滿意的結(jié)果。 3、書寫實驗報告 ;實驗報告正文的內(nèi)容: u 功能描述:該程序具有什么功能? u 程序結(jié)構(gòu)描述:函數(shù)調(diào)用格式、參數(shù)含義、返回值描述、
5、函數(shù)功能;函數(shù)之間的調(diào)用關(guān)系圖。 u 詳細的算法描述(程序總體執(zhí)行流程圖) 。 u 給出軟件的測試方法和測試結(jié)果。 u 實驗總結(jié) (設計的特點、不足、收獲與體會)。 五、實驗截圖先創(chuàng)建salaryfile.txt文件輸入if i=0 then n+; a= 3b %);6、 核心代碼 #include#include#include#include using namespace std;const char* salaryfile=salaryfile.txt;const int max=40;string idmax=do,end,for,if,printf,scanf,then,whil
6、e;/關(guān)鍵字表string smax=,;,(,),+,-,*,/,=,;/分界符表 算數(shù)運算符表 關(guān)系運算符表string kmax;/ 標識符string cimax;/ 常數(shù)int fjfpoint=5;/分界符表尾int mathpoint=9;/算數(shù)運算符表尾int cipointer=0;/常數(shù)表尾int idpointer=0;/關(guān)鍵字表尾int kpointer=0;/標識符表尾int fjf;/0 不是分界符 1是int rowy=1;/識別輸入行位置int rowx=1;/識別輸入列位置int outkey=0;/打印控制 0為數(shù)字后有字母 其他可以void searcht
7、(int i,string m)/根據(jù)已識別的首字母識別字符串/coutenter searcht!endl;int x;if(i=0)/首字符是字母識別關(guān)鍵字/cout a word!endl;for(x=0;xmax;x+)if(idx=m)cout(1,idx) 關(guān)鍵字 (rowy,rowx)endl;break;if(x=max)/不是關(guān)鍵字再識別標識符for(x=0;xmax;x+) if(kx=m) cout(6,m) 標識符 (rowy,rowx)endl;break; if(x=max)/標識符表沒有時插入標識符cout(6,m) 標識符 (rowy,rowx)endl;kkp
8、ointer=m;kpointer+;if(i=1)/識別常數(shù)/cout a number!endl;for(x=0;xmax;x+)if(cix=m)cout(5,x)endl;break;if(x=max) cout(5,m) 常數(shù) (rowy,rowx)endl;cicipointer=m;cipointer+;if(i=2)/識別 分界符 算數(shù)運算符 關(guān)系運算符/cout a signal!endl;for(x=0;xmax;x+)if(sx=m)break;/x-;if(x5&x10)if(outkey=1) cout(3,sx) 算數(shù)運算符 (rowy,rowx)9&xmax-1)
9、if(outkey=1) cout(4,sx) 關(guān)系運算符 (rowy,rowx)endl; outkey=0;fjf=0;if(x=max)if(outkey=1)couterror error (rowy,rowx)=48&t64&t96&t123) searcht(0,sn);else searcht(2,sn);void split(string s)/分割字符串/coutsendl;string nowmax;string sn;int nowpointer=0;int i=0;int x;int sign=2;/非法數(shù)字標志int diannumber=0;/數(shù)中點的個數(shù)for(x
10、=0;x64&sx96&sx=48&sx0&sx=46&sign=1)/判斷數(shù)字后跟字母還是字母后有數(shù)字if(i=0)if(sx=48&sx=48&sx0) / coutsn i=iendl; coutsn ; if(sign=0)/數(shù)字后有字母的情況 cout error error (rowy,rowx)endl; else /字母開頭的字符串 / cout true0&(sx-164&sx-196&sx-1=48&sx-10) / coutsn i=iendl; coutsn ; if(sign=0) cout error error (rowy,rowx)endl; else / co
11、ut true64&sx+196&sx+1=48&sx+1=57)/如果后面是數(shù)字或字母sn=s.substr(x-i+1,i); / coutsn運算符 i=iendl;coutsn64&sx-196&sx-1=48&sx-10) sn=s.substr(x-i,i); / coutsn運算符 i=iendl;coutsn ;outkey=1; wordlook(sn0,sn); rowx+; i=0; coutsx (2,sx) 分界符 (rowy,rowx)endl; rowx+;/* if(ll=;) rowy+; rowx=1; */;int main()int x;string i
12、nstring;/讀入一行string sn;/*getline(cin,sn);/ string帶空格輸入coutsn=48&t64&t96&tnoskipws;if(!inputfile)coutno fileppword)/按照空格分割字符串split(ppword);/*int begin = 0;/去掉字符串的所有空格begin = pp.find( ,begin); /查找空格在str中第一次出現(xiàn)的位置while(begin != -1) /表示字符串中存在空格 pp.replace(begin, 1, ); / 用空串替換str中從begin開始的1個字符 begin = pp.
13、find( ,begin); /查找空格在替換后的str中第一次出現(xiàn)的位置 */coutgood pptg (2)g-+tg|tg (3)g- (4)t-fs (5)s-*fs|/fs (6)s- (7)f-(e) (8)f-i u 三、實驗內(nèi)容根據(jù)某一文法編制調(diào)試 ll ( 1 )分析程序,以便對任意輸入的符號串進行分析。 u 構(gòu)造預測分析表,并利用分析表和一個棧來實現(xiàn)對上述程序設計語言的分析程序。 u 分析法的功能是利用 ll(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號以及 ll(1)分析表,對輸入符號串自上而下的分析過程。 四、實驗步驟 1、根據(jù)流程圖編寫出各個模塊的源程序代碼上機調(diào)試。
14、 2、 編制好源程序后,設計若干用例對系統(tǒng)進行全面的上機測試,并通過所設計的 ll(1)分析程序;直至能夠得到完全滿意的結(jié)果。 3、書寫實驗報告 ;實驗報告正文的內(nèi)容: u 寫出 ll(1)分析法的思想及寫出符合 ll(1)分析法的文法。 u 程序結(jié)構(gòu)描述:函數(shù)調(diào)用格式、參數(shù)含義、返回值描述、函數(shù)功能;函數(shù)之間的調(diào)用關(guān)系圖。 u 詳細的算法描述(程序執(zhí)行流程圖) 。 u 給出軟件的測試方法和測試結(jié)果。 u 實驗總結(jié) (設計的特點、不足、收獲與體會)。 五、實驗截圖6、 核心代碼 #include#includeusing namespace std;string pp;/輸出字符串string
15、 hh=rn;/換行const int max=50;int endfumax;/終止符序號表int endfupointer=8;char endfurealmax=+,-,*,/,(,i,),#;int unendfumax;int unendfupointer=5;char unendfurealmax=e,g,t,s,f;string makemathmax=e-tg,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-$,8 f-(e
16、),9 f-i/$代表空串string behaviormax=初始化,pop;int smarttablemaxmax;/分析表int checkendfu(char fu)/查終結(jié)符序號int x;for(x=0;xendfupointer;x+)if(endfurealx=fu)break;if(xendfupointer)return x;else return -1;int checkunendfu(char fu)/查非終結(jié)符序號int x;for(x=0;xunendfupointer;x+)if(unendfurealx=fu)break;if(xunendfupointer)
17、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()char a=boxboxpointer;if(a!=#)/coutpop: boxpointer aendl
18、;/stringstream oss;/*pp=pp+pop: ;char buffermax;sprintf(buffer,%d,boxpointer);string s=buffer;pp=pp+ ;pp=pp+s;pp=pp+hh;*/boxpointer-;return a;void check()if(checkendfu(boxboxpointer)!=-1)char a;/coutboxboxpointercheckendfu(boxboxpointer) ;/char buffermax;/sprintf(buffer/pp=pp+boxboxpointer;/pp=pp+ch
19、eckendfu(boxboxpointer);/pp=pp+ ;a=pop();/coutout astr;int x,y;for(x=0;xmax;x+) /初始化分析表 99為錯誤代號for(y=0;yenter; /enter=i+i*i#;enter=str;/enter=(i)#;int count=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; f
20、or(qq1=0;qq110-mark.boxpointer;qq1+)pp=pp+ ;/剩余輸入棧string jiequ1=enter.substr(0,enter.length();pp=pp+jiequ1;for(int t1=0;t120;t1+)pp=pp+ ; pp=pp+ 初始化+hh;for(x=0;xenter.length();) /步驟 count+;char buffermax; sprintf(buffer,%d,count); string s=buffer;pp=pp+s+ ; /分析棧for(int qq=0;qq=mark.boxpointer;qq+)pp
21、=pp+mark.boxqq; for(qq=0;qq10-mark.boxpointer;qq+)pp=pp+ ;/剩余輸入棧string jiequ=enter.substr(x,enter.length()-x);pp=pp+jiequ;for(int t=0;tx+10;t+)pp=pp+ ;enterfu=enterx;/coutenterfu: enterfuendl;mark.check();fu=mark.pop();/coutfu: fuendl;if(fu=#)/&enterfu=#)/coutsucessed! over!endl;pp=pp+sucessed! over
22、!+hh;break;unendfunumber=checkunendfu(fu);endfunumber=checkendfu(enterfu);/coutunendfunumberendl;/coutendfunumberendl;if(smarttableunendfunumberendfunumber=99)pp=pp+error!;break;readyin=makemathsmarttableunendfunumberendfunumber;pp=pp+readyin;for(int ddd=0;ddd2;y-)pp=pp+readyiny;pp=pp+)+hh;/coutread
23、yin: readyin2;y-)/coutreadyiny ;if(readyiny!=$) mark.push(readyiny); if(firsttime=0) if(checkendfu(readyiny)!=-1) / coutnow x: x ; /步驟 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;qq10-mark.boxpointer;q
24、q+)pp=pp+ ;/剩余輸入棧string jiequ=enter.substr(x,enter.length()-x);pp=pp+jiequ;for(int t=0;tx+10;t+)pp=pp+ ; pp=pp+ getnext(i)+hh; x+;/ coutnext x: x endl;firsttime=1; mark.check();/coutendl;/pp=pp+hh;cout e+t (2)e-t (3)t- t*f (4)t-f (5)f- (e) (6)f- i 四、實驗步驟1、根據(jù)流程圖編寫出各個模塊的源程序代碼上機調(diào)試。 2、編制好源程序后,設計若干用例對系統(tǒng)進
25、行全面的上機測試,并通過所設計的 lr(1)語法分析程序;直至能夠得到完全滿意的結(jié)果。 3、書寫實驗報告 ;實驗報告正文的內(nèi)容: u 描述 lr(1)語法分析程序的設計思想。 u 程序結(jié)構(gòu)描述:函數(shù)調(diào)用格式、參數(shù)含義、返回值描述、函數(shù)功能;函數(shù)之間的調(diào)用關(guān)系圖。 u 詳細的算法描述(程序執(zhí)行流程圖) 。 u 給出軟件的測試方法和測試結(jié)果。 五、實驗截圖6、 核心代碼#include#includeusing namespace std;int count=1;string pp;/輸出字符串string hh=rn;/換行const int max=100;char endfurealmax=
26、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-t (2)t- t*f (3)t-f (4)f- (e) (5)f- i /注意rj時j應對應數(shù)組下標int checkendfu(char fu)/查終結(jié)符序號int x;for(x=0;x=endfupointer;x+)if(endfurealx=fu)break;if(x=endfupointer)return x;else return -1;class actiongo/原子動作p
27、ublic:actiongo() / couteroor! wrong action or goto createndl; actype=4; action(int i,int j) actype=i; number=j;/ couti jendl; 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+;boxboxpo
28、inter=style;int pop()int a=boxboxpointer;boxpointer-;/coutpop nowendl;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 boxmax;int boxpointer;int program(stylebox&style,readybox&ready,char fu,int icount,string ptr,int control)/返回是否需要移進信號if(control=1)/ char bermax; sprintf(ber,%d,count); string st=ber;pp=pp+st+ ; co
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 果品綜合檢測投資回報分析
- 衛(wèi)校新學期學習計劃3篇
- 廚師的表揚信
- 2023年站長資格證復習測試有答案
- 血檢專項練習復習測試卷附答案
- 國開計算機文化基礎第2章形考客觀題題庫3及答案
- 高中英語語法專題講解虛擬語氣 人教版
- 高中英語語法復習 第十六講 冠詞講練
- 高中英語語法
- 第1章 計算機基礎知識課件
- 課件:中國國防歷史與新中國國防建設
- Unit 2 Understanding ideas We regret to inform you課件-2023-2024學年外研版(2019)高中英語選擇性必修第一冊
- 中國神經(jīng)外科重癥患者營養(yǎng)治療專家共識(2022版)課件
- 閱讀SPIN銷售巨人教學課件
- 信息技術(shù)學科核心素養(yǎng)教學課件
- 青島版小學數(shù)學三年級上冊第三單元 綜合素質(zhì)達標(含答案)
- 醫(yī)聯(lián)體實施計劃方案
- 基于RFID的倉儲管理系統(tǒng)的設計與實現(xiàn)
- 英語個人簡歷個人特長常用語
- 幽門螺桿菌胃炎京都全球共識1
- 《建筑裝飾工程造價》考試復習題庫(含答案)
評論
0/150
提交評論