編譯原理詞法分析實驗含代碼_第1頁
編譯原理詞法分析實驗含代碼_第2頁
編譯原理詞法分析實驗含代碼_第3頁
編譯原理詞法分析實驗含代碼_第4頁
編譯原理詞法分析實驗含代碼_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機(jī)編譯原理實驗 班級:計算機(jī)科學(xué)與技術(shù)113班 姓名: 學(xué)號:南昌大學(xué)信息工程學(xué)院計算機(jī)系實驗1 詞法分析程序的設(shè)計一、實驗?zāi)康恼莆沼嬎銠C(jī)語言的詞法分析程序的開發(fā)方法。 二、實驗內(nèi)容編制一個能夠分析三種整數(shù)、標(biāo)識符、主要運算符和主要關(guān)鍵字的詞法分析程序。三、實驗要求1、根據(jù)以下的正規(guī)式,編制正規(guī)文法,畫出狀態(tài)圖;標(biāo)識符<字母>(<字母>|<數(shù)字字符>)*十進(jìn)制整數(shù)0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*如有余力,則進(jìn)一步分析八進(jìn)制和十六進(jìn)制整數(shù),其正規(guī)式如下:八進(jìn)制整數(shù) 0(1|2|3|4|5|6

2、|7)(0|1|2|3|4|5|6|7)*十六進(jìn)制整數(shù)0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*運算符和界符+ - * / > < = <= >= ( ) ; 關(guān)鍵字main if then else while do int (可根據(jù)需要添加)2、根據(jù)狀態(tài)圖,設(shè)計詞法分析函數(shù)int scan( ),完成以下功能:1) 從文本文件中讀入測試源代碼,根據(jù)狀態(tài)轉(zhuǎn)換圖,分析出一個單詞,2) 以二元式形式輸出單詞<單詞種類,單詞屬性>其中單詞種類用整數(shù)表示:0:標(biāo)識符1:

3、十進(jìn)制整數(shù)2:八進(jìn)制整數(shù)3:十六進(jìn)制整數(shù)運算符和界符,關(guān)鍵字采用一字一符,不編碼其中單詞屬性表示如下:標(biāo)識符,整數(shù)由于采用一類一符,屬性用單詞表示運算符和界符,關(guān)鍵字采用一字一符,屬性為空3、編寫測試程序,反復(fù)調(diào)用函數(shù)scan( ),輸出單詞種別和屬性。 四、實驗環(huán)境PC微機(jī)DOS操作系統(tǒng)或 Windows 操作系統(tǒng)Turbo C 程序集成環(huán)境或 Visual C+ 程序集成環(huán)境 五、實驗步驟1、 根據(jù)正規(guī)式,畫出狀態(tài)轉(zhuǎn)換圖;2、 根據(jù)狀態(tài)圖,設(shè)計詞法分析算法;3、 采用C或C+語言,設(shè)計函數(shù)scan( ),實現(xiàn)該算法;4、 編制測試程序(主函數(shù)main);5、調(diào)試程序:讀

4、入文本文件program.txt,運行程序得到輸出結(jié)果result.txt,并檢查輸出結(jié)果是否正確。 六、測試數(shù)據(jù) 輸入數(shù)據(jù):編輯一個文本文件program.txt,在文件中輸入一段程序代碼,如:if data+92>0x3f thendata=data+01;elsedata=data-01; 將輸出結(jié)果存放在result.txt文件中,輸出格式如下:<if , -><0 , data><+ , -><1 , 92><> , -><3 , 3f><then , -><0 , dat

5、a><= , -><0 , data><+ , -><2 , 1>< ,-><else , -><0 , data><= , -><0 , data><- , -><2 , ->< , ->七、實驗報告要求實驗報告應(yīng)包括以下幾個部分:1、詞法的正規(guī)式描述;2、變換后的狀態(tài)圖;3、詞法分析程序的數(shù)據(jù)結(jié)構(gòu)與算法?!驹闯绦颉?include <iostream>#include<string>using namespace st

6、d;#define LENGTH 5 char ch =' 'string key5="if","then","else","while","do"int Iskey(string c) /關(guān)鍵字判斷 int i; for(i=0;i<LENGTH;i+) if(pare(c)=0) return 1; return 0;int IsLetter(char c) /判斷是否為字母 if(c<='z')&&(c>=&

7、#39;a')|(c<='Z')&&(c>='A') return 1; else return 0;int IsLetter1(char c) /判斷是否為af字母 if(c<='f')&&(c>='a')|(c<='F')&&(c>='A') return 1; else return 0;int IsNum(char c) /判斷是否為數(shù)字 if(c>='0'&&c

8、<='9') return 1; else return 0;void scan(FILE *fpin) string arr="" while(ch=fgetc(fpin)!=EOF) arr="" if(ch=' '|ch='t'|ch='n') else if(IsLetter(ch)|ch='_') arr=arr+ch; ch=fgetc(fpin); while(IsLetter(ch)|IsNum(ch) if(ch<='Z')&am

9、p;&(ch>='A') ch=ch+32; arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); if (Iskey(arr)cout<<"<"<<arr<<",關(guān)鍵字>"<<endl; else cout<<"<"<<arr<<",普通標(biāo)識符>"<<endl; else if(IsNum(ch) int fla

10、g=0;if(ch='0')arr=arr+ch;ch=fgetc(fpin);if(ch>='0'&&ch<='7') while(ch>='0'&&ch<='7') flag=1; arr=arr+ch; ch=fgetc(fpin);else if(ch='x'|ch='X')flag=2;arr=arr+ch; ch=fgetc(fpin);while(IsNum(ch)|IsLetter1(ch) arr=arr+ch

11、; ch=fgetc(fpin);else if(ch=' '|ch=','|ch='' )cout<<"<"<<arr<<",整數(shù)0>"<<endl;fseek(fpin,-1L,SEEK_CUR); if(flag=1) cout<<"<"<<arr<<",八進(jìn)制整數(shù)>"<<endl;else if(flag=2) cout<<&qu

12、ot;<"<<arr<<",十六進(jìn)制整數(shù)>"<<endl; else arr=arr+ch;ch=fgetc(fpin);while(IsNum(ch) arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); cout<<"<"<<arr<<",十進(jìn)制整數(shù)>"<<endl; else switch(ch) case'+': case'-'

13、; : case'*' : case'=' : case'/' :cout<<"<"<<ch<<",運算符>"<<endl;break; case'(' : case')' : case'' : case'' : case'' : case'.' : case',' : case'' : case'' :c

14、out<<"<"<<ch<<",界符>"<<endl;break; case':' :ch=fgetc(fpin); if(ch='=') cout<<"<"<<":="<<",運算符>"<<endl; else cout<<"<"<<":"<<",界符&

15、gt;"<<endl; fseek(fpin,-1L,SEEK_CUR); break; case'>' :ch=fgetc(fpin); if(ch='=') cout<<"<"<<">="<<",運算符>"<<endl; if(ch='>')cout<<"<"<<">>"<<",輸入

16、控制符>"<<endl; else cout<<"<"<<">"<<",運算符>"<<endl; fseek(fpin,-1L,SEEK_CUR); break; case'<' :ch=fgetc(fpin); if(ch='=')cout<<"<"<<"<="<<",運算符>"<&l

17、t;endl; else if(ch='<')cout<<"<"<<"<<"<<",輸出控制符>"<<endl; else if(ch='>') cout<<"<"<<"<>"<<",運算符>"<<endl; elsecout<<"<"<<"<"<<",運算符>"<<endl; fseek(fpin,-1L,SEEK_CUR); break; default : cout<<"<"<<ch<<",無法識別字符>"<<endl; void main() char in_fn30; FILE * fpin; cout<<"請輸入文件路徑及文件名:" for(;) cin>>

溫馨提示

  • 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

提交評論