版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編譯原理程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告四元式生成班級(jí):計(jì)算機(jī)1507 班姓名:羅藝博學(xué)號(hào): 20154377一、實(shí)驗(yàn)?zāi)繕?biāo):利用上次實(shí)驗(yàn)所編寫的語(yǔ)法分析器,完成算術(shù)表達(dá)式四元式翻譯器的設(shè)計(jì)。二、實(shí)驗(yàn)內(nèi)容:1.概要設(shè)計(jì):2.流程圖.2主程序 Z子程序 E子程序 T子程序 F3.關(guān)鍵函數(shù).2/ 主程序int ParserPlus()is = 0;/ 初始化flag = 0;qt = qToken.front();qreal = qTreal.front();/Next(w)SubE();if(qt=50&flag=0)cout 語(yǔ)法正確! endl;cout endl;cout 生成的四元式如下: endl;el
2、se if(flag != 0)return 1;elseflag = 1;cout 語(yǔ)法錯(cuò)誤 (err 1) ! endl;return flag;/coutmyQT.size=myQT.size()endl;for(int k=0;kmyQT.size();k+)/ 輸出四元式myQTk.printQT();return 0;/ 子程序int SubE()ESubT();while(qt=60|qt=61)if(qt = 60)/GEQ(+)Nextword();SubT();char c = +;GEQ(c);else if(qt = 61)/GEQ(-)Nextword();SubT(
3、);char c = -;GEQ(c);return 0;/ 子程序 T int SubT()SubF();while(qt=70|qt=71)if(qt = 70)/GEQ(*)Nextword();SubF();char c = *;GEQ(c);else if(qt = 71)/GEQ(/)Nextword();SubF();char c = /;GEQ(c);return 0;/ 子程序 Fint SubF()qtw = qt/10;if(qtw=1|qtw=2)/ 為 i 的情況下sem.push(qt);qsem.push(qreal);Nextword();.2else if(q
4、tw = 3)/ 為 (的情況下Nextword();/coutqreal1endl;SubE();qtw = qt/10;/ 若無(wú)qtw 仍為 3/coutqreal2endl;/coutqt#qtwendl;if(qtw = 4)/ 若為 )Nextword();elseflag = 3;cout 語(yǔ)法錯(cuò)誤 (err 3) ! endl;return flag;elseflag = 2;cout 語(yǔ)法錯(cuò)誤 (err 2) ! endl;return flag;return 0;/ 創(chuàng)建臨時(shí)變量int Newtemp()int i = 0;for(i=0; i100; i+)if(usedi
5、 = 0)usedi = i+1;return i;/ 返回 t 編號(hào) i/ 生成四元式void GEQ(char c)string el2 = qsem.top();qsem.pop();sem.pop();string el1 = qsem.top();qsem.pop();sem.pop();int tt = Newtemp();sem.push(10);string treal = t;treal += to_string(tt);qsem.push(treal);Send(c, el1, el2, treal);/ 將四元式作為類對(duì)象儲(chǔ)存void Send(char s, strin
6、g e1, string e2,string t)myQT.push_back(QT(s,e1,e2,t);源程序代碼:(加入注釋)int ParserPlus()/ 主程序is = 0;/ 初始化flag = 0;qt = qToken.front();/Next(w)qreal = qTreal.front();SubE();if(qt=50&flag=0)cout 語(yǔ)法正確! endl;cout endl;cout 生成的四元式如下: endl;else if(flag != 0)return 1;elseflag = 1;cout 語(yǔ)法錯(cuò)誤 (err 1) ! endl;return
7、flag;.2/coutmyQT.size=myQT.size()endl;for(int k=0;kmyQT.size();k+)/ 輸出四元式myQTk.printQT();return 0;int SubE()/ 子程序ESubT();while(qt=60|qt=61)if(qt = 60)/GEQ(+)Nextword();SubT();char c = +;GEQ(c);else if(qt = 61)/GEQ(-)Nextword();SubT();char c = -;GEQ(c);return 0;int SubT()/ 子程序TSubF();while(qt=70|qt=7
8、1)if(qt = 70)/GEQ(*)Nextword();SubF();char c = *;GEQ(c);else if(qt = 71)/GEQ(/)Nextword();SubF();char c = /;GEQ(c);return 0;int SubF()/ 子程序 Fqtw = qt/10;if(qtw=1|qtw=2)/ 為 i 的情況下sem.push(qt);qsem.push(qreal);Nextword();else if(qtw = 3)/ 為 (的情況下Nextword();/coutqreal1endl;SubE();qtw = qt/10;/ 若無(wú)qtw 仍為
9、 3/coutqreal2endl;/coutqt#qtwendl;if(qtw = 4)/ 若為 )Nextword();elseflag = 3;cout 語(yǔ)法錯(cuò)誤 (err 3) ! endl;return flag;elseflag = 2;cout 語(yǔ)法錯(cuò)誤 (err 2) ! endl;.2return flag;return 0;void Nextword()/NEXT(w)qToken.pop();qt = qToken.front();qTreal.pop();/cout!qTreal.size()endl;qreal = qTreal.front();#include #i
10、nclude #include #include #include #include using namespace std;char ch;/ 當(dāng)前字符int is;/ 處理到當(dāng)前字符串第幾個(gè)int it;/token串第幾個(gè)char str100;/ 輸入字符串char token5;/ 用于生成 tokenint state;/ 詞法分析 此狀態(tài)int statebefore;/ 詞法分析 前狀態(tài)int code;int code1;int code2;int qt;/ 語(yǔ)法分析 存放當(dāng)前 token(word)string qreal;/ 四元式用int qtw;/ 判斷 qt 屬于哪
11、種字符int flag;/ 用于存放語(yǔ)法錯(cuò)誤原因int lexer;/ 存放 Lexer 函數(shù)的返回值int parser;/ 存放 Parser 函數(shù)的返回值int used50 = 0;/ 存放臨時(shí)變量char *PT02 = +, -;char *PT12 = *, /;char *PT21 = (;char *PT31 = );char *PT41 = #;queue qToken;queue qTreal;/ 四元式用存放真正的字符stack sem;/ 語(yǔ)義棧stack qsem;/ 四元式用存放真正的字符int IsAlpha(char c);/ 判斷是否為字母int IsNum
12、(char c);/ 判斷是否為數(shù)字int IsPT0(char c);/ 判斷是否為+ ,-int IsPT1(char c);/ 判斷是否為*,/int state_change(int sta, char c);int state_to_code(int stabe, char* tok);void Nextword();/NEXT(w)void GEQ(char c);/ 生成四元式void Send(char s, string e1, string e2,string t);/ 存四元式int SubE();/ 子程序 Eint SubT();/ 子程序 Tint SubF();/
13、 子程序 Fint Lexer();/ 詞法分析器int ParserPlus();/ 語(yǔ)法分析器改進(jìn)版class QTpublic :QT(chars,stringe1,stringe2,stringt):symbol(s),element1(e1),element2(e2),ttemporary(t)/ 設(shè)置四元式QT()void printQT()/ 打印四元式cout(symbolelement1element2ttemporary )endl;private:char symbol;/ 符號(hào)變量 1 變量 2 臨時(shí)變量string element1;string element2;s
14、tring ttemporary;vector myQT;/ 將類對(duì)象放入向量,便于儲(chǔ)存和最后的輸出int main().2cout 請(qǐng)輸入算術(shù)表達(dá)式,以 # 號(hào)結(jié)束。 str;lexer = Lexer();/cout!strendl;/coutqToken.size()endl;/cout lexer endl;if(lexer = 0)cout endl;cout 語(yǔ)法分析如下: endl;parser = ParserPlus();return 0;/ 詞法分析部分int Lexer()is = 0;it = 0;state = 1;cout endl;cout 詞法分析如下: end
15、l;doch = stris;statebefore = state;state = state_change(state, ch);if(state = -1)cout 詞法錯(cuò)誤,請(qǐng)檢查! endl;memset(token,0,5);it = 0;state = 1;return 1;else if(state != 0)tokenit+ = ch;elseif(statebefore != 1)string s = token;qTreal.push(s);state_to_code(statebefore, token);memset(token,0,5);it = 0;state =
16、 1;/is+;while(ch != #);qTreal.push(#);qToken.push(50);/加入#return0;int state_change(int sta, char c)if(c = ) | (c = t) | (c = n)is+;return 0;if(IsNum(ch) = 1)if(sta = 1)is+;return 2;else if(sta = 2)is+;return 2;else if(sta = 3)is+;return 3;else if(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;else.2
17、is+;return -1;else if(IsAlpha(c) = 1)if(sta = 1)is+;return 4;else if(sta = 4)is+;return 4;else if(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c=+|c=-)if(sta = 1)is+;return 5;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;
18、else if(c=*|c=/)if(sta = 1)is+;return 6;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c = ()if(sta = 1)is+;return 7;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c = )if(sta = 1)is+;
19、return 8;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c = #)if(sta = 1).2is+;return 9;else if(sta=2)|(sta=3)|(sta=4)|(sta=5)|(sta=6)|(sta=7)|(sta=8)|(sta=9)return 0;elseis+;return -1;else if(c = .)if(sta = 2)is+;return 3;elseis+;return -1;e
20、lseis+;return -1;int state_to_code(int stabe, char* tok)int j;code = 0;/ 循環(huán)用code1 = 0;code2 = 0;switch(stabe)case 2:code1 = 2;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 3:code1 = 2;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 4:code1 = 1;code = c
21、ode1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 5:code1 = 6;for(j=0; j2; j+)if(strcmp(tok,PT0j)=0)code2 = j;break;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 6:code1 = 7;for(j=0; j2; j+)if(strcmp(tok,PT1j)=0)code2 = j;break;code = code1*10+code2;coutcode1 co
22、de2endl;qToken.push(code);break;case 7:code1 = 3;.2code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 8:code1 = 4;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;case 9:code1 = 5;code = code1*10+code2;coutcode1 code2endl;qToken.push(code);break;default:cout 沒(méi)有你輸
23、入的字符!=a)&(c=A)&(c=0&c=9)return 1;elsereturn 0;int IsPT0(char *c)int n;for(n=0; n2; n+)if(strcmp(c, PT0n) = 0)return 1;return 0;int IsPT1(char *c)int n;for(n=0; n2; n+)if(strcmp(c, PT1n) = 0)return 1;return 0;/ 語(yǔ)法分析部分 (遞歸下降子程序 )int ParserPlus()/ 主程序is = 0;/ 初始化flag = 0;qt = qToken.front();/Next(w)qre
24、al = qTreal.front();SubE();if(qt=50&flag=0)cout 語(yǔ)法正確! endl;cout endl;cout 生成的四元式如下: endl;else if(flag != 0)return 1;elseflag = 1;cout 語(yǔ)法錯(cuò)誤 (err 1) ! endl;return flag;.2/coutmyQT.size=myQT.size()endl;for(int k=0;kmyQT.size();k+)/ 輸出四元式myQTk.printQT();return 0;int SubE()/ 子程序ESubT();while(qt=60|qt=61)
25、if(qt = 60)/GEQ(+)Nextword();SubT();char c = +;GEQ(c);else if(qt = 61)/GEQ(-)Nextword();SubT();char c = -;GEQ(c);return 0;int SubT()/ 子程序TSubF();while(qt=70|qt=71)if(qt = 70)/GEQ(*)Nextword();SubF();char c = *;GEQ(c);else if(qt = 71)/GEQ(/)Nextword();SubF();char c = /;GEQ(c);return 0;int SubF()/ 子程序 Fqtw = qt/10;if(qtw=1|qtw=2)/ 為 i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能家居定制木工安裝協(xié)議3篇
- 二零二五年度網(wǎng)紅店鋪?zhàn)赓U合作協(xié)議3篇
- 二零二五版粉噴樁施工工程風(fēng)險(xiǎn)評(píng)估與管理合同樣本3篇
- 二零二五版文化旅游過(guò)橋資金融資合同3篇
- 二零二五年度綜合管廊施工安裝工程服務(wù)協(xié)議2篇
- 二零二五年度林業(yè)生態(tài)補(bǔ)償機(jī)制實(shí)施合同范本4篇
- 2025年度鋁合金門窗行業(yè)環(huán)保認(rèn)證與評(píng)估合同4篇
- 二零二五年度旅行社與旅游教育機(jī)構(gòu)合作協(xié)議4篇
- 2025年專業(yè)員工勞務(wù)外包合同
- 2025年企業(yè)網(wǎng)絡(luò)漫游費(fèi)用合同
- 充電樁項(xiàng)目運(yùn)營(yíng)方案
- 2024年農(nóng)民職業(yè)農(nóng)業(yè)素質(zhì)技能考試題庫(kù)(附含答案)
- 高考對(duì)聯(lián)題(對(duì)聯(lián)知識(shí)、高考真題及答案、對(duì)應(yīng)練習(xí)題)
- 新版《鐵道概論》考試復(fù)習(xí)試題庫(kù)(含答案)
- 【律師承辦案件費(fèi)用清單】(計(jì)時(shí)收費(fèi))模板
- 高中物理競(jìng)賽真題分類匯編 4 光學(xué) (學(xué)生版+解析版50題)
- Unit1FestivalsandCelebrations詞匯清單高中英語(yǔ)人教版
- 西方經(jīng)濟(jì)學(xué)-高鴻業(yè)-筆記
- 2024年上海市中考語(yǔ)文試題卷(含答案)
- 幼兒園美術(shù)教育研究策略國(guó)內(nèi)外
- 生豬養(yǎng)殖生產(chǎn)過(guò)程信息化與數(shù)字化管理
評(píng)論
0/150
提交評(píng)論