編譯原理詞法分析器的構(gòu)造_第1頁
編譯原理詞法分析器的構(gòu)造_第2頁
編譯原理詞法分析器的構(gòu)造_第3頁
編譯原理詞法分析器的構(gòu)造_第4頁
編譯原理詞法分析器的構(gòu)造_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實 驗 報 告(2014 / 2015 學(xué)年 第 一 學(xué)期)課程名稱編譯原理實驗名稱詞法分析器的構(gòu)造實驗時間2015年4月10日指導(dǎo)單位南京郵電大學(xué)指導(dǎo)教師蔣凌云學(xué)生姓名孫雪祿班級學(xué)號B12041213學(xué)院(系)計算機學(xué)院、軟件學(xué)院專 業(yè)軟件工程(服務(wù)外包)實 驗 報 告實驗名稱詞法分析器的構(gòu)造指導(dǎo)教師蔣凌云實驗類型上機實驗實驗學(xué)時4實驗時間2015.4.10一、 實驗?zāi)康暮鸵?設(shè)計、編制、調(diào)試一個詞法分析程序,對單詞進行識別和編碼,加深對詞法分析原理的理解。二、實驗環(huán)境(實驗設(shè)備) Microsoft Visual Stdio 2010二、 實驗原理及內(nèi)容 1、實驗內(nèi)容:設(shè)計并實現(xiàn)一個詞法

2、分析器,實現(xiàn)對指定位置的類C語言源程序文本文件的讀取,并能夠?qū)υ撛闯绦蛑械乃袉卧~進行分類,指出其所屬類型,實現(xiàn)簡單的詞法分析操作。例如下面為一段C語言源程序:main() int  a,b; a = 10;  b = a + 20;要求輸出如下(可以自行分類,分類原則請在報告中說明)(1,main)(5,()(5,)(5, )(1,int)(2,a)(5,,)(2,b)(5,;)(2,a)(4,=)(3,10)(5,;)(2,b)(4,=)(2,a)(4,+)(3,20)(5,;)(5,) 2、實驗要求:(1)、允許用戶自己輸入源程序并保存為文件(2)、系統(tǒng)能夠輸出經(jīng)過預(yù)

3、處理后的源程序(去掉注釋、換行、空格等)(3)、能夠?qū)⒃撛闯绦蛑兴械膯卧~根據(jù)其所屬類型(整數(shù)、保留字、運算符、標(biāo)識符等。定義的類C語言中的標(biāo)識符只能以字母或下劃線開頭)進行歸類顯示,例如:識別保留字:if、int、for、while、do、return、break、continue等,其他的都識別為標(biāo)識符;常數(shù)為無符號整形數(shù);運算符包括:+、-、*、/、=、>、<、>=、<=、!=等;分隔符包括:,、;、(、)等。(4)、實現(xiàn)文件的讀取操作,而不是將文本以字符串形式預(yù)存于程序中。文本內(nèi)容為待分析的類C語言程序。3、實驗過程描述(1)首先講和書上一樣分成5類分類號分類內(nèi)

4、容1保留字2標(biāo)識符3整數(shù)4運算符(+,-,*,/,>,<,=等)5分隔符(,,;,(,))(2)、接著寫出用到的簡單文法并轉(zhuǎn)換成狀態(tài)轉(zhuǎn)換圖<標(biāo)識符>:=字母|字母<標(biāo)識符>|<標(biāo)識符>數(shù)字031字母非數(shù)字或字母字母或數(shù)字?jǐn)?shù)字?jǐn)?shù)字非數(shù)字+-*/=><, ; ( ) <整數(shù)>:=數(shù)字|數(shù)字<整數(shù)><運算符>:=+|-|*|<|>|=<分隔符>:=,|;|(|)|保留字是一種特殊的標(biāo)識符,不獨立寫出其文法031字母非數(shù)字或字母字母或數(shù)字?jǐn)?shù)字?jǐn)?shù)字非數(shù)字+-*/=><, ;

5、 ( ) 狀態(tài)轉(zhuǎn)換圖如下:(3) 按照書上的步驟寫程序 因為程序要求將用戶的輸入保存到文件中所以這里要用到文件存貯操作,fopen(FILE *文件名,打開方式)。一共有三個函數(shù)分別是bool LETTER(char A) /判斷字符是否是字母 if(A>='a'&&A<='z')return true;else if(A>='A'&&A<='Z')return true;else return false;bool DIGIT (char A) /判斷字符是否是數(shù)字if(A

6、>='0'&&A<='9')return true;elsereturn false;bool REAERVE(char *a) /判斷標(biāo)識符是否為保留字if(strcmp(a,"if")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"int")=0)cout<<"(1,'"<<

7、a<<"')"<<endl;return true;if(strcmp(a,"for")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"while")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;

8、if(strcmp(a,"do")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"return")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"break")=0)cout<<"(

9、1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"continue")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"main")=0)cout<<"(1,'"<<a<<"')"

10、<<endl;return true;return false;下面附上全部的代碼:#include <string.h>#include <iostream>#include <fstream> using namespace std;bool LETTER(char A) if(A>='a'&&A<='z')return true;else if(A>='A'&&A<='Z')return true;else return

11、false;bool DIGIT (char A)if(A>='0'&&A<='9')return true;elsereturn false;bool REAERVE(char *a)if(strcmp(a,"if")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"int")=0)cout<<"(1,

12、9;"<<a<<"')"<<endl;return true;if(strcmp(a,"for")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"while")=0)cout<<"(1,'"<<a<<"')"<<e

13、ndl;return true;if(strcmp(a,"do")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"return")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"break")=0)cou

14、t<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"continue")=0)cout<<"(1,'"<<a<<"')"<<endl;return true;if(strcmp(a,"main")=0)cout<<"(1,'"<<a<<&q

15、uot;')"<<endl;return true;return false;bool zimu(char A)if(A>='A'&&A<='Z')|A>='a'&&A<='z')return true;return false;int main()char a;FILE *f;char CHAR;char TOKEN120;f=fopen("code.txt","w");if(f=NULL)cout<

16、;<"con't create file"<<endl;exit(0);cout<<"please input you code"<<endl;while(a=getchar()!='?')fputc(a,f);fclose(f);cout<<"over"<<endl;f=fopen("code.txt","r");while(CHAR=fgetc(f)!=EOF)while(CHAR!=' 

17、9;)if(zimu(CHAR)/標(biāo)括?識?符?int k=0;doTOKENk=CHAR;k+;while(CHAR=fgetc(f)!=EOF&&CHAR!=' '&&zimu(CHAR);if(DIGIT(CHAR)/處鋦理?是?否?為a包悒?含?數(shù)簓字?的?標(biāo)括?識?符?doTOKENk=CHAR;k+;while(CHAR=fgetc(f)!=EOF&&CHAR!=' '&&DIGIT(CHAR);TOKENk='0'if(!(REAERVE(TOKEN)/判D斷?所

18、49;得?標(biāo)括?識?符?是?否?為a保饋?留?字?cout<<"(2,'"<<TOKEN<<"')"<<endl;if(DIGIT(CHAR) /整?數(shù)簓int i=0;doTOKENi=CHAR;i+;while(CHAR=fgetc(f)!=EOF&&CHAR!=' '&&DIGIT(CHAR);TOKENi='0'if(!REAERVE(TOKEN)cout<<"(3,'"<<TOKEN<<"')"<<endl;if(CHAR='+'|CHAR='-'|CHAR='*'|CHAR='/'|CHAR='>'|CHAR='<'|CHAR='=') /運?算?符?cout<<"(4,'"<<CHAR<<")"<<endl;if(CHAR=','|CHAR=''|C

溫馨提示

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

評論

0/150

提交評論