(完整word版)編譯原理算符優(yōu)先分析C++源代碼_第1頁
(完整word版)編譯原理算符優(yōu)先分析C++源代碼_第2頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、算符優(yōu)先分析器源代碼:#include #include#define MAX 100 using namespace std; struct Stack / 符號棧char dataMAX;int top;char Terminal6=;,(,),a,+,#; / 終結(jié)符集合 char Table66= / 算符優(yōu)先關(guān)系表, , , ,IJJJJJJ J, , =, , , , , !, , , , , !, , , , , !, , !, , !, =;/判斷是否為終結(jié)符,是返回其所在位置i,否則返回-1int Is_Vt(char ch,char Terminal6)int i; for

2、(i=0;i6;i+)if(ch=Terminali) / 輸入符為終結(jié)符 return i;return -1;/ 讀入輸入串,返回其長度int Getchar(int length,char StringMAX)int i;coutlength;coutendl* 該輸入串為: ;for(i=0;iStringi;return length;void PrintStack(Stack &st, int top) / 輸出棧中的內(nèi)容for(int i=0;i=top;i+)coutst.datai ; cout tt;int main()Stack st;int length=0,L

3、en,k;char StringMAX,ch;Len=Getchar(length,String); / 獲得輸入串 int j=0;ch=Stringj; / 指向第一個輸入符 st.top=0;st.datast.top=#; / 將 #入棧coutendl*cout 符 號 棧 setw(15) 當 前 符 號 setw(15) 剩 余 輸 入串 setw(20) 移進或歸約 endl; / 輸出格式while(st.top!=1 | ch!=#)if(Is_Vt(ch,Terminal)!=-1) / 輸入符為終結(jié)符k=Is_Vt(ch,Terminal); / 獲取分析表 Table

4、 的第二個下標 int m,t; /t 指向終結(jié)符在棧中的位置 if(Is_Vt(st.datast.top,Terminal)!=-1) / 棧頂為終結(jié)符m=Is_Vt(st.datast.top,Terminal);/ 獲取分析表 Table 的第 一個下標t=st.top;else / 棧頂為非終結(jié)符,看 top-1m=Is_Vt(st.datast.top-1,Terminal);/ 獲取分析表 Table 的第一個下標t=st.top-1;if(Tablemk= | Tablemk=) / 棧頂符號的優(yōu)先級小 于等于endl;輸入符號,壓棧PrintStack(st,st.top);

5、 / 輸出棧中內(nèi)容 coutchsetw(10); /輸出當前符號 for(int p=j+1;p=Len;p+) / 輸出剩余輸入串coutStringp;coutttt 移進 endl; / 輸出下一步進行的操作st.top+;st.datast.top=ch; / 輸入符移進棧中j+;ch=Stringj; / 指向下一輸入符else if(Tablemk=!) / 兩終結(jié)符的優(yōu)先關(guān)系不確定coutendl* 分析出錯 !*endl;return 0;else / 棧頂符號的優(yōu)先級大于輸入符,歸約int q; / 表示分析表 Table 的行if(Is_Vt(st.datat-1,Ter

6、minal)!=-1) / 終結(jié)符相鄰符號也是 終結(jié)符q=Is_Vt(st.datat-1,Terminal);/ 獲得分析表 Table 的 行t=t-1; / 獲得分析表 Table 的列else /t-1 位置是一個非終結(jié)符q=Is_Vt(st.datat-2,Terminal);t=t-2;while(Tableqm!=)m=q;if(Is_Vt(st.datat-1,Terminal)!=-1) / 終結(jié)符相鄰符號 也是終結(jié)符q=Is_Vt(st.datat-1,Terminal);/ 獲 得 分 析 表 Table 的行 t=t-1; / 獲得分析表Table 的列else /t-

7、1 位置是一個非終結(jié)符q=Is_Vt(st.datat-2,Terminal);t=t-2;PrintStack(st,st.top); coutchsetw(10); for(intp=j+1;p=Len;p+) coutStringp;coutttt 歸約 endl;st.top=t+1;st.datast.top=N;elsecoutendl* 該輸入串不是文法的句子 !*endl; return 0;PrintStack(st,st.top);coutchsetw(10);for(int p=j+1;p=Len;p+)coutStringp;coutttt 接受 endl;couten

8、dl*分析成功:該輸入串是文法的句子!*endl;return 0;運行結(jié)果:嬴H:編譯原理調(diào)試程唐Debug、優(yōu)先-eie亥輸入串為:色吩祈成功:該輸入串是文法的句子TPress an/ key to continuecontinye*1衰輸 入串為:a;f翼X?(耳MENX耳耳KiOtE貫羔處算貝覽梵h寸彳旱NWJt XXJfME SOC Jt耳貝K址耳HiCiOtJfXK當前符號剩余輸天串移a;att;att;aNCatt時號棧當前符號CaB a+ N+B N *BLB tt tt tk Ntt分析過程 剩余輸天串a(chǎn)+att+a)ttaaHUtlKKKiMKKWK耳耳:ME員iMNaOCXiMJC耳耳6鳶移進或歸約賢進哆進移進移進b歸約NKJC江遼週量沌NKKXNJ(耳耳*該輸入串為:a;#十分析成功:該輸入串學文法的句子?十Press any key to continue進翁逬常進約翁約約K編譯原理調(diào)試程序Debug優(yōu)先exe;*輸入字符串 的長度f X XX

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論