




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、編譯原理實驗班級:計算機(jī)科學(xué)與技術(shù) 13-3:李學(xué)號:2013211705實驗一、 詞法分析設(shè)計一、實驗?zāi)康耐ㄟ^本實驗的編程實踐,使學(xué)生了解詞法分析的任務(wù),掌握詞法分析程序設(shè)計的原理和構(gòu)造方法,使學(xué)生對編譯的基本概念、原理和方法有完整的和清楚的理解,并能正確地、熟練地運(yùn)用。二、實驗內(nèi)容用 VC+/VB/JAVA 語言實現(xiàn)對 C 語言子集的源程序進(jìn)行詞法分析。通過輸入源程序從左到右對字符串進(jìn)行掃描和分解,依次輸出各個單詞的編碼及單詞符號自身值;若遇到錯誤則顯示“Error”,然后跳過錯誤部分繼續(xù)顯示 ;同時 進(jìn)行標(biāo)識符登記符號表的管理。 以下是實現(xiàn)詞法分析設(shè)計的主要工作:從源程序文件中讀入字符。
2、統(tǒng)計行數(shù)和列數(shù)用于錯誤單詞的定位。刪除空格類字符,包括回車、制表符空格。按拼寫單詞,并用(內(nèi)碼,屬性)二元式表示。 (屬性值token 的機(jī)內(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;運(yùn)算符: +、 -、 *、 /;關(guān)系運(yùn)算符: 、 、 =、 ;分界符: ;、,、(、)、 、 ;三、詞法分析實驗設(shè)計1、主
3、程序設(shè)計考慮:及算法程序的說明部分為各種表格和變量安排空間。 在具體實現(xiàn)時,將各類單詞設(shè)計成結(jié)構(gòu)和長度均相同k 數(shù)組關(guān)鍵字表,每個數(shù)組元素存放一個關(guān)鍵字(事先構(gòu)造好關(guān)鍵字表)。的形式,較短的關(guān)鍵字后面 補(bǔ)空。s 數(shù)組存放分界符表(可事先構(gòu)造好分界符表)。為了簡單起見,分界符、 算術(shù)運(yùn)算符和關(guān)系運(yùn)算符都放在 s 表中(編程時,應(yīng)建立算術(shù)運(yùn)算符表和關(guān)系運(yù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(jìn)制形式存入數(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;/運(yùn)算符判斷函數(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) /運(yùn)算符處理row+;coutstt(4,st)tt(line,row)endl;elseif(IsSeparator(st)/分隔符處理row+; coutstt(5,st)ttt(line,row)endl;elseswitch(ch)row+; case= :row+;運(yùn)算符分界符cout=t(6,=)tt 關(guān)系運(yùn)算符t(line,row) :row+;ch=in.get(); if(
10、ch=)cout=t(6,=)ttt(line,row)endl;else關(guān)系運(yùn)算符coutt(6,)tt 關(guān)系運(yùn)算符t(line,row)endl;in.seekg(-1,ios:cur); break; case :row+;ch=in.get(); if(ch=)cout=t(6,=)t 關(guān)系運(yùn)算符t(line,row)cout t ( 6 , ) t t 關(guān)系運(yùn)算符 t ( line , row ) endl; elsecout t( 6 , ) t t 關(guān)系運(yù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系運(yùn)算符 6 endl; if (in.is_open()yse(in);in.close();system(pause);標(biāo)識符 2常數(shù) 3運(yùn)算符 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)分析程序,以便對任意的輸入符號串進(jìn)行分析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)控制部分:從鍵盤輸入一個表達(dá)式符號串(4)利用 LL(1)分析算法進(jìn)行表達(dá)式處理,輸出分析結(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ī)約表達(dá)式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é)符,識別,進(jìn)行下一字符規(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)生式進(jì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)棧,他們均是先進(jìn)后出棧,分析器的動作就是由棧頂狀態(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ī)約表達(dá)式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 ,移進(jìn)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=()/下一個操作符為( ,移進(jìn)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 ,移進(jìn)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=*)/下一個操作符為* ,移進(jìn)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 ,移進(jìn)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 = ()/下一個操作符為( ,移進(jìn)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=+)/下一個操作符為+ ,移進(jìn)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 = )/下一個操作符為) ,移進(jìn)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=*)/下一個操作符為* ,移進(jìn)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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 總值班室工作職責(zé)
- 2021-2026年中國汽車零部件表面處理行業(yè)全景評估及投資規(guī)劃建議報告
- 安全生產(chǎn)的管理制度包括哪些
- 安全生產(chǎn)事故的分級和標(biāo)準(zhǔn)
- 2025年新型墻體材料行業(yè)市場需求分析
- 安全生產(chǎn)牌內(nèi)容都有什么
- 2025年中國點膠機(jī)行業(yè)市場發(fā)展監(jiān)測及投資戰(zhàn)略規(guī)劃研究報告
- 完整版門窗幕墻工程建設(shè)項目可行性研究報告
- 2024-2030全球防曬劑OMC行業(yè)調(diào)研及趨勢分析報告
- 2025年中國食品行業(yè)市場深度分析及未來發(fā)展趨勢預(yù)測報告
- DB45∕T 1098-2024 橡膠瀝青路面施工技術(shù)規(guī)范
- 《蠶絲》教學(xué)課件
- 中央軍校面試題庫及答案
- 2025年湖北省中考英語試題(附答案)
- 2024年河南省豫地科技集團(tuán)有限公司招聘真題
- 醫(yī)院培訓(xùn)課件:《靜脈中等長度導(dǎo)管臨床應(yīng)用專家共識》
- 2024山西杏花村汾酒集團(tuán)有限責(zé)任公司人才招聘筆試參考題庫附帶答案詳解
- 2023年深靜脈血栓形成的診斷和治療的指南
- GA 1809-2022城市供水系統(tǒng)反恐怖防范要求
- UPVC雙壁波紋管
- 型直線振動篩使用說明書中文
評論
0/150
提交評論