




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編譯原理實(shí)驗(yàn)合肥工業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù):班級(jí):計(jì)算機(jī)科學(xué)與技術(shù) 13-3 班學(xué)號(hào):2013211682指導(dǎo)教師:完成日期:2015.6.18實(shí)驗(yàn)一詞法分析設(shè)計(jì)一、實(shí)驗(yàn)功能:對(duì)輸入的 txt 文件內(nèi)的內(nèi)容進(jìn)行詞法分析:由文件流輸入 test.txt 中的內(nèi)容,對(duì)文件中的各類(lèi)字符進(jìn)行詞法分析打印出分析后的結(jié)果;二、程序結(jié)構(gòu)描述:(源代碼見(jiàn)附錄)1.構(gòu)造 K 表 ,關(guān)鍵字構(gòu)造 S0 表,存放分界符構(gòu)造 S1 表,存放算數(shù)運(yùn)算符構(gòu)造 S2 表, 存放關(guān)系符建 ci id 表,存放變量名和常數(shù)變量 line,row 保存行列將2.的字符串存入 instring,將要輸出的放入 outtaken構(gòu)造 i
2、s_k,is_s0,is_s1,is_s2 函數(shù),返回類(lèi)型為 bool 型,屬于 K,S0,S1,S2 表。一個(gè)字符,判斷該字符是否構(gòu)造 word 函數(shù),返回一個(gè)字符串,該字符串可能為變量名可能為關(guān)鍵字構(gòu)造 is_num 函數(shù),用于識(shí)別數(shù)字,識(shí)別的數(shù)字通過(guò),傳址的參數(shù)返回,函數(shù)返回 bool型3.主函數(shù)通過(guò) fstream 庫(kù)相關(guān)函數(shù)和類(lèi)型打開(kāi)和文件1111.txt,每一個(gè)字符判斷字符類(lèi)型,根據(jù)字符類(lèi)型的不同,調(diào)用相關(guān)函數(shù),將的詞和相關(guān)屬性存入 outtaken,準(zhǔn)備后來(lái)輸出。三、實(shí)驗(yàn)結(jié)果實(shí)驗(yàn)總結(jié):詞法分析的程序在三個(gè)實(shí)驗(yàn)中算最簡(jiǎn)單的,但由于時(shí)間。c+并不好,所以也耗費(fèi)了比較多的1、首先要文件
3、的內(nèi)容,由于fstream 庫(kù)并不熟悉,所以花費(fèi)了相當(dāng)多的時(shí)間在這里,內(nèi)容。最終確定了 get 和peek 函數(shù)用來(lái)2、在實(shí)現(xiàn)行數(shù)和列數(shù)打印時(shí)要考慮到 row+和 line+應(yīng)該放在什么位置上才可以,如當(dāng)讀取一個(gè)n 時(shí) line 要增加一,而 row 需要?dú)w 0 處理,在一;3、對(duì)每個(gè)字符都應(yīng)對(duì)每個(gè)表進(jìn)行判斷,一旦出現(xiàn)某一字符串或字符后 row 需要加字符就標(biāo)記為 ERROR 放入輸出緩存4、編譯原來(lái)是所學(xué)的幾門(mén)比較難得科目之一,對(duì)于編譯原理這門(mén)課,應(yīng)該花費(fèi)的時(shí)間來(lái)學(xué)習(xí),才能正確理解其中的算法,。實(shí)驗(yàn)二 LL(1)分析法一、實(shí)驗(yàn)原理:1、寫(xiě)出 LL(1)分析法的:當(dāng)一個(gè)文法滿(mǎn)足 LL(1)條件
4、時(shí),就可以為它構(gòu)造一個(gè)不帶回溯的自上而下的分析程序,這個(gè)分析程序是有一組遞歸過(guò)程組成的,每個(gè)過(guò)程對(duì)應(yīng)文法的一個(gè)非終結(jié)符。實(shí)現(xiàn) LL(1)分析的一種有效的方法分析表是一個(gè) MA,a形式的矩是使用一張分析表和一個(gè)站進(jìn)行聯(lián)合控制。陣,著分析規(guī)則;棧 STACK 用于存放文法符號(hào)。從棧頂取符號(hào),按照分析表給出的規(guī)則進(jìn)行有步驟的分析。2.實(shí)驗(yàn)要求實(shí)現(xiàn)的文法:(1)E-TG(2)G-+TG|TG(3)G-(4)T-FS(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i二、程序結(jié)構(gòu):各個(gè)模塊:定義部分:定義符號(hào)棧,輸入串等數(shù)據(jù)。初始化:事先算出分析表存入 string 數(shù)組,以供后來(lái)分析使用???/p>
5、制部分:從鍵盤(pán)輸入一個(gè)表達(dá)式符號(hào)串;利用 LL(1)分析算法進(jìn)行表達(dá)式處理:根據(jù) LL(1)分析表對(duì)表達(dá)式符號(hào)串進(jìn)行堆棧(或其他)操作,輸出分析結(jié)果,如果遇到錯(cuò)誤則顯示錯(cuò)誤信息。程序各個(gè)部分的實(shí)現(xiàn):1.2.用 init 函數(shù)進(jìn)行初始化,將#和輸入串放入棧主函數(shù)獲取輸入串,規(guī)定輸入串以#結(jié)束,同時(shí)若發(fā)現(xiàn)輸入串有信號(hào)。字符,則輸出錯(cuò)誤3.4.5.若輸入串沒(méi)有字符,開(kāi)始對(duì)輸入串進(jìn)行分析。根據(jù)輸入串棧頂和符號(hào)棧頂?shù)脑兀x擇不同的操作。若需要分,則查找分析表,選擇適當(dāng)?shù)奈恢眠M(jìn)行分析。三、實(shí)驗(yàn)結(jié)果:測(cè)試方法:運(yùn)行程序,輸入需要分析的語(yǔ)句如下:四、實(shí)驗(yàn)總結(jié):1、出現(xiàn)下列兩種情況說(shuō)明遇到了語(yǔ)法錯(cuò)誤: (1)
6、棧頂?shù)慕K結(jié)符與當(dāng)前的輸入符號(hào)不匹配。(2)非終結(jié)符 A 處于棧頂,輸入符號(hào)為 a,但分析表 M 中MA,a為空。當(dāng)程序發(fā)現(xiàn)輸入串的錯(cuò)誤時(shí),既停止程序,輸出錯(cuò)誤標(biāo)志。2、由于個(gè)人水平有限,本實(shí)驗(yàn)有人輸入了分析表,而沒(méi)有實(shí)現(xiàn)程序根據(jù)文法直接生成分析表,這是比較遺憾的,我會(huì)在以后的學(xué)習(xí)中更加完善自己的能力。3、本實(shí)驗(yàn)的各行的對(duì)其也比較麻煩,在驗(yàn)收時(shí)善的。4、編譯原理的作業(yè)到這里已經(jīng)比較難了,我在實(shí)驗(yàn)驗(yàn)收前只憑自己的能力做到這一步,第三個(gè)實(shí)驗(yàn)則參考了同學(xué)的代碼。程序輸出并沒(méi)有對(duì)其,而是在驗(yàn)收后完實(shí)驗(yàn)三 LR(1)分析法一實(shí)驗(yàn)原理LR(1)分析法實(shí)驗(yàn)設(shè)計(jì)及算法(1)總控程序,也可以稱(chēng)為驅(qū)動(dòng)程序。對(duì)所有的
7、 LR 分析器總控程序都是相同的。 (2)分析表或分析函數(shù),不同的文法分析表將不同,同一個(gè)文法采用的 LR 分析器不同時(shí),分析表將不同,分析表又可以分為動(dòng)作表(ACTION)和狀態(tài)轉(zhuǎn)換(GOTO)表兩個(gè)部分,它們都可用二維數(shù)組表示。(3)分析棧,包括文法符號(hào)棧和相應(yīng)的狀態(tài)棧,它們均是先進(jìn)后出棧。分析器的動(dòng)作就是由棧頂狀態(tài)和當(dāng)前輸入符號(hào)所決定。二、程序結(jié)構(gòu)其中:SP 為棧指針,Si為狀態(tài)棧,Xi為文法符號(hào)棧。狀態(tài)轉(zhuǎn)換表用 GOTOi, X=j 表示,規(guī)定當(dāng)棧頂狀態(tài)為 i,遇到當(dāng)前文法符號(hào)為 X 時(shí)應(yīng)轉(zhuǎn)向狀態(tài) j,X 為終結(jié)符或非終結(jié)符。ACTIONi,a規(guī)定了棧頂狀態(tài)為 i 時(shí)遇到輸入符號(hào) a
8、應(yīng)執(zhí)行。動(dòng)作有四種可能:(1)移進(jìn):actioni,a= Sj:狀態(tài) j 移入到狀態(tài)棧,把 a 移入到文法符號(hào)棧,其中 i,j 表示狀態(tài)號(hào)。歸約:actioni,a=rk:當(dāng)在棧頂形成句柄時(shí),則歸約為相應(yīng)的非終結(jié)符 A,即文法中有 A- B 的產(chǎn)生式,若 B 的長(zhǎng)度為 R(即|B|=R),則從狀態(tài)棧和文法符號(hào)棧中自頂向下去掉 R 個(gè)符號(hào),即棧指針 SP 減去 R,并把 A 移入文法符號(hào)棧內(nèi), j=GOTOi,A移進(jìn)狀態(tài)棧,其中 i 為修改指針后的棧頂狀態(tài)。接受 acc:當(dāng)歸約到文法符號(hào)棧中只剩文法的開(kāi)始符號(hào) S 時(shí),并且輸入符號(hào)串已結(jié)束即當(dāng)前輸入符是#,則為分析成功。報(bào)錯(cuò):當(dāng)遇到狀態(tài)棧頂為某一
9、狀態(tài)下出現(xiàn)不該遇到的文法符號(hào)時(shí),則報(bào)錯(cuò),說(shuō)明輸入端不是該文法能接受的符號(hào)串。同樣這個(gè)實(shí)驗(yàn)的分析表我沒(méi)有用程序自動(dòng)生成,而是人工根據(jù)分析表選擇相關(guān)的操作。三、實(shí)驗(yàn)結(jié)果:程序測(cè)試:輸入需要規(guī)約的字符串:四、實(shí)驗(yàn)總結(jié)相較于前兩個(gè)實(shí)驗(yàn),第三個(gè)實(shí)驗(yàn)的難度更大,因?yàn)?LR(1)文法比 LL(1)更復(fù)雜一些,同樣因?yàn)槲覀€(gè)人的水平較差,我參考了同學(xué)的代碼,這個(gè)實(shí)驗(yàn)同樣沒(méi)能讓程序自動(dòng)生成分析表,而是根據(jù)所給出的分析表,用人工確定要執(zhí)行的操作,編寫(xiě)相關(guān)的函數(shù),根據(jù)輸入串使用switch 來(lái)確定使用什么函數(shù),以此來(lái)分析輸入串。編譯原理確實(shí)很難,但越難就應(yīng)該越認(rèn)真的去學(xué)才能理解編譯器的原理,寫(xiě)出更高效,和更少錯(cuò)誤的程
10、序。不可否認(rèn)我對(duì)編譯原理的學(xué)習(xí)還不夠好,但是我將在以后的學(xué)習(xí)中循序漸進(jìn)的學(xué)習(xí)編譯原理,掌握一個(gè)計(jì)算機(jī)系學(xué)生應(yīng)該掌握的知識(shí)。附錄:實(shí)驗(yàn)一源代碼:#include #include #include #include #include #include using namespatd;string k8=do,end,for,if,prf,scanf,then,while;/關(guān)鍵字表1char s06=,;,(,),;/分界符表 2pair p1(10H,+); pair p2(11H,-); pair p3(20H,*); pair p4(21H,/);pair s14=p1,p2,p3,p4;
11、/算術(shù)運(yùn)算符表3pair ps1(00H,); pair ps2(01H,=); pair ps3(02H,=); pair ps4(03H,); pair ps5(04H,=);pair ps6(05H,);pair s26=ps1,ps2,ps3,ps4,ps5,ps6;/關(guān)系運(yùn)算符表4vector ci;vector id;/常數(shù)表5/標(biāo)識(shí)符表 6vector instring;/源程序的輸入緩存struct out_taken string word=;num=0;string quality=; string type=;/用于輸出條目row1=0,line1=0;is_error=
12、0;vector outtaken;/輸出緩存instring_poer=0;row=1,line=1;/用于定位的行列bool is_s0(char c)for(i=0;i6;i+) if(c=s0i)return true;return false;bool is_s1(char c)for(i=0;i4;i+) if(c=s1i.second)return true;return false;bool is_s2(char c) string s=; s=s+c;for(i=0;i6;i+) if(s=s2i.second)return true;return false;bool is
13、_k(string s)for(i=0;i8;i+) if(s=ki)return true;return false;string word(vector instring)vector temp;/識(shí)別單詞時(shí)的臨時(shí)變量 string s=;while(!(is_s0(instringinstring_poer)|is_s1(instringinstring_po oer)&instringinstring_poer!=er)|is_s2(instringinstring_p&instringinstring_poer!=t&instringinstring_poer!=n)temp.pus
14、h_back(instringinstring_poer); instring_poer+;for(i=0;itemp.size();i+)s=s+tempi;return s;bool is_num(vector instring,string &s) vector temp;/識(shí)別單詞時(shí)的臨時(shí)變量isnum=0;while(!(is_s0(instringinstring_poer)|is_s1(instringinstring_poer)|is_s2(instringinstring_p oer)&instringinstring_poer!=&instringinstring_poer
15、!=t&instringinstring_poer!=n)if(instringinstring_poer=0&instringinstring_poer=9)temp.push_back(instringinstring_poinstring_poer+;er);elsetemp.push_back(instringinstring_po instring_poer+; isnum=1;for(i=0;itemp.size();i+) s=s+tempi;if(isnum=0) return true;return false;er);main() ifstream fin;fin.open
16、(G:file1111.txt); while(fin.peek()!=EOF)instring.push_back(fin.get();fin.close();while (instring_poer=a&instringinstring_po A&instringinstring_poer=Z)string s=word(instring); if(is_k(s)out_taken otn;otn.word=s;er=otn.num=1;otn.quality=s;oype=關(guān)鍵字;otn.line1=line; otn.row1=row; outtaken.push_back(otn);
17、line+;elseout_taken otn; otn.word=s; otn.num=6; otn.quality=s;oype=標(biāo)識(shí)符;otn.line1=line; otn.row1=row; outtaken.push_back(otn); id.push_back(s);line+;else if (instringinstring_poer=0&instringinstring_po string c=;if(is_num(instring,c) out_taken otn; otn.word=c; otn.num=5;otn.quality=c;er=9)oype=常數(shù);otn
18、.line1=line; otn.row1=row; outtaken.push_back(otn); ci.push_back(c);line+;else out_taken otn; otn.word=c; otn.num=5; otn.quality=c;otn.is_error=1;oype=ERROR;otn.line1=line;otn.row1=row;outtaken.push_back(otn);else if(is_s0(instringinstring_poer) out_taken otn; otn.word=otn.word+instringinstring_po o
19、tn.num=2;otn.quality=otn.word;er;oype=分界符;otn.line1=line; otn.row1=row; outtaken.push_back(otn); line+;instring_poer+;else if(is_s1(instringinstring_poer) string s=; s=s+instringinstring_poer;if(is_s1(instringinstring_poer+1) s=s+instringinstring_poer+1; out_taken otn;otn.word=s; otn.num=5; otn.qual
20、ity=s;otn.is_error=1;oype=ERROR;otn.line1=line; otn.row1=row; outtaken.push_back(otn); line+;instring_poer=instring_poelse out_taken otn; otn.word=s; otn.num=3; otn.quality=s;er+2;oype=算數(shù)運(yùn)算符;otn.line1=line; otn.row1=row; outtaken.push_back(otn); line+;instring_poer+;else if(is_s2(instringinstring_po
21、er) string s2s=; s2s=s2s+instringinstring_poer;if(is_s2(instringinstring_poer+1) s2s=s2s+instringinstring_poer+1;if(s2s=|s2s=)out_taken otn; otn.word=s2s; otn.num=4; otn.quality=s2s;oype=關(guān)系運(yùn)算符;otn.line1=line; otn.row1=row; outtaken.push_back(otn); line=line+2;instring_poer=instring_poer+2;elseout_ta
22、ken otn; otn.word=s2s; otn.num=4;otn.quality=s2s;oype=關(guān)系運(yùn)算符;otn.line1=line; otn.row1=row; outtaken.push_back(otn); line+;instring_poer+;else if (instringinstring_po row+;line=1;instring_poer+;else if(instringinstring_po instring_poer+;elseer=n)er= |instringinstring_poer=t)string ss=; ss=ss+instringi
23、nstring_poout_taken otn;er;otn.word=ss; otn.num=4;otn.quality=ss;oype=ERROR;otn.is_error=1; otn.line1=line; otn.row1=row; outtaken.push_back(otn); instring_poer+;line+;cnt=0;coutsetw(10) 單詞setw(17) 二元序列setw(12) 類(lèi)型setw(13)(行,列)endl; while(cntouttaken.size()if(outtakencnt.is_error=1)coutsetw(10)outtak
24、encnt.wordsetw(17)ERRORsetw(12)ERROR(setw(5)outtakencnt.row1,setw(5)outtakencnt.line1)endl;elsecoutsetw(10)outtakencnt.word(setw(7)outtakencnt.num,setw(7)outta kencnt.quality)setw(12)outtakencnt.type(setw(5)outtakencnt.row1,setw(5)outtakencnt.line1)endl; cnt+;return 0;實(shí)驗(yàn)二源代碼:#include #include #inclu
25、de #include #include using namespatd;string pr_list68=+,-,*,/,(, ) ,i,#,error,error,error,error,E-TG,error,E-TG,error,/ EG-+TG,G-TG,error,error,error,G-z,error,G-z,/Gerror,error,error,error,T-FS,error,T-FS,error,/TS-z,S-z,S-*FS,S-/FS,error,S-z,error,S-z,error,error,error,error,F-(E),error,F-i,error;
26、/F/S構(gòu)造分析表vector input;/輸入串 vector sign_stack;/符號(hào)站 vector in_stack;/輸入串cnt; struct RSsteps=0;stringsign_s=,in_s=,s=,behave=;void init(vector input) sign_stack.push_back(#); sign_stack.push_back(E); RS rs;for(i=input.size()-1;i=0;i-) in_stack.push_back(inputi);cnt=0;cout步驟setw(8) 符號(hào)棧setw(14) 輸入串setw(1
27、1) 所用產(chǎn)生式setw(12)動(dòng)作endl;t;for(i=0;i=0;i-)rs.in_s=rs.in_s+in_stacki;rs.behave=初始化;coutrs.stepssetw(8) trs.sign_ssetw(8) trs.in_ssetw(16) ttrs.behaveendl;cnt+;main() char c;while(1)se=0;c= cin.get();if(c=#)input.push_back(c);break;if(c!=i)&(c!=+)&(c!=-)&(c!=*)&(c!=/)&(c!=()&(c!=) cout輸入串存在錯(cuò)誤!endl;se=-1
28、; break;input.push_back(c);if(se=0)init(input);char sign_c,in_c;while(in_stackin_stack.size()-1!=#|sign_stacksign_stack.size()-1!=#)in_c=in_stackin_stack.size()-1;sign_c=sign_stacksign_stack.size()-1;if(in_c=sign_c) char a=in_c; RS rs;vector :iterator its=sign_stack.end()-1; vector :iterator iti=in_
29、stack.end()-1; sign_stack.erase(its);in_stack.erase(iti);t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=GETNEXT(; rs.behave=rs.behave+a; rs.behave=rs.behave+); coutrs.stepssetw(8)trs.in_ssetw(8) tttrs.behaveendl; cnt+;elseif(sign_c=E)trs.sign_ssetw(8)string s=,p;s=s+in_c;c=0,j=0;for(i=0;i8;i+
30、)if(pr_list1i!=error&s=pr_list0i)j=1;vector :iterator its=sign_stack.end()-1; sign_stack.erase(its);p=pr_list1i; while(pr_list1ipr_list1i.size()-j!=)if(pr_list1ipr_list1i.size()-j!=z) sign_stack.push_back(pr_list1ipr_list1i.size()-j); j+;elsec=-1; j+;if(c=0)RS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in
31、_stacki;rs.behave=POP,PUSH(;for(i=0;ij-1;i+)rs.behave=rs.behave+sign_stacksign_stack.size()-(i+1);rs.behave=rs.behave+); rs.s=p; coutrs.stepssetw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;elseRS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=POP; rs.s=p;coutrs.steps
32、setw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;break;if(j=0)cout錯(cuò)誤!該字符串不符合本文法!endl;break;else if(sign_c=G)string s=,p; s=s+in_c;c=0,j=0;for(i=0;i8;i+)if(pr_list2i!=error&s=pr_list0i) j=1;vector :iterator its=sign_stack.end()-1; sign_stack.erase(its);p=pr_list2i; while(pr_list
33、2ipr_list2i.size()-j!=)if(pr_list2ipr_list2i.size()-j!=z) sign_stack.push_back(pr_list2ipr_list2i.size()-j); j+;elsec=-1; j+;if(c=0)RS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=POP,PUSH(;for(i=0;ij-1;i+)rs.behave=rs.behave+sign_stacksign_stack.size()-(i+1);rs.behave=rs.behave+); rs.s=
34、p;coutrs.stepssetw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;elseRS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=POP; rs.s=p;coutrs.stepssetw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;break;if(j=0)cout錯(cuò)誤!該字符串不符合本文法!endl;break;else if (sign_
35、c=T)string s=,p;c=0,j=0; s=s+in_c;for(i=0;i8;i+)if(pr_list3i!=error&s=pr_list0i) j=1;vector :iterator its=sign_stack.end()-1; sign_stack.erase(its);p=pr_list3i; while(pr_list3ipr_list3i.size()-j!=)if(pr_list3ipr_list3i.size()-j!=z) sign_stack.push_back(pr_list3ipr_list3i.size()-j); j+;elsec=-1;j+;if
36、(c=0)RS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=POP,PUSH(;for(i=0;ij-1;i+)rs.behave=rs.behave+sign_stacksign_stack.size()-(i+1);rs.behave=rs.behave+); rs.s=p; coutrs.stepssetw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;elseRS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in
37、_s+in_stacki;rs.behave=POP; rs.s=p;coutrs.stepssetw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;break;if(j=0)cout 錯(cuò)誤!該字符串不符合本文法! endl;break;else if(sign_c=S)string s=,p;c=0,j=0; s=s+in_c;for(i=0;i8;i+)if(pr_list4i!=error&s=pr_list0i) j=1;vector :iterator its=sign_stack.end()-1;
38、 sign_stack.erase(its);p=pr_list4i; while(pr_list4ipr_list4i.size()-j!=)if(pr_list4i3=z) c=-1;j+;elsesign_stack.push_back(pr_list4ipr_list4i.size()-j);j+;if(c=0)RS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=POP,PUSH(;for(i=0;ij-1;i+)rs.behave=rs.behave+sign_stacksign_stack.size()-(i+1)
39、;rs.behave=rs.behave+); rs.s=p; coutrs.stepssetw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;elseRS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=POP; rs.s=p;coutrs.stepssetw(8)trs.sign_ssetw(8)trs.in_ssetw(8) trs.behaveendl;cnt+;break;trs.ssetw(8)if(j=0)cout錯(cuò)誤!該字符串不
40、符合本文法!endl; break;else if (sign_c=F)string s=,p;c=0,j=0; s=s+in_c;for(i=0;i8;i+)if(pr_list5i!=error&s=pr_list0i) j=1;vector :iterator its=sign_stack.end()-1; sign_stack.erase(its);p=pr_list5i; while(pr_list5ipr_list5i.size()-j!=)if(pr_list5ipr_list5i.size()-j!=z) sign_stack.push_back(pr_list5ipr_lis
41、t5i.size()-j); j+;elsec=-1; j+;if(c=0)RS rs;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=POP,PUSH(;for(i=0;ij-1;i+)rs.behave=rs.behave+sign_stacksign_stack.size()-(i+1);rs.behave=rs.behave+); rs.s=p; coutrs.stepssetw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;elseRS r
42、s;t;for(i=0;i=0;i-) rs.in_s=rs.in_s+in_stacki;rs.behave=POP; rs.s=p;coutrs.stepssetw(8)trs.sign_ssetw(8)trs.behaveendl;trs.in_ssetw(8)trs.ssetw(8)cnt+;break;if(j=0)cout錯(cuò)誤!該字符串不符合本文法!endl; break;return 0;實(shí)驗(yàn)三源代碼:#include #includeusing namespatd;const const char ch;char Y;MaxLen = 20;Length = 20;string
43、 strToken;bool flag = true;po=0;step = 1;class stackpublic:stack()count = 0;stack()bool empty()const if(count = 0)return true; return false;bool full()constif(count = MaxLen) return true;return false;bool get_top(char &c)const/獲取棧頂符號(hào) if(empty()return false;elsec = dount-1;return true;bool push(const
44、 char c)/壓棧 if(full()return false;dount+ = c;return true;bool pop()/出棧 if(empty()return false; count-;return true;void out()/輸出棧中元素 for(i=0;icount;i+)coutdatai; coutt;void out_1()for(i=0;icount;i+) cout()datai;coutt;private:count;/棧長(zhǎng)度char dataMaxLen;/棧中元素;stack S,X;/S:狀態(tài)棧 X:符號(hào)棧void pr(i,string c)/輸出
45、剩余的輸入串 for(j=i;jc.size();j+)coutcj; coutt;void Goto(i,char c)if(i = 0)if(c = E)S.push(1);cout,GOTO(0,E)=1 入棧endl;else if(c = T)S.push(2);cout,GOTO(0,T)=2 入棧endl;else if(c = F)S.push(3);cout,GOTO(0,F)=3 入棧endl;elseflag = false;else if(i = 4)if(c = E)S.push(8);cout,GOTO(4,E)=8 入棧endl;else if(c = T)S.p
46、ush(2);cout,GOTO(4,T)=2 入棧endl;else if(c = F)S.push(3);cout,GOTO(4,F)=3 入棧endl;elseflag = false;else if(i = 6)if(c = T)S.push(9);cout,GOTO(6,T)入棧endl;else if(c = F)S.push(3);cout,GOTO(6,F)=3 入棧endl;elseflag = false;else if(i=7)if(c=F)S.push(10);cout,GOTO(7,F)=10 入棧endl;elseflag = false;void Action_0
47、()/狀態(tài)為 0if(ch = i)coutstep+t; S.out_1();X.out();pr(po-1,strToken); coutACTION0,i=S5,狀態(tài) 5 入棧endl; S.push(5);X.push(ch);ch = strTokenpo+;else if(ch = () coutstep+t; S.out_1();X.out();pr(po-1,strToken); coutACTION0,(=S4,狀態(tài) 4 入棧endl; S.push(4);X.push(ch);ch = strTokenpo+;elseflag = false;void Action_1()
48、/狀態(tài)為 1 if(ch = +)coutstep+t; S.out_1();X.out();pr(po-1,strToken); coutACTION0,+=S6,狀態(tài) 6 入棧endl; S.push(6);X.push(ch);ch = strTokenpo+;else if(ch = #) flag = false;coutstep+t; S.out_1();X.out();pr(po-1,strToken); coutAcc:分析成功endl;elseflag = false;void Action_2()/狀態(tài)為 2 if(ch = *)coutstep+t; S.out_1();
49、X.out();pr(po-1,strToken); coutACTION2,*=S7,狀態(tài) 7 入棧endl; S.push(7);X.push(ch);ch = strTokenpo+;else if(ch = + | ch = ) | ch = #) coutstep+t;S.out_1();X.out();X.pop(); X.push(E);pr (po -1,strToken); coutT 規(guī)約; S.pop();S.get_top(Y); Goto( (Y),E);elseflag = false;void Action_3()/狀態(tài)為 3if(ch = + | ch = *
50、| ch= ) | ch = #) coutstep+t;S.out_1();X.out();X.pop(); X.push(T);pr (po -1,strToken); coutF 規(guī)約; S.pop();S.get_top(Y); Goto( (Y),T);elseflag = false;void Action_4_6_7(if(ch = i)x)/狀態(tài)為 4,6,7coutstep+t; S.out_1();X.out();pr(po-1,strToken); coutACTION;coutx,i=S5,狀態(tài) 5 入棧endl; S.push(5);X.push(ch);ch = s
51、trTokenpo+;else if(ch = () coutstep+t; S.out_1();X.out();pr(po-1,strToken); coutACTION;coutx,(=S4,狀態(tài) 4 入棧endl; S.push(4);X.push(ch);ch = strTokenpo+;elseflag = false;void Action_5()/狀態(tài)為 5if( (ch = +) | (ch = *) | (ch = ) | (ch = #) coutstep+t;S.out_1();X.out();X.pop(); X.push(F);pr(po-1,strToken); couti 規(guī)約; S.pop();S.get_top(Y); Goto(Y),F);elseflag = false;void Action_8()/狀態(tài)為 8 if(ch = +)coutstep+t; S.out_1();X.out();pr(po-1,strToken); coutACTION8,+=S6,狀態(tài) 6 入棧endl; S.push(6);X.push(ch);ch = strTokenpo+;else if(ch = ) coutstep+t; S.out_1();X.out();pr(po-1,strToken
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- JJF 2199-2025數(shù)字式時(shí)鐘校準(zhǔn)規(guī)范
- 前期策劃合同范本
- 養(yǎng)牛設(shè)備出售合同范本
- 保障性住房購(gòu)房合同范本
- 加油卡租車(chē)合同范本
- 協(xié)議單位優(yōu)惠合同范例
- 醫(yī)藥物流合同范本
- 修叉車(chē)合同范本
- 勞務(wù)分包協(xié)議合同范本
- 勞務(wù)合同范本已填
- 脫硫自動(dòng)化控制-洞察分析
- 醫(yī)務(wù)人員醫(yī)德醫(yī)風(fēng)培訓(xùn)
- 人教版初中歷史八上-第2課 第二次鴉片戰(zhàn)爭(zhēng)
- 2024湖北省金口電排站管理處招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 油井供水合同范例
- 2025年人教部編版語(yǔ)文五年級(jí)下冊(cè)教學(xué)計(jì)劃(含進(jìn)度表)
- 全國(guó)計(jì)算機(jī)等級(jí)考試一級(jí)試題及答案(5套)
- 銀河證券-科創(chuàng)板認(rèn)知測(cè)評(píng)題目及答案
- 產(chǎn)品方案設(shè)計(jì)模板
- 部隊(duì)通訊員培訓(xùn)
- 物業(yè)公司水浸、水管爆裂事故應(yīng)急處置預(yù)案
評(píng)論
0/150
提交評(píng)論