實驗報告一編寫詞法分析程序_第1頁
實驗報告一編寫詞法分析程序_第2頁
實驗報告一編寫詞法分析程序_第3頁
實驗報告一編寫詞法分析程序_第4頁
實驗報告一編寫詞法分析程序_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、語言每條詞法規(guī)則對應(yīng)的正則文法或者正則表達式1) 標(biāo)識符:字母打頭,后接任意字母或數(shù)字。正則表達式:( 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。正則表達式: if | else | for | while | do | int | write | read3) 無符號整數(shù):由數(shù)字組成,但最高位不能為0,允許一位的0。正則表達式:( (1|9 )( 0|1|9)* )|04) 分界符:(、)、;、正則表達式:( | ) | ; | | 5) 運算符

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

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

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、實驗調(diào)試記錄(問題表現(xiàn),分析原因,解決方案,解決結(jié)果)a) 問題表現(xiàn):1 不能處理除號2 不能處理不完整的注釋符3 對于”0123” 這類字符串的處理不正確,我之前處理為直接報錯說一位以上的數(shù)字首

6、位不能為0b) 分析原因:問題1,2的原因都是在“/”符號處理時出現(xiàn)的問題導(dǎo)致的,程序中出現(xiàn)bug使得一遇到/就會進入死循環(huán)。問題3 ,不應(yīng)該直接報錯說一位以上的數(shù)字首位不能為0,遇到0應(yīng)該直接輸出0這個單詞,再接著讀數(shù)字。c) 解決方案:d) 對于問題1,2,重新梳理邏輯,一步一步對照流程圖和DFA來調(diào)試修改代碼。對于問題3,遇到0應(yīng)該直接輸出0這個單詞,再接著讀數(shù)字。e) 解決結(jié)果:成功解決了程序遇到/進入死循環(huán)問題和“0123”這類字符串的處理。三、實驗結(jié)果列出實驗結(jié)果并進行分析(含分步測試結(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. 你的編寫詞法分析程序滿足最長匹配原則嗎?如果滿足請給出你的實現(xiàn)方案。如果不滿足請給出改進方案。答:不滿足,我的處理先后順序是:標(biāo)識符或保留字、數(shù)字、分界符、運算符(除開/)、除或者注釋,我應(yīng)該吧注釋放在前面,因為一般來說注釋都比其它類型符號長些。改進措施便是將注釋這一條詞法規(guī)則最早處理。2. 給出你的單詞分類方案,并說明理由。答:根據(jù)TEST語言可將單詞分為六類:a) 標(biāo)識符:字母打

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

10、式5、 根據(jù)化簡后的DFA和單詞輸出程序構(gòu)造詞法分析程序(主要部分:通過實驗對課程知識點的理解;回答實驗指導(dǎo)書的實驗思考提出的問題等)五、附錄:關(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)鍵字的個數(shù)const int MAXSIZE=400; /標(biāo)識符最長個數(shù)char kword

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

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

13、39;&&ch<='z')|(ch>='A'&&ch<='Z')return 1;return 0;/判斷是否為無符號整數(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="+-*!=><"/沒有考慮/號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; /存儲文件的路徑/打開文件的操作/打開編譯程序存放合法單詞的文件lexout.open("lex.txt");/打開用戶的文件/cout<<"請輸入要編譯的文件的路徑:"<<endl;reinput_in:/cin.get(filename,300,'n');/char filename300="D:SoftwareMicrosoft Visual C+ 6.0Microsoft Vis

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

18、e300="D:SoftwareMicrosoft Visual C+ 6.0Microsoft Visual StudioMyProjects編譯原理實驗一out.txt"fout.open("out.txt");if(fout=NULL)cout<<"文件打開失敗,請重新輸入文件路徑:"<<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)識符或保留字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)識符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);/判斷是否為運算符(除開/) 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<<":'!'不合法的符號!"<<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<<": 匹配錯誤,缺少*/"<<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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論