詞法分析設(shè)計(jì)實(shí)驗(yàn)報告(附代碼)_第1頁
詞法分析設(shè)計(jì)實(shí)驗(yàn)報告(附代碼)_第2頁
詞法分析設(shè)計(jì)實(shí)驗(yàn)報告(附代碼)_第3頁
詞法分析設(shè)計(jì)實(shí)驗(yàn)報告(附代碼)_第4頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、專業(yè)資料實(shí)驗(yàn)一詞法分析設(shè)計(jì)實(shí)驗(yàn)學(xué)時: 4實(shí)驗(yàn)類型:綜合實(shí)驗(yàn)要求:必修一、實(shí)驗(yàn)?zāi)康耐ㄟ^本實(shí)驗(yàn)的編程實(shí)踐, 使學(xué)生了解詞法分析的任務(wù), 掌握詞法分析程序設(shè)計(jì)的原理和構(gòu)造方法, 使學(xué)生對編譯的基本概念、 原理和方法有完整的和清楚的理解,并能正確地、熟練地運(yùn)用。二、實(shí)驗(yàn)內(nèi)容用 VC+/VB/JAVA語言實(shí)現(xiàn)對 C 語言子集的源程序進(jìn)行詞法分析。通過輸入源程序從左到右對字符串進(jìn)行掃描和分解, 依次輸出各個單詞的內(nèi)部編碼及單詞符號自身值; 若遇到錯誤則顯示“ Error ”, 然后跳過錯誤部分繼續(xù)顯示 ;同時進(jìn)行標(biāo)識符登記符號表的管理。以下是實(shí)現(xiàn)詞法分析設(shè)計(jì)的主要工作:( 1)從源程序文件中讀入字符。(

2、2)統(tǒng)計(jì)行數(shù)和列數(shù)用于錯誤單詞的定位。( 3)刪除空格類字符,包括回車、制表符空格。( 4)按拼寫單詞,并用(內(nèi)碼,屬性)二元式表示。( 屬性值 token 的機(jī)內(nèi)表示 )( 5)如果發(fā)現(xiàn)錯誤則報告出錯( 6)根據(jù)需要是否填寫標(biāo)識符表供以后各階段使用 。單詞的基本分類:關(guān)鍵字:由程序語言定義的具有固定意義的標(biāo)識符。也稱為保留字例如if 、for、while 、printf;單詞種別碼為 1。標(biāo)識符:用以表示各種名字,如變量名、數(shù)組名、函數(shù)名;常數(shù): 任何數(shù)值常數(shù)。如 125, 1,0.5,3.1416 ;運(yùn)算符: +、- 、* 、/ ;關(guān)系運(yùn)算符: 、 、=、 ;分界符:; 、, 、(、) 、

3、 、 ;三、實(shí)驗(yàn)要求1、編程時注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。2、將標(biāo)識符填寫的相應(yīng)符號表須提供給編譯程序的以后各階段使用。3、根據(jù)測試數(shù)據(jù)進(jìn)行測試。測試實(shí)例應(yīng)包括以下三個部分:全部合法的輸入。各種組合的非法輸入。由記號組成的句子。WORD完美格式下載可編輯專業(yè)資料4、詞法分析程序設(shè)計(jì)要求輸出形式:例:輸入 VC+語言的實(shí)例程序:If i=0 thenn+;a= 3b %);輸出形式為:單詞二元序列類 型位置(行,列)(單詞種別,單詞屬性)for(1,for )關(guān)鍵字(1,1)i( 6,i )標(biāo)識符(1,2)=( 4, = )關(guān)系運(yùn)算符(1,3)0( 5, 0 )常數(shù)(1,

4、4)then( 1, then)關(guān)鍵字(1,5)n(6,n )標(biāo)識符(1,6)+ErrorError( 1,7);(2,;)分界符(1,8)a(6,a )標(biāo)識符(2,1) =(4,= )關(guān)系運(yùn)算符(2,2)3bErrorError( 2,4)%ErrorError(2,4))(2,)分界符(2,5);(2,;)分界符(2,6)實(shí)驗(yàn)報告正文 :功能描述:該程序具有詞法分析功能, 即面對一段程序源代碼, 通過該程序,能檢查出源代碼是否由詞法錯誤。三、詞法分析實(shí)驗(yàn)設(shè)計(jì)思想及算法:首先構(gòu)造六個表,key=auto,break,case,catch,char,class,const,continue,d

5、efault,delete,do,double,else,enum,float,for,if,int,long,new,private,protected,public,register, return,short,static,struct,switch,this,void,while, then; 關(guān)鍵字表 , 單詞種別碼 1;Delimiter=;,(,),.,;分界符表單詞種別碼WORD完美格式下載可編輯專業(yè)資料2Operator=+,-,*,/;算術(shù)運(yùn)算符表單詞種別碼 3R_operators=,=,關(guān)鍵字表 ,單詞種別碼 1;string Number100;常數(shù)表單詞種別碼 5;

6、string Identifier100;標(biāo)示符表單詞種別碼 6;構(gòu)造關(guān)鍵字判斷函數(shù)Iskey(),字母判斷函數(shù) Isletter(),數(shù)字判斷函數(shù)Isnumber();構(gòu)造標(biāo)示符判別函數(shù)InsertId(),若輸入的標(biāo)示符在標(biāo)示符數(shù)組Identifier中,返回其下標(biāo),若不在,將該標(biāo)示符插到數(shù)組末尾。構(gòu)造標(biāo)示符判別函數(shù)InsertNumber(),若輸入的數(shù)字在數(shù)字?jǐn)?shù)組Number 中,返回其下標(biāo),若不在,將該數(shù)字插到數(shù)組末尾。具體分析函數(shù) analyse() 具體實(shí)現(xiàn)輸入源代碼的識別。anaiyse() 構(gòu)造思路,程序設(shè)計(jì)圖:綜合以上分析,畫出整個程序的運(yùn)行分析程序圖,如下:WORD完美格

7、式下載可編輯開始輸入源文件路徑專業(yè)資料路徑是否有效是打開源文件初始化文件指針識別指針內(nèi)容文件結(jié)束?否是空格,空白或換行嗎是跳過該字符指向下一字符回退輸出word為普通標(biāo)示符否是否是字母嗎是將字符加入字符數(shù)組Word指向下一字符是字母惑數(shù)字嗎否將word與關(guān)鍵字表key進(jìn)行匹配否匹配?是輸出word為關(guān)鍵字結(jié)束否是數(shù)字嗎否是界符嗎將字符加是入字符數(shù)將字符組Word加入字符數(shù)組是Word指向下一字符是識別指針內(nèi)容輸出word為界符是數(shù)字嗎否輸出word指向下一字符為常數(shù)將字符加入字符數(shù)否組Word將字符加入字符數(shù)組Word輸出 Word內(nèi)容為不可識別整個程序的運(yùn)行分析程序圖WORD完美格式下載可編

8、輯專業(yè)資料軟件的測試方法和測試結(jié)果:首先,將要分析的源代碼寫入一個文本,存于磁盤中,然后運(yùn)行程序,輸入源代碼文件存放的路徑, 若輸入路徑正確, 程序?qū)⒆詣臃治鲈创a, 若輸入路徑不正確,程序?qū)@示,路徑錯誤,請重新輸入的提示。下面為具體的運(yùn)行實(shí)例:源代碼為: If i=0 thenn+;a= 3b %)輸出滿足要求。實(shí)驗(yàn)總結(jié)(設(shè)計(jì)的特點(diǎn)、不足、收獲與體會) :通過此次實(shí)驗(yàn),讓我了解到如何設(shè)計(jì)、編制并調(diào)試詞法分析程序,熟悉了構(gòu)造詞法分析程序的手工方式的相關(guān)原理, 加深了對編譯原理詞法分析的理解, 本次使用 C+語言直接編寫此法分析程序, 也讓我重新熟悉了 C+語言的相關(guān)內(nèi)容,加深了對 C+語言的

9、用途的理解。本程序的數(shù)據(jù)輸入采取直接從文件中讀取,而不是由鍵盤輸入, 因此在測試過程中, 輸入得到大大簡化, 但是本程序的關(guān)鍵字表只初始化了一部分關(guān)鍵字, 還可繼續(xù)擴(kuò)充 (只需擴(kuò)大數(shù)組, 向其中補(bǔ)充要添加的關(guān)鍵字),而且程序的測試數(shù)據(jù)存在不足,程序可能存在未發(fā)現(xiàn)的漏洞,以上兩點(diǎn)有待改善。WORD完美格式下載可編輯專業(yè)資料附錄該程序的源代碼:#include #includeusing namespace std;/ 數(shù)據(jù)定義#define MAX 33char ch = ;static int line=1,row=0;int NumberCount=0,IdCount=0;stringkey

10、=auto,break,case,catch,char,class,const,continue,default,delete,do,double,else,enum,float,for,if,int,long,new,private,protected,public,register,return,short,static,struct,switch,this,void,while,then;/ 關(guān)鍵字表 單詞種別碼1stringDelimiter=;,(,),.,;/分界符表單詞種別碼2string Operator=+,-,*,/;/算術(shù)運(yùn)算符表單詞種別碼3stringR_operato

11、rs=,=;/ 關(guān)系運(yùn)算符表單詞種別碼4string Number100;/常數(shù)表單詞種別碼5 string Identifier100;/ 標(biāo)示符表 單詞種別碼6/ 數(shù)據(jù)分析int Iskey(string c) / 關(guān)鍵字判斷 int i;for(i=0;iMAX;i+) if(pare(c)=0) return 1;return 0;/ 判斷是否為字母int IsLetter(char c) if(c=a)|(c =A) if(ch=A)ch=ch+32; /轉(zhuǎn)換成小寫return 1;else return 0;int IsNumber(char c)/判斷是否為數(shù)字i

12、f(c=0&c=9) return 1;else return 0;/ 將arr 中的標(biāo)示符插入符號并表且返回符號表的指針int InsertId(string s)for(int i=0;iIdCount;i+)if(Identifieri=s)return i;break;else if(IdCount=i+1)IdentifierIdCount=s;return IdCount;IdCount+;/ 將arr 中的常實(shí)數(shù)插入常數(shù)表并且返回常數(shù)表的指針int InsertNumber(string s)for(int i=0;iNumberCount;i+)if(Numberi=s)ret

13、urn i;break;else if(NumberCount=i+1) NumberNumberCount=s; return NumberCount;NumberCount+;void analyse(FILE *fpin)/arr 相當(dāng)于課本中的strTokenstring arr=;while(ch=fgetc(fpin)!=EOF) / 判斷WORD完美格式下載可編輯專業(yè)資料是否讀取到文件末尾或者讀取出錯arr=;while(IsNumber(ch)/|ch=.&IsNumbeif(ch=r(fgetc(fpin)|ch=t|ch=n)/ 刪除空格類字符,包括回車、制表符空格arr=

14、arr+ch;ch=fgetc(fpin);if(ch=n)line+;if(IsLetter(ch)row=0;while(IsLetter(ch)|IsNumber(ch)else if(IsLetter(ch)arr=arr+ch;ch=fgetc(fpin);while(IsLetter(ch)|IsNumber(ch)fseek(fpin,-1L,SEEK_CUR);arr=arr+ch;row+;ch=fgetc(fpin);tt(line,row)endl;fseek(fpin,-1L,SEEK_CUR);/文件指針回移else一個位置if (Iskey(arr)InsertNu

15、mber(arr);row+; /識別row+; /識別出一出一個字符,列增加一個字符,列增加一coutarrtt( 1,arr)coutarrtt( 5,arr)tttt 關(guān)鍵常數(shù)字tt(line,row)tt(line,row)endl;endl;/處理算符elseelserow+;arr=ch;row+; / 識別出一switch(ch)個字符,列增加一case+:InsertId(arr);ch=fgetc(fpin);if(ch=(|IsNumber(ch)|IsLetter(ch)tt 標(biāo)識符tt(line,row)endl;fseek(fpin,-1L,SEEK_CUR);cou

16、t+tt( 3,+ )tt算術(shù)運(yùn)算符/ 處理常數(shù)tt(line,row)endl;else if(IsNumber(ch)elseWORD完美格式下載可編輯專業(yè)資料coutarr+chttErrorttErrortt 分界符tt(line,row)endl;tt(line,row):ch=fgetc(fpin);if(ch=)cout=)if(ch=(|IsNumber(ch)|IsLetter(ch)tt關(guān)系運(yùn)算符fseek(fpin,-1L,SEEK_CUR);cout-tt(line,row)endl;tt( 3,- )tt算術(shù)運(yùn)算符elsett(line,row)endl;cout )

17、tt 關(guān)系運(yùn)算elsecoutarr+chttErrorttEr符rortt(line,row)endtt(line,row)endl;l;break;fseek(fpin,-1L,SEEK_CUR);break;case* :cout-tt( 3,*)ttcase:ch=fgetc(fpin);算術(shù)運(yùn)算符tt(line,row)endl;if(ch=)cout=tt( 4,=)case= :tt關(guān)系運(yùn)算符ch=fgetc(fpin);t(line,row)endl;if(ch=)elsecout=tt( 4,=)couttt( 4,)算符tt關(guān)系運(yùn)算符tt(line,row)endl;t(line,row)endl;elsefseek(fpin,-1L,SEEK_CUR);coutelsecouttt( 4, )tt 關(guān)系=tt( 4,=)tt 關(guān)系運(yùn)算符運(yùn)算符t(line,row)endl;t(line,row)endl;break;fseek(fpin,-1L,SEEK_CUR);break;case/ :coutchtt( 3,ch )default :tt 算術(shù)運(yùn)算符coutchttErrorttErrorttt(line,row)endl;t(line,row)endl;break;break;case( :case) :ca

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論