版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、電 子 科 技 大 學(xué)實(shí) 驗(yàn) 報(bào) 告學(xué)生姓名: 學(xué) 號(hào): 指導(dǎo)教師:實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)時(shí)間:一、實(shí)驗(yàn)室名稱:計(jì)算機(jī)學(xué)院軟件工程實(shí)驗(yàn)室二、實(shí)驗(yàn)項(xiàng)目名稱:詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)三、實(shí)驗(yàn)學(xué)時(shí):4學(xué)時(shí)四、實(shí)驗(yàn)原理 1.編譯程序要求對(duì)高級(jí)語言編寫的源程序進(jìn)行分析和合成,生成目標(biāo)程序。詞法分析是對(duì)源程序進(jìn)行的首次分析,實(shí)現(xiàn)詞法分析的程序?yàn)樵~法分析程序。2. 詞法分析的功能是從左到右逐個(gè)地掃描源程序字符串,按照詞法規(guī)則識(shí)別出單詞符號(hào)作為輸出,對(duì)識(shí)別過程中發(fā)現(xiàn)的詞法錯(cuò)誤,輸出相關(guān)信息。3. 狀態(tài)轉(zhuǎn)換圖是有限有向圖,是設(shè)計(jì)詞法分析器的有效工具。5、 實(shí)驗(yàn)?zāi)康?通過設(shè)計(jì)詞法分析器的實(shí)驗(yàn),使同學(xué)們了解和掌握詞法分析程
2、序設(shè)計(jì)的原理及相應(yīng)的程序設(shè)計(jì)方法,同時(shí)提高編程能力。6、 實(shí)驗(yàn)內(nèi)容 實(shí)現(xiàn)求n!的極小語言的詞法分析程序,返回二元式作為輸出。七、實(shí)驗(yàn)器材(設(shè)備、元器件)1. 操作系統(tǒng):Windows XP2. 開發(fā)工具:VC6.03. 普通PC即可8、 實(shí)驗(yàn)步驟 (1)啟動(dòng)VC6.0,創(chuàng)建空白工程項(xiàng)目。選擇菜單中的“文件”->“新建”->“項(xiàng)目”,在彈出的對(duì)話框中,左邊的“項(xiàng)目類型”框中,選擇“Visual C+ 項(xiàng)目”,在右邊框中,選擇“空項(xiàng)目(.Net)”,在對(duì)話框下邊,選擇工程文件存放目錄及輸入名稱,如Example1,單擊“確定”。(2)建立相應(yīng)的單詞符號(hào)與種別對(duì)照表;(3)根據(jù)狀態(tài)轉(zhuǎn)換圖
3、編寫相應(yīng)的處理函數(shù);(4)完成詞法分析器;(5)編譯與調(diào)試以上程序;(6)生成相應(yīng)的*.dyd文件,作為后面語法分析的輸入文件。9、 實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析 可以對(duì)源程序進(jìn)行詞法分析,如果有錯(cuò)給出出錯(cuò)信息和所在行數(shù),如果無錯(cuò)則生成二元式文件。10、 實(shí)驗(yàn)結(jié)論 本實(shí)驗(yàn)程序較好地完成了詞法分析程序的設(shè)計(jì)與實(shí)現(xiàn),能夠?qū)λo文法的程序進(jìn)行詞法分析,在沒有詞法錯(cuò)誤的時(shí)候生成相應(yīng)的二元式文件。該實(shí)驗(yàn)程序可一次性給出源程序中的詞法錯(cuò)誤。十一、總結(jié)及心得體會(huì) 通過該實(shí)驗(yàn),對(duì)詞法分析程序的設(shè)計(jì),以及運(yùn)用C語言進(jìn)行編程有了更深刻的理解,同時(shí)加深了自己對(duì)詞法分析程序的原理的理解與掌握,提高了自己的動(dòng)手能力。十二、對(duì)本實(shí)
4、驗(yàn)過程及方法、手段的改進(jìn)建議程序設(shè)計(jì)合理,代碼可進(jìn)一步優(yōu)化。 報(bào)告評(píng)分:指導(dǎo)教師簽字:本實(shí)驗(yàn)參考源代碼如下:#include <string>#include <iostream>#include <stdio.h>using namespace std;char ch,cache;bool retracted,ended;int num,cur_line;string token;void clear_output()freopen("example.dyd","w",stdout);fclose(stdout);f
5、reopen("LexAnalyze.err","w",stdout);fclose(stdout);struct pair_valstring s;int val;void getnbc()if (retracted)ch=cache;retracted=false;else ch=getchar();while (ch=' '|ch='n')if (ch='n')printf("%16s 24n","EOLN");cur_line+;ch=getchar();vo
6、id concat()token+=ch;bool letter()if (ch>='A'&&ch<='Z') return true;if (ch>='a'&&ch<='z') return true;return false;bool digit()if (ch>='0'&&ch<='9') return true;return false;void retract()retracted=true;cache=c
7、h;int reserve()if (token="begin") return 1; if (token="end") return 2; if (token="integer") return 3;if (token="if") return 4;if (token="then") return 5;if (token="else") return 6;if (token="function") return 7;if (token="rea
8、d") return 8;if (token="write") return 9;return 0;void return_val(pair_val v)freopen("example.dyd","a+",stdout);while (v.s.length()<16) v.s=' '+v.s;cout<<v.s<<' 'printf("%2dn",v.val);if (!(retracted&&cache!='
9、9;&&cache!='n')getnbc();if (ch=EOF)printf("%16s 25n","EOF");ended=true;retract();fclose(stdout);void error(int type)freopen("LexAnalyze.err","a+",stdout);printf("*LINE%d: ",cur_line);if (type=0) printf("illegal operatorn");e
10、lse printf("unknown charactern");fclose(stdout);void LexAnalyze()pair_val ret;token=""getnbc();switch(ch) case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j&
11、#39;: case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case &
12、#39;A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q':
13、case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z':while (letter()|digit()concat();ch=getchar();retract();num=reserve();if (num!=0)ret.s=token;ret.val=num;return_val(ret);elseret.s=token;ret
14、.val=10;return_val(ret);break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':while (digit()concat();ch=getchar();retract();ret.s=token;ret.val=11;return_val(ret);break;case '
15、;=':ret.s="="ret.val=12;return_val(ret);case '<':ch=getchar();if (ch='>')ret.s="<>"ret.val=13;return_val(ret);else if (ch='=')ret.s="<="ret.val=14;return_val(ret);elseretract();ret.s="<"ret.val=15;return_val(ret);b
16、reak;case '>':ch=getchar();if (ch='=')ret.s=">="ret.val=16;return_val(ret);elseretract();ret.s=">"ret.val=17;return_val(ret);break;case '-':ret.s="-"ret.val=18;return_val(ret);break;case '*':ret.s="*"ret.val=19;return_v
17、al(ret);break;case ':':ch=getchar();if (ch='=')ret.s=":="ret.val=20;return_val(ret);else error(0);break;case '(':ret.s="("ret.val=21;return_val(ret);break;case ')':ret.s=")"ret.val=22;return_val(ret);break;case '':ret.s="&quo
18、t;ret.val=23;return_val(ret);break;default:error(1);int main()freopen("example.pas","r",stdin);clear_output();retracted=ended=false;cur_line=1;while (!ended)LexAnalyze(); return 0;電 子 科 技 大 學(xué)實(shí) 驗(yàn) 報(bào) 告學(xué)生姓名: 學(xué) 號(hào): 指導(dǎo)教師:實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)時(shí)間:一、實(shí)驗(yàn)室名稱:計(jì)算機(jī)學(xué)院軟件工程實(shí)驗(yàn)室二、實(shí)驗(yàn)項(xiàng)目名稱:遞歸下降分析器的設(shè)計(jì)與實(shí)現(xiàn)三、實(shí)驗(yàn)學(xué)時(shí):12學(xué)時(shí)四、
19、實(shí)驗(yàn)原理1.語法分析是對(duì)源程序經(jīng)過詞法分析后轉(zhuǎn)換成的單詞流按方法規(guī)則進(jìn)行判斷,對(duì)能構(gòu)成正確句子的單詞流,給出相應(yīng)的語法樹;對(duì)不能構(gòu)成正確句子的單詞流判斷其語法錯(cuò)誤并做出相應(yīng)處理。2.語法分析方法有自上而下和自下而上的分析方法。在不含左遞歸的文法G中,如果對(duì)每一個(gè)非終結(jié)符的所有候選式的第一個(gè)終結(jié)符都是兩兩不相交的(即無公共左因子),則可能構(gòu)造出一個(gè)不帶回溯的自上而下的分析程序,這個(gè)分析程序由一組遞歸過程組成,每個(gè)過程對(duì)應(yīng)文法的一個(gè)非終結(jié)符。這樣的分析程序稱為遞歸下降分析程序。7、 實(shí)驗(yàn)?zāi)康?通過設(shè)計(jì)遞歸下降分析器的設(shè)計(jì)與實(shí)現(xiàn)實(shí)驗(yàn),使同學(xué)們掌握自上而下的遞歸分析法的語法分析原理和程序設(shè)計(jì)方法。8、
20、 實(shí)驗(yàn)內(nèi)容根據(jù)給定的方法,編寫相應(yīng)的遞歸下降的語法分析程序,實(shí)現(xiàn)對(duì)詞法分析后的單詞序列的語法檢查和程序結(jié)構(gòu)的分析,生成相應(yīng)的變量名表和過程名表,并將編譯中語法檢查出來的錯(cuò)誤寫入相應(yīng)的文件。語法錯(cuò)分類: (1)缺少符號(hào)錯(cuò); (2)符號(hào)匹配錯(cuò) (3)符號(hào)無定義或重復(fù)定義。七、實(shí)驗(yàn)器材(設(shè)備、元器件)1.操作系統(tǒng):Windows XP2.開發(fā)工具:VC6.03.普通PC即可10、 實(shí)驗(yàn)步驟 (1)啟動(dòng)VC6.0,創(chuàng)建空白工程項(xiàng)目。選擇菜單中的“文件”->“新建”->“項(xiàng)目”,在彈出的對(duì)話框中,左邊的“項(xiàng)目類型”框中,選擇“Visual C+ 項(xiàng)目”,在右邊框中,選擇“空項(xiàng)目(.Net)”
21、,在對(duì)話框下邊,選擇工程文件存放目錄及輸入名稱,如Example1,單擊“確定”。(2)消除文法中的左遞歸;(3)實(shí)現(xiàn)對(duì)方法進(jìn)行遞歸向下的分析過程;(4)利用詞法分析器生成的二元式文件*.dyd進(jìn)行語法分析;(5)編譯與調(diào)試以上程序;11、 實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析 可以對(duì)源程序進(jìn)行語法分析,圖中給出了出錯(cuò)行數(shù)及出錯(cuò)類型。11、 實(shí)驗(yàn)結(jié)論 本實(shí)驗(yàn)程序較好地完成了遞歸下降分析器的設(shè)計(jì)與實(shí)現(xiàn),能夠?qū)λo文法的程序進(jìn)行語法分析,生成變量名表和過程名表,如果源程序有語法錯(cuò)誤則給出出錯(cuò)類型及所在行數(shù)。十一、總結(jié)及心得體會(huì) 通過該實(shí)驗(yàn),對(duì)遞歸下降分析程序的設(shè)計(jì),以及運(yùn)用C語言進(jìn)行編程有了更深刻的理解,同時(shí)加深了
22、自己對(duì)語法分析程序的原理的理解與掌握,提高了自己的動(dòng)手能力。十二、對(duì)本實(shí)驗(yàn)過程及方法、手段的改進(jìn)建議程序設(shè)計(jì)合理,代碼可進(jìn)一步優(yōu)化。 報(bào)告評(píng)分:指導(dǎo)教師簽字:本實(shí)驗(yàn)參考源代碼如下:#include <vector>#include <string>#include <iostream>#include <stdio.h>using namespace std;struct variable string vname,vproc,vtype; int vkind,vlev,vadr; var;struct procedure string pnam
23、e,ptype; int plev,fadr,ladr; proc;vector <variable> v_table;vector <procedure> p_table;string sym;int val,cur_line,cur_level;bool ended=false;void clean_output() freopen("example.dys","w",stdout); fclose(stdout); freopen("example.var","w",stdout);
24、fclose(stdout); freopen("","w",stdout); fclose(stdout); freopen("SynAnalyze.err","w",stdout); fclose(stdout);void advance() freopen("example.dys","a+",stdout); cin>>sym>>val; printf("%16s %2dn",sym.c_str(),v
25、al); if (sym="EOF") ended=true; while(sym="EOLN") cur_line+; cin>>sym>>val; printf("%16s %2dn",sym.c_str(),val); void error(int type) freopen("SynAnalyze.err","a+",stdout); switch(type) case 0: printf("LINE %d: variable "%s"
26、; previously declared.n",cur_line,sym.c_str();break; case 1: printf("LINE %d: missing declaration here.n",cur_line);break; case 2: printf("LINE %d: missing executive statement here.n",cur_line);break; case 3: printf("LINE %d: expected "end" here.n",cur_li
27、ne);break; case 4: printf("LINE %d: expected "begin" here.n",cur_line);break; case 5: printf("LINE %d: missing '' here.n",cur_line);break; case 6: printf("LINE %d: brackets doesn't matched.n",cur_line);break; case 7: printf("LINE %d: illegal v
28、ariable here.n",cur_line);break; case 8: printf("LINE %d: missing '(' here.n",cur_line);break; case 9: printf("LINE %d: illegal declaration here.n",cur_line);break; case 10: printf("LINE %d: illegal executive statement here.n",cur_line);break; case 11: prin
29、tf("LINE %d: variable "%s" undeclared.n",cur_line,sym.c_str();break; case 12: printf("LINE %d: missing "else" here.n",cur_line);break; case 13: printf("LINE %d: missing "then" here.n",cur_line);break; case 14: printf("LINE %d: illegal
30、operator here.n",cur_line);break; default: printf("LINE %d: unknown errorn",cur_line); advance(); fclose(stdout);void init() clean_output(); val,cur_line=1; cur_level=0; v_table.clear(); p_table.clear(); proc.pname="" proc.ptype="" proc.plev=0; proc.fadr=0; proc.la
31、dr=-1; p_table.push_back(proc); return;void v_add(int vkind) for (int i=p_tablecur_level.fadr;i<=p_tablecur_level.ladr;i+) if (v_tablei.vname=sym && v_tablei.vlev=cur_level && v_tablei.vkind=vkind) error(0); return; var.vname=sym; var.vproc=p_tablecur_level.pname; var.vtype="
32、integer" var.vkind=vkind; var.vlev=cur_level; var.vadr=v_table.size(); v_table.push_back(var); p_tablecur_level.ladr+;bool v_check() for (int i=p_tablecur_level.fadr;i<=p_tablecur_level.ladr;i+) if (v_tablei.vname=sym && v_tablei.vlev=cur_level) return true; return false;void A();voi
33、d B();void C();void D();void E();void F();void G();void H();void I();void J();void A() if (sym="begin") advance(); if (sym="integer") advance(); B(); else error(1); if (sym="") while (sym="") advance(); if (sym="integer") advance(); B(); else break;
34、else error(2); C(); while (sym="") advance(); C(); if (sym="end") advance(); return; else error(3); else error(4);void B() if (val=10) v_add(0);/加入變量 advance(); else if (sym="function") advance(); if (val=10) advance(); proc.pname=sym; cur_level+; proc.ptype="integ
35、er" proc.plev=cur_level; proc.fadr=v_table.size(); proc.ladr=v_table.size()-1; p_table.push_back(proc); if (sym="(") advance(); if (val=10) v_add(1);/加入形參 advance(); if (sym=")") advance(); if (sym="") advance(); A(); cur_level-; else error(5); else error(6); else error(7); els
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋買賣合同格式模板
- 2024舞蹈教室租賃合同樣本
- 2024年家庭居室裝修工程協(xié)議
- 年西安市設(shè)備技術(shù)轉(zhuǎn)讓合同樣本-合同范本
- 2024工程建設(shè)招標(biāo)投標(biāo)協(xié)議合同范本
- 簡(jiǎn)約技術(shù)專利權(quán)轉(zhuǎn)讓合同
- 2024公司股份轉(zhuǎn)讓合同股份轉(zhuǎn)讓后可以毀約
- 2024年車輛礦石運(yùn)輸合同范本
- 廢料回收權(quán)轉(zhuǎn)讓協(xié)議
- 公司流動(dòng)資金借款合同
- 推拿手法完整版本
- 運(yùn)動(dòng)與健康(山東大學(xué))學(xué)堂云網(wǎng)課答案
- 五育并舉-同心筑夢(mèng)家長(zhǎng)會(huì)課件
- 物業(yè)工程能耗管控方案
- 2024年北京京能清潔能源電力股份有限公司招聘筆試參考題庫含答案解析
- 數(shù)字孿生應(yīng)用技術(shù)員職業(yè)技能競(jìng)賽試題及答案
- 帕金森病機(jī)制
- 2024航空工業(yè)集團(tuán)校園招聘筆試參考題庫附帶答案詳解
- 《中藥鑒定技術(shù)》課件-甘草的鑒定
- 燃?xì)庋簿€員專業(yè)知識(shí)考試題庫(附答案)
- 《如何做一名好教師》課件
評(píng)論
0/150
提交評(píng)論