實(shí)驗(yàn)報(bào)告一編寫詞法分析程序_第1頁(yè)
實(shí)驗(yàn)報(bào)告一編寫詞法分析程序_第2頁(yè)
實(shí)驗(yàn)報(bào)告一編寫詞法分析程序_第3頁(yè)
實(shí)驗(yàn)報(bào)告一編寫詞法分析程序_第4頁(yè)
實(shí)驗(yàn)報(bào)告一編寫詞法分析程序_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上編譯原理實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱: 編寫詞法分析程序_實(shí)驗(yàn)類型: 設(shè)計(jì)型實(shí)驗(yàn) 指導(dǎo)教師: 專業(yè)班級(jí): 姓 名: 學(xué) 號(hào): 實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)成績(jī): 日期: 2017年 4月 15日實(shí)驗(yàn)一 編寫語(yǔ)法分析程序一、 實(shí)驗(yàn)?zāi)康?) 通過設(shè)計(jì)、調(diào)試詞法分析程序,掌握詞法分析程序的設(shè)計(jì)工具,即有窮自動(dòng)機(jī),進(jìn)一步理解自動(dòng)機(jī)理論;2) 掌握正則文法和正則表達(dá)式轉(zhuǎn)換成有窮自動(dòng)機(jī)的方法及有窮自動(dòng)機(jī)的實(shí)現(xiàn)方法;3) 會(huì)確定詞法分析程序的輸出形式及標(biāo)識(shí)符與關(guān)鍵字的區(qū)分方法;4) 加深對(duì)課堂教學(xué)的理解,提高詞法分析方法的實(shí)踐能力,掌握使用實(shí)驗(yàn)環(huán)境的技能技巧以及程序的調(diào)試方法。二、實(shí)驗(yàn)設(shè)計(jì)1、寫出TEST

2、語(yǔ)言每條詞法規(guī)則對(duì)應(yīng)的正則文法或者正則表達(dá)式1) 標(biāo)識(shí)符:字母打頭,后接任意字母或數(shù)字。正則表達(dá)式:( a|b|z|A|B|Z )( 0|1|9| a|b|z|A|B|Z )*2) 保留字:標(biāo)符的子集,包括:if, else, for, while, do, int, write, read。正則表達(dá)式: if | else | for | while | do | int | write | read3) 無(wú)符號(hào)整數(shù):由數(shù)字組成,但最高位不能為0,允許一位的0。正則表達(dá)式:( (1|9 )( 0|1|9)* )|04) 分界符:(、)、;、正則表達(dá)式:( | ) | ; | | 5) 運(yùn)算符

3、:+、-、*、/、=、<、>、>=、<=、!=、=正則表達(dá)式:+ | - | * | / | = | < | > | >= | <= | != | =6) 注釋符:/* */正則表達(dá)式:/*(沒有連續(xù)的*/的任意字符串|)*/2、對(duì)每個(gè)文法或者正則表達(dá)式分別構(gòu)造NFA1) 標(biāo)識(shí)符: ( a|b|z|A|B|Z )( 0|1|9| a|b|z|A|B|Z )*2) 無(wú)符號(hào)整數(shù):( (1|2|9 )( 0|1|9)* )|03) 分界符:( | ) | ; | | 4) 運(yùn)算符:+ | - | * | / | = | < | > | &g

4、t;= | <= | != | =5) 注釋符:/*(沒有連續(xù)的*/的任意字符串|)*/3、將NFA合并,確定化,化簡(jiǎn)得到最終的DFA。NFA:DFA:三、實(shí)驗(yàn)過程1、完成整個(gè)實(shí)驗(yàn)的先后步驟a) 根據(jù)TEST語(yǔ)言的詞法規(guī)則,分別寫出每條規(guī)則的正則文法或者正則表達(dá)式;b) 將每一個(gè)正則文法或者正則表達(dá)式轉(zhuǎn)換為NFA;c) 將多個(gè)NFA合并后進(jìn)行確定化并化簡(jiǎn);d) 根據(jù)化簡(jiǎn)后的DFA畫出流程圖;e) 參閱教材PP.69-71的TEST語(yǔ)言語(yǔ)法規(guī)則,確定單詞分類、單詞輸出方案;f) 編寫詞法分析程序;g) 對(duì)下面的TEST語(yǔ)言源程序進(jìn)行詞法分析,將合法單詞存入lex.txt,并報(bào)告詞法錯(cuò)誤及其

5、位置。注:不能修改源程序/*This a test program.*/int abc;int 123;int A$;int i;int n;int b,c;int 2a;int a2;read n;n = ;for (i=1;i<=n; i= i+1) abc=abc+i;if(i!=n) n = n+i;if (!n) b = b+c;/*The loop endedwrite abc;2、實(shí)驗(yàn)調(diào)試記錄(問題表現(xiàn),分析原因,解決方案,解決結(jié)果)a) 問題表現(xiàn):1 不能處理除號(hào)2 不能處理不完整的注釋符3 對(duì)于”0123” 這類字符串的處理不正確,我之前處理為直接報(bào)錯(cuò)說(shuō)一位以上的數(shù)字首

6、位不能為0b) 分析原因:問題1,2的原因都是在“/”符號(hào)處理時(shí)出現(xiàn)的問題導(dǎo)致的,程序中出現(xiàn)bug使得一遇到/就會(huì)進(jìn)入死循環(huán)。問題3 ,不應(yīng)該直接報(bào)錯(cuò)說(shuō)一位以上的數(shù)字首位不能為0,遇到0應(yīng)該直接輸出0這個(gè)單詞,再接著讀數(shù)字。c) 解決方案:d) 對(duì)于問題1,2,重新梳理邏輯,一步一步對(duì)照流程圖和DFA來(lái)調(diào)試修改代碼。對(duì)于問題3,遇到0應(yīng)該直接輸出0這個(gè)單詞,再接著讀數(shù)字。e) 解決結(jié)果:成功解決了程序遇到/進(jìn)入死循環(huán)問題和“0123”這類字符串的處理。三、實(shí)驗(yàn)結(jié)果列出實(shí)驗(yàn)結(jié)果并進(jìn)行分析(含分步測(cè)試結(jié)果)。lex.txt文件(存放編譯的合法內(nèi)容)內(nèi)容:12/*This a test progra

7、m.*/*This a test program.*/3intint3IDabc3;4intint4NUM1234;5intint5IDA5;6intint6IDi6;7intint7IDn7;8intint8IDb8IDc8;9intint9NUM29IDa9;10intint10IDa210;11readread11IDn11;12IDn12=12NUM012NUM1234512;13forfor13(13IDi13=13NUM113;13IDi13<=<=13IDn13;13IDi13=13IDi13+13NUM113)1415IDabc15=15IDabc15+15IDi1

8、5;1617ifif17(17IDi17!=!=17IDn17)17IDn17=17IDn17+17IDi17;18ifif18(18IDn18)18IDb18=18IDb18+18IDc18;四、討論與分析1. 你的編寫詞法分析程序滿足最長(zhǎng)匹配原則嗎?如果滿足請(qǐng)給出你的實(shí)現(xiàn)方案。如果不滿足請(qǐng)給出改進(jìn)方案。答:不滿足,我的處理先后順序是:標(biāo)識(shí)符或保留字、數(shù)字、分界符、運(yùn)算符(除開/)、除或者注釋,我應(yīng)該吧注釋放在前面,因?yàn)橐话銇?lái)說(shuō)注釋都比其它類型符號(hào)長(zhǎng)些。改進(jìn)措施便是將注釋這一條詞法規(guī)則最早處理。2. 給出你的單詞分類方案,并說(shuō)明理由。答:根據(jù)TEST語(yǔ)言可將單詞分為六類:a) 標(biāo)識(shí)符:字母打

9、頭,后接任意字母或數(shù)字。b) 保留字:標(biāo)識(shí)符的子集,包括:if, else, for, while, do, int, write, read。c) 無(wú)符號(hào)整數(shù):由數(shù)字組成,但最高位不能為0,允許一位的0。d) 分界符:(、)、;、e) 運(yùn)算符:+、-、*、/、=、<、>、>=、<=、!=、=f) 注釋符:/* */3. 構(gòu)建詞法分析程序一般過程是怎樣的?答:構(gòu)建詞法分析程序的一般過程:1、 根據(jù)詞法規(guī)則寫出正則文法或者正則文法。2、 為每一個(gè)正則表達(dá)式構(gòu)造一個(gè)NFA,然后將多個(gè)NFA合并為一個(gè)NFA3、 將NFA轉(zhuǎn)化成DFA,并且化簡(jiǎn)最小化DFA4、 確定單詞的輸出形

10、式5、 根據(jù)化簡(jiǎn)后的DFA和單詞輸出程序構(gòu)造詞法分析程序(主要部分:通過實(shí)驗(yàn)對(duì)課程知識(shí)點(diǎn)的理解;回答實(shí)驗(yàn)指導(dǎo)書的實(shí)驗(yàn)思考提出的問題等)五、附錄:關(guān)鍵代碼(給出適當(dāng)注釋,可讀性高)# include <iostream># include <fstream># include <stdio.h># include <stdlib.h># include <string>using namespace std;const int KWN=8; /關(guān)鍵字的個(gè)數(shù)const int MAXSIZE=400; /標(biāo)識(shí)符最長(zhǎng)個(gè)數(shù)char kword

11、KWN10 = /關(guān)鍵字"if", "else","for","while","do","int","read","write" int line = 1; /行號(hào)int errors = 0; /記錄錯(cuò)誤個(gè)數(shù)ofstream fout; /輸出文件流ifstream fin; /輸入文件流ofstream lexout; /存放合法單詞的文件流char type630="ID","保 留 字",

12、"NUM","分 界 符","運(yùn) 算 符","注 釋 符"int main()int TEST(); /函數(shù)聲明TEST();if(errors=0)cout<<"編譯成功。"<<endl;elsecout<<"編譯失敗。共發(fā)現(xiàn)"<<errors<<"個(gè)錯(cuò)誤!"<<endl;return 0;/判斷是否為字母int is_Char(char ch)if (ch>='a&#

13、39;&&ch<='z')|(ch>='A'&&ch<='Z')return 1;return 0;/判斷是否為無(wú)符號(hào)整數(shù)int is_Uint(char ch)if('0'<=ch&&ch<='9')return 1;return 0;/判斷是否為分界符int is_Deli(char ch)if(ch='('|ch=')'|ch=''|ch=''|ch=''

14、;)return 1; return 0;/判斷是否為操作符int is_Oper(char ch)char Operater10="+-*!=><"/沒有考慮/號(hào)for(int i=0;i<8;i+)if(ch=Operateri)return 1;return 0;/輸入控制int in(char &ch)fin.get(ch);if('n'=ch)line+;if(fin.eof()ch=EOF;return 1;/輸出控制void out(char *type,char *buf)if(strcmp(type,"I

15、D")=0|strcmp(type,"NUM")=0)lexout<<line<<""<<type<<""<<buf<<endl;elselexout<<line<<""<<buf<<""<<buf<<endl;/cout<<type<<":"<<buf<<endl;/編譯程序

16、主要的函數(shù)int TEST()int event=0; /用于判斷輸入是否為文件末/char filename300; /存儲(chǔ)文件的路徑/打開文件的操作/打開編譯程序存放合法單詞的文件lexout.open("lex.txt");/打開用戶的文件/cout<<"請(qǐng)輸入要編譯的文件的路徑:"<<endl;reinput_in:/cin.get(filename,300,'n');/char filename300="D:SoftwareMicrosoft Visual C+ 6.0Microsoft Vis

17、ual StudioMyProjects編譯原理實(shí)驗(yàn)一in.txt"fin.open("in.txt");if(fin=NULL)cout<<"文件打開失敗,請(qǐng)重新輸入文件路徑:"<<endl;goto reinput_in;/cout<<"請(qǐng)輸入詞法分析結(jié)果文件存儲(chǔ)路徑:"<<endl;reinput_out:cin.clear(); /清理輸出緩沖cin.sync(); /清空流/cin.get(filename,300,'n');/char filenam

18、e300="D:SoftwareMicrosoft Visual C+ 6.0Microsoft Visual StudioMyProjects編譯原理實(shí)驗(yàn)一out.txt"fout.open("out.txt");if(fout=NULL)cout<<"文件打開失敗,請(qǐng)重新輸入文件路徑:"<<endl;goto reinput_out;/開始判斷char buf300;char ch;cin.clear(); /清理輸出緩沖cin.sync(); /清空流in(ch);while (!fin.eof()whi

19、le(ch=' '|ch='n'|ch='t'|ch='r')in(ch);/判斷是否為標(biāo)識(shí)符或保留字if(is_Char(ch)int t=0;while(is_Char(ch)buft+=ch;in(ch);buft='0'/判斷保留字int j=0;for(;j<KWN;j+)if(strcmp(kwordj,buf)=0)out(type1,buf);break;/ID 標(biāo)識(shí)符if(j>=KWN)while(is_Char(ch)|is_Uint(ch)buft+=ch;in(ch);buft=

20、'0'out(type0,buf);/判斷是否為數(shù)字 else if(is_Uint(ch)int t=0;while(is_Uint(ch)buft+=ch;in(ch);buft='0'if(t=1)out(type2,buf);else if(buf0='0')int i=-1;while(i<t&&buf+i='0')out(type2,&"0");out(type2,buf+i);elseout(type2,buf);/判斷是否為分界符 else if(is_Deli(c

21、h)buf0=ch;buf1='0'out(type3,buf);in(ch);/判斷是否為運(yùn)算符(除開/) else if(is_Oper(ch)if(ch='+'|ch='-'|ch='*')buf0=ch;buf1='0'out(type4,buf);in(ch);else if(ch='!')buf0=ch;in(ch);if(ch='=')buf1=ch;buf2='0'out(type4,buf);in(ch);elsecout<<"

22、error"<<+errors<<" line"<<line<<":'!'不合法的符號(hào)!"<<endl;else if(ch='>'|ch='<'|ch='=')buf0=ch;in(ch);if(ch='=')buf1=ch;buf2='0'out(type4,buf);in(ch);elsebuf1='0'out(type4,buf);else if(ch=&

23、#39;/')/判斷是除還是注釋int t=0;buft+=ch;char ch0 ;in(ch0);while(1)if(ch0 = EOF)cout<<"error"<<+errors<<" line"<<line<<": 匹配錯(cuò)誤,缺少*/"<<endl;break;ch = ch0;buft+=ch;in(ch0);if(ch ='*' && ch0 = '/')buft+=ch0;buft='0'out(type5,buf);break;in(ch);elsecout<<"error"<<+errors<<" line"<<line<<": '"&

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論