版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、編譯原理實驗班級:計算機科學(xué)與技術(shù) 13-3:李學(xué)號:2013211705實驗一、 詞法分析設(shè)計一、實驗?zāi)康耐ㄟ^本實驗的編程實踐,使學(xué)生了解詞法分析的任務(wù),掌握詞法分析程序設(shè)計的原理和構(gòu)造方法,使學(xué)生對編譯的基本概念、原理和方法有完整的和清楚的理解,并能正確地、熟練地運用。二、實驗內(nèi)容用 VC+/VB/JAVA 語言實現(xiàn)對 C 語言子集的源程序進行詞法分析。通過輸入源程序從左到右對字符串進行掃描和分解,依次輸出各個單詞的編碼及單詞符號自身值;若遇到錯誤則顯示“Error”,然后跳過錯誤部分繼續(xù)顯示 ;同時 進行標(biāo)識符登記符號表的管理。 以下是實現(xiàn)詞法分析設(shè)計的主要工作:從源程序文件中讀入字符。
2、統(tǒng)計行數(shù)和列數(shù)用于錯誤單詞的定位。刪除空格類字符,包括回車、制表符空格。按拼寫單詞,并用(內(nèi)碼,屬性)二元式表示。 (屬性值token 的機內(nèi) 表示)(5)如果發(fā)現(xiàn)錯誤則出錯(6)根據(jù)需要是否填寫標(biāo)識符表供以后各階段使用。 單詞的基本分類:關(guān)鍵字:由程序語言定義的具有固定意義的標(biāo)識符。也稱為保留字例如if、 for、 while、 prf ; 單詞種別碼為 1。標(biāo)識符:用以表示各種名字,如變量名、數(shù)組名、函數(shù)名;常數(shù): 任何數(shù)值常數(shù)。如 125, 1,0.5,3.1416;運算符: +、 -、 *、 /;關(guān)系運算符: 、 、 =、 ;分界符: ;、,、(、)、 、 ;三、詞法分析實驗設(shè)計1、主
3、程序設(shè)計考慮:及算法程序的說明部分為各種表格和變量安排空間。 在具體實現(xiàn)時,將各類單詞設(shè)計成結(jié)構(gòu)和長度均相同k 數(shù)組關(guān)鍵字表,每個數(shù)組元素存放一個關(guān)鍵字(事先構(gòu)造好關(guān)鍵字表)。的形式,較短的關(guān)鍵字后面 補空。s 數(shù)組存放分界符表(可事先構(gòu)造好分界符表)。為了簡單起見,分界符、 算術(shù)運算符和關(guān)系運算符都放在 s 表中(編程時,應(yīng)建立算術(shù)運算符表和關(guān)系運 算符表,并且各有類號),合并成一類。id 和 ci 數(shù)組分別存放標(biāo)識符和常數(shù)。instring 數(shù)組為輸入源程序的單詞緩存。outtoken為輸出表示緩存。主程序開始后,先以人工方式輸入關(guān)鍵字,造 k 表;再輸入分界符等造 p表。主程序的工作部分
4、設(shè)計成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個循環(huán)處理一個單詞; 接收鍵盤上送來的一個單詞;調(diào)用詞法分析過程;輸出每個單詞的碼。 例如,把每一單詞設(shè)計成如下形式: (type,poer) 其中 type 指明單詞的種類,例如: Poer 指向本單詞存放處的開始位置。2.詞法分析設(shè)計根據(jù)輸入單詞的第一個字符(有時還需讀第二個字符), 判斷單詞類,產(chǎn)生類號:以字符 k 表示關(guān)鍵字; id 表示標(biāo)識符; ci 表示常數(shù); s 表示分界符。對于標(biāo)識符和常數(shù),需分別與標(biāo)識符表和常數(shù)表中已登記的元素相比較, 如表中已有該元素,則其在表中的位置,如未出現(xiàn)過,將標(biāo)識符按順序填入 數(shù)組 id 中,將常數(shù)變?yōu)槎M制形式存入數(shù)組中
5、 ci 中,并其在表中的位置。lexical 過程中嵌有兩個小過程:一個名為 getchar, 其功能為從 instring中按 順序取出一個字符,并將其指針 p加 1 ;另一個名為 error, 當(dāng)出現(xiàn) 錯 誤 時 ,調(diào) 用 這 個 過 程 , 輸 出 錯 誤。四、實驗截圖五、代碼:#include #include #includeusing namespatd;string key8=do,end,for,if,prstring optr5=+,-,*,/,+;f,scanf,then,while;string separator6=,;,(,);char ch;/判斷是否為保留字boo
6、l IsKey(string ss)i;for(i=0;i=a)&(c=A)&(c=0&c=9) return true;return false;/運算符判斷函數(shù) bool IsOptr(string ss)i; for(i=0;i5;i+)if (!strcmp(optri.c_str(), ss.c_str() return true;return false;/分界符判斷函數(shù)bool IsSeparator(string ss)i; for(i=0;i6;i+)if(!strcmp(separatori.c_str(),ss.c_str() return true;return fal
7、se;voidyse(ifstream &in)string st=; char ch;line=1,row=0; while(in.get(ch)st=;if(ch= )|(ch=t) /空格,tab 健else if(ch=n)line+;row=0;/換行行數(shù)加一處理 elseif (IsLetter(ch)row+;/關(guān)鍵字、標(biāo)識符的處理while(IsLetter(ch)|IsDigit(ch)st+=ch; in.get(ch);in.seekg(-1,ios:cur);/文件指針(光標(biāo))后退一個字節(jié)if(IsKey(st)/判斷是否為關(guān)鍵字 查詢關(guān)鍵字表;coutstt(1,st
8、)ttt(line,row)endl;關(guān)鍵字else/否則為標(biāo)示符 coutstt(2,st)tt標(biāo)識符t(line,row)endl;elseif(IsDigit(ch)row+; st+=ch; if(IsLetter(ch)ch=in.get(); st+=ch;coutsttErrortError( line , row ) endl;elsewhile (IsDigit(ch)st += ch;ch = in.get();in.seekg(-1, ios:cur);cout st t(3,st) t t 常數(shù) t ( line , row ) endl;elsest=; st+=ch
9、; if(st=+)char ch; ch=in.get(); st=st+ch; if(st=+)coutsttErrorttErrort(line,row)endl;elseif(IsOptr(st) /運算符處理row+;coutstt(4,st)tt(line,row)endl;elseif(IsSeparator(st)/分隔符處理row+; coutstt(5,st)ttt(line,row)endl;elseswitch(ch)row+; case= :row+;運算符分界符cout=t(6,=)tt 關(guān)系運算符t(line,row) :row+;ch=in.get(); if(
10、ch=)cout=t(6,=)ttt(line,row)endl;else關(guān)系運算符coutt(6,)tt 關(guān)系運算符t(line,row)endl;in.seekg(-1,ios:cur); break; case :row+;ch=in.get(); if(ch=)cout=t(6,=)t 關(guān)系運算符t(line,row)cout t ( 6 , ) t t 關(guān)系運算符 t ( line , row ) endl; elsecout t( 6 , ) t t 關(guān)系運算符 t ( line , row ) endl;in.seekg(-1, ios:cur);break; default:r
11、ow+; cout ch t t$無法識別字符 t ( line , row ) endl;main()ifstream in;in.open(測試文.txt, ios:in);cout 備注:關(guān)鍵字 1系運算符 6 endl; if (in.is_open()yse(in);in.close();system(pause);標(biāo)識符 2常數(shù) 3運算符 4分隔符 5關(guān)elsecout 文件操作出錯 endl; return 0;六、總結(jié)通過本次實驗,鞏固了關(guān)于詞法分析器的知識,并且在程序不斷的完善中,深入理解了 C+程序的完善過程。LL(1)分析法實驗二一、實驗?zāi)康耐ㄟ^完成分析法的語法分析程序,
12、了解分析法和遞歸子程序法的區(qū) 別和聯(lián)系。使學(xué)生了解語法分析的功能,掌握語法分析程序設(shè)計的原理和構(gòu)造方 法,訓(xùn)練學(xué)生掌握開發(fā)應(yīng)用程序的基本方法。有利于提高學(xué)生的專業(yè)素質(zhì),為培 養(yǎng)適應(yīng)社會多方面需要的能力。二、實驗內(nèi)容1.根據(jù)某一文法編制調(diào)試 LL(1)分析程序,以便對任意的輸入符號串進行分析2.構(gòu)造分析表,并利用分析表和一個棧來 實現(xiàn)上述程序設(shè)計語言的分析程序3.分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號以及LL(1)分析表,對輸入符號串自上而下的分析過程。三、LL(1)分析法實驗設(shè)計1、模塊結(jié)構(gòu)定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)初始化:建立LL(1)分析表,初始化向量空
13、間 (3)控制部分:從鍵盤輸入一個表達式符號串(4)利用 LL(1)分析算法進行表達式處理,輸出分析結(jié)果,如遇到錯誤則顯示錯誤信息四、實驗截圖五、代碼:#includeusing namespatd;constMaxLen = 20; /初始化棧的長度constLength = 20;/初始化數(shù)組長度char Vn5 = E, G, T, S, F ;/非終結(jié)符數(shù)組char Vt8 = i, (, ), +, -, *, /, # ;/終結(jié)符數(shù)組char ch, X;/ch 讀當(dāng)前字符,X 獲取棧頂元素char strTokenLength;/規(guī)約表達式struct LL/ll(1)分析表的構(gòu)
14、造字初始化char*c;LL E8 = TG, TG, error, error, error, error, error, error ;LL G8 = error, error, null, +TG, -TG, error, error, null ;LL T8 = FS, FS, error, error, error, error, error, error ;LL S8 = error, error, null, null, null, *FS, /FS, null ;LL F8 = i, (E), error, error, error, error, error, error ;
15、 class stack/棧的構(gòu)造及初始化public:stack();/初始化bool empty() const;/是否為空 bool full() const;/是否已滿bool get_top(char &c)const;/取棧頂元素 bool push(const char c);/入棧bool pop();/刪除棧頂元素 void out();/輸出棧中元素stack()/析構(gòu) private:count;/棧長度char dataMaxLen;/棧中元素;stack:stack()count = 0;bool stack:empty() const if (count = 0)r
16、eturn true; return false;bool stack:full() const if (count = MaxLen)return true; return false;bool stack:get_top(char &c)const if (empty()return false;elsec = dount - 1;return true;boolstack:push(const char c) if (full()return false;dount+ = c;return true;boolstack:pop() if (empty()count-; return tr
17、ue;return false;voidstack:out() for (i = 0; icount; i+)cout datai;cout t;length(char *c)l = 0;for (l+;i = 0; ci != 0; i+)return l;void prfor (i, char*c)/剩余輸入串的輸出j = i; jLength; j+)cout cj;cout t;void run() bool flag = true;/循環(huán)條件step = 0, polen;/長度= 0;/步驟、指針cout 輸入規(guī)約的字符串: strToken;ch = strTokenpostac
18、k s;+;/第一個字符s.push(#);/棧中數(shù)據(jù)初始化 s.push(E);s.get_top(X);/取棧頂元素cout 步驟t 分析棧t 剩余輸入串tt 所用產(chǎn)生式t 動作 endl; cout step+ t;s.out();pr(po- 1, strToken);cout t 初始化 endl; while (flag)if (X = Vt0) | (X = Vt1) | (X = Vt2) | (X = Vt3) | (X = Vt4)| (X = Vt5) | (X = Vt6) /判斷是否為終結(jié)符(不包括#)if (X = ch)/終結(jié)符,識別,進行下一字符規(guī)約s.pop(
19、);s.get_top(X);ch = strTokenpo +; cout step+ t; s.out();pr(po- 1, strToken);cout t GETNEXT(I) endl;elseflag = false;elseif (X = #)/規(guī)約結(jié)束if (X = ch)cout step+ t; s.out();pr(po- 1, strToken);cout X ch t 結(jié)束 endl; s.pop();flag = false;elseflag = false;else if (X = Vn0) /非終結(jié)符 Efor (i = 0; iX1X2 的產(chǎn)生式進行入棧操作
20、s.pop();len = length(Ei.c) - 1;for (j = len; j = 0; j-)s.push(Ei.cj);cout step+ t; s.out();pr(po- 1, strToken);cout X Ei.c t = 0; j-)cout Ei.cj;cout ) endl; s.get_top(X);else if (X = Vn1) /同上,處理 Gfor (i = 0; i8; i+)if (ch = Vti)if (strcmp(Gi.c, null) = 0)s.pop();cout step+ t; s.out();pr(po- 1, strTo
21、ken);cout X t POP = 0; j-)s.push(Gi.cj);cout step+ t; s.out();pr(po- 1, strToken);cout X Gi.c t = 0; j-)cout Gi.cj; cout ) endl;s.get_top(X);else if (X = Vn2) /同上 處理 Tfor (i = 0; i= 0; j-)s.push(Ti.cj);cout step+ t; s.out();pr(po- 1, strToken);cout X Ti.c t = 0; j-)cout Ti.cj;cout ) endl; s.get_top(
22、X);else if (X = Vn3)/同上 處理 Sfor (i = 0; i8; i+)if (ch = Vti)if (strcmp(Si.c, null) = 0)s.pop();cout step+ t; s.out();pr(po- 1, strToken);cout X t POP = 0; j-)s.push(Si.cj); cout step+ t;s.out();pr(po- 1, strToken);cout X Si.c t = 0; j-)cout Si.cj; cout ) endl;s.get_top(X);else if (X = Vn4) /同上 處理 Ff
23、or (i = 0; i= 0; j-)s.push(Fi.cj);cout step+ t; s.out();pr(po- 1, strToken);cout X Fi.c t = 0; j-)cout Fi.cj; cout ) endl;s.get_top(X);else /出錯處理flag = false;main()cout 實驗二 E+T(2)E-T(3)T-T*F(4)T-F(5)F-(E)(6)F-i三、LR(1)分析法實驗設(shè)計(1)總控程序(2)分析表或分析函數(shù),不同的文法分析表將不同,同一個文法采用的 LR 分析器不同時,分析表將不相同。(3)分析棧,包括文法符號棧和相應(yīng)的
24、狀態(tài)棧,他們均是先進后出棧,分析器的動作就是由棧頂狀態(tài)和當(dāng)前輸入符號決定四、實驗截圖五、代碼#includeusing namespatd;constconstMaxLen=20; /初始化棧的長度Length=20;/初始化數(shù)組長度char ch, Y;/全局變量,ch 用于讀當(dāng)前字符,Y 用于獲取棧頂元素char strTokenLength;/bool flag=true;/循環(huán)條件規(guī)約表達式po=0,step=1;/步驟、指針class stack/棧的構(gòu)造及初始化public:stack();/初始化bool empty() const;/是否為空 bool full() const
25、;/是否已滿bool get_top(char &c)const;/取棧頂元素 bool push(const char c);/入棧bool pop();void out();/輸出棧中元素 void out1();stack()/析構(gòu) private:count;/棧長度char dataMaxLen;/棧中元素; stack l,r;/l 代表符號棧,r 代表狀態(tài)棧stack:stack()count=0;boolstack:empty() const if(count=0)return true;return false;boolstack:full() const if(count=
26、MaxLen)return true;return false;boolstack:get_top(char &c)constif(empty()return false;elsec = dount - 1;return true;boolstack:push(const char c)if (full()return false;dount+ = c;return true;boolstack:pop()if (empty()return false; count-;return true;voidstack:out()for (i = 0; icount; i+)cout datai;co
27、ut t;void stack:out1()for (i = 0; icount; i+)cout (datai);cout t;void pr(i, char*c)/剩余輸入串的輸出for(j=i;jLength;j+)coutcj;coutt;void Goto(i,char c)/狀態(tài)轉(zhuǎn)換函數(shù) ,對應(yīng)于表中 GOTOif(i=0)if(c=E)r.push(1);cout ,GOTO(0,E)=1 入棧 endl;else if (c = T)r.push(2);cout ,GOTO(0,T)=2 入棧 endl;else if (c = F)r.push(3);cout ,GOTO(0
28、,F)=3 入棧 endl;elseflag = false;elseif (i = 4)if (c = E) r.push(8);cout ,GOTO(4,E)=8 入棧 endl;else if (c = T)r.push(2);cout ,GOTO(4,T)=2 入棧 endl;else if (c = F) r.push(3);cout ,GOTO(4,F)=3 入棧 endl;elseflag = false;elseif (i = 6)if (c = T) r.push(9);cout ,GOTO(6,T)=9 入棧 endl;else if (c = F)r.push(3);co
29、ut ,GOTO(6,F)=3 入棧 endl;elseflag = false;elseif (i = 7)if (c = F)r.push(10);cout ,GOTO(7,F)=10 入棧 endl;elseflag = false;elseflag = false;voidAction0()/狀態(tài) 0 時if(ch=i)/下一個操作符為 i ,移進coutstep+t; r.out1();l.out();pr(po-1,strToken);coutACTION0,i=S5,狀態(tài) 5 入棧endl; r.push(5);l.push(ch);ch=strTokenpo+;elseif(c
30、h=()/下一個操作符為( ,移進coutstep+t; r.out1();l.out();pr(po-1,strToken);coutACTION0,(=S4,狀態(tài) 4 入棧endl; r.push(4);l.push(ch);ch=strTokenpo+;elseflag = false;voidAction1()/狀態(tài) 1if(ch=+)/下一個操作符為 i ,移進coutstep+t; r.out1();l.out();pr(po-1,strToken);coutACTION1,+=S6,狀態(tài) 6 入棧endl; r.push(6);l.push(ch);ch=strTokenpo+;
31、else if(ch=#)/分析成功flag=false; coutstep+t; r.out1();l.out();pr(po-1,strToken);coutAcc:分析成功endl;elseflag=false;voidAction2() /狀態(tài) 2if(ch=*)/下一個操作符為* ,移進coutstep+t; r.out1();l.out();pr(po-1,strToken);coutACTION2,*=S7,狀態(tài) 7 入棧endl; r.push(7);l.push(ch);ch=strTokenpo+;elseif(ch=+)|(ch=)|(ch=#)/下一個操作符為+,),#
32、規(guī)約coutstep+t;r.out1();l.out();strToken);l.pop();cout r2: ET 歸約;l.push(E);r.pop();pr(po- 1,r.get_top(Y);Goto(Y), E);elseflag = false;void Action3()/狀態(tài) 3if(ch=+)|(ch=*)|(ch=)|(ch=#)/下一個操作符為+,*,),#規(guī)約coutstep+t; r.out1();l.out();l.pop(); l.push(T);pr(po-1,strToken);coutr4: TF 歸約; r.pop();r.get_top(Y);Go
33、to(Y),T);elseflag=false;void Action4_6_7(x)/狀態(tài) 4,6,7if(ch=i)/下一個操作符為 i ,移進coutstep+t; r.out1();l.out();pr(po-1,strToken);coutACTION;coutx,i=S5,狀態(tài) 5 入棧endl; r.push(5);l.push(ch);ch=strTokenpo+;elseif (ch = ()/下一個操作符為( ,移進coutstep+t; r.out1();l.out();pr(po-1,strToken);coutACTION;coutx,(=S4,狀態(tài) 4 入棧endl
34、; r.push(4);l.push(ch);ch=strTokenpo+;elseflag=false;voidAction5()/狀態(tài) 5if(ch=+)|(ch=*)|(ch=)|(ch=#)/下一個操作符為+,*,),#規(guī)約coutstep+t; r.out1();l.out();l.pop(); l.push(F);pr(po-1,strToken);coutr6: Fi 歸約; r.pop();r.get_top(Y);Goto(Y),F);elseflag=false;voidAction8()/狀態(tài) 8if(ch=+)/下一個操作符為+ ,移進coutstep+t; r.out
35、1();l.out();pr(po-1,strToken);coutACTION8,+=S6,狀態(tài) 6 入棧endl; r.push(6);l.push(ch);ch = strTokenpo+;elseif (ch = )/下一個操作符為) ,移進coutstep+t; r.out1();l.out();pr(po-1,strToken);coutACTION8,)=S11,狀態(tài) 11 入棧endl; r.push(11);l.push(ch);ch=strTokenpo+;elseflag=false;voidAction9()/狀態(tài) 9if(ch=*)/下一個操作符為* ,移進coutstep+t; r.out1();l.out();pr(po-1,strToken);coutACTION9,*=S7,狀態(tài) 7 入棧endl; r.push(7);l.push(ch);ch=strTokenpo+;elseif(ch=+)|(ch=)|
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)工業(yè)垃圾處理流程
- 食品加工廠加盟協(xié)議
- 數(shù)據(jù)中心運維外包服務(wù)協(xié)議
- 可編程邏輯控制器(基于S7-200系列)課件 第6章 PLC模擬量采集及閉環(huán)PID控制
- 中毒病人急救原則和護理措施
- 第10課 古代的村落、集鎮(zhèn)和城市 說課稿-2024-2025學(xué)年高二歷史統(tǒng)編版(2019)選擇性必修2經(jīng)濟與社會生活
- 第六課 友誼之樹常青2024-2025學(xué)年新教材七年級上冊道德與法治新說課稿(統(tǒng)編版2024)
- 智能城市綠化管理系統(tǒng)合同
- 漁業(yè)資源可持續(xù)開發(fā)利用合同
- 2025年浙教新版六年級英語下冊階段測試試卷含答案
- (已壓縮)礦產(chǎn)資源儲量技術(shù)標(biāo)準(zhǔn)解讀300問-1-90
- 《阿爾茨海默病康復(fù)》課件
- 2022-2023學(xué)年福建省泉州市惠安縣三年級(上)期末數(shù)學(xué)試卷
- 校企聯(lián)合實驗室的運營與維護
- 期末綜合試卷(含答案)2024-2025學(xué)年蘇教版數(shù)學(xué)四年級上冊
- 統(tǒng)編版語文2024-2025學(xué)年六年級上冊語文期末專題訓(xùn)練:字音字形(有答案)
- 2024-2025學(xué)年人教版道法八年級上冊 第一學(xué)期期末測試卷01
- 徐州市2023-2024學(xué)年八年級上學(xué)期期末地理試卷(含答案解析)
- 人教版數(shù)學(xué)小學(xué)二年級上冊無紙筆測試題
- GA 1809-2022城市供水系統(tǒng)反恐怖防范要求
- 國家開放大學(xué)(電大)土木工程力學(xué)網(wǎng)考答案整理
評論
0/150
提交評論