詞法分析設(shè)計(jì)實(shí)驗(yàn)報(bào)告(附代碼)_第1頁
詞法分析設(shè)計(jì)實(shí)驗(yàn)報(bào)告(附代碼)_第2頁
詞法分析設(shè)計(jì)實(shí)驗(yàn)報(bào)告(附代碼)_第3頁
詞法分析設(shè)計(jì)實(shí)驗(yàn)報(bào)告(附代碼)_第4頁
詞法分析設(shè)計(jì)實(shí)驗(yàn)報(bào)告(附代碼)_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余6頁可下載查看

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)一詞法分析設(shè)計(jì)實(shí)驗(yàn)學(xué)時(shí):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ù)顯示時(shí)進(jìn)行標(biāo)識符登記符號表的管理。以下是實(shí)現(xiàn)詞法分析設(shè)計(jì)的主要工作:(1)從源程序文件中讀入字符。(2)統(tǒng)計(jì)行數(shù)和列數(shù)用于錯誤單詞的定

2、位。(3)刪除空格類字符,包括回車、制表符空格。(4)按拼寫單詞,并用(內(nèi)碼,屬性)二元式表示。(屬性值一一token的機(jī)內(nèi) 表示)(5)如果發(fā)現(xiàn)錯誤則報(bào)告出錯(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)算符:、=、=、=、 "分界符:;、,、(、)、;三、實(shí)驗(yàn)要求1、編程時(shí)注意編程風(fēng)格:空行的使用

3、、注釋的使用、縮進(jìn)的使用等。2、將標(biāo)識符填寫的相應(yīng)符號表須提供給編譯程序的以后各階段使用。3、根據(jù)測試數(shù)據(jù)進(jìn)行測試。測試實(shí)例應(yīng)包括以下三個部分 :全部合法的輸入。各種組合的非法輸入。由記號組成的句子。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)then(1 , then)關(guān)鍵字(1, 5)n(6,n )標(biāo)識符(1 , 6

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

5、r","class","const","continue"," default","delete","do","double","else","enum","float","for","if","int","lo ng","new","private","pr

6、otected","public","register","return","short","st atic","struct","switch","this","void","while","then" 關(guān)鍵字表,單詞種別 碼1;Delimiter="","(",")","","

7、;",",",".","",""分界符表單詞種別碼 2Operator="+","-","*","/"算術(shù)運(yùn)算符表單詞種別碼3R_operators="<","<=","=",">",">=",關(guān)鍵字表,單詞種別碼 1;string Number100; 常數(shù)表單詞種別碼5;string Identifi

8、er100; 標(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ì)圖:(knpclnteO生成關(guān)鍵字表和分碗奏當(dāng)前的首字符是什么?造人標(biāo)識將表形成(Lpuinteij形成

9、(c,pointer)薇成值pointer)摘出單洞眄擔(dān),屬性)詞法分析了程序的簡化框圖綜合以上分析,畫出整個程序的運(yùn)行分析程序圖,如下:11回退打開源文件初始化文件指針M識別指針內(nèi)容將字符加 入字符數(shù) 組 Word口是指向下一字符跳過該字符是字母惑數(shù)字. 嗎/否輸出word將word與關(guān)鍵 字表key進(jìn)行匹輸出word為 普通標(biāo)示符為關(guān)鍵字識別指針內(nèi)容.是數(shù)字嗎)輸出word 為常數(shù)將字符 加入字 符數(shù)組 Word口將字符加入字符數(shù) 組 Word口將字符 加入字 符數(shù)組 Word口輸出word為界符指向下一字符輸出Word 內(nèi)容為不 可識別/整個程序的運(yùn)行分析程序圖軟件的測試方法和測試結(jié)果:

10、 首先,將要分析的源代碼寫入一個文本,存于磁盤中,然后運(yùn)行程序,輸入源代碼文件存放的路徑,若輸入路徑正確,程序?qū)⒆詣臃治鲈创a,若輸入路徑不正確,程序?qū)@示,路徑錯誤,請重新輸入的提示。下面為具體的運(yùn)行實(shí)例:源代碼為:If i=0 thenn+;a< = 3b %)Source運(yùn)算符thenthen>Errorcont inue關(guān)系運(yùn)算符Error Error關(guān)鍵字 標(biāo)識符E*l*nr人源方性名(包括蹬 路建稽的請輸大濾輸出滿足要求實(shí)驗(yàn)總結(jié)(設(shè)計(jì)的特點(diǎn)、不足、收獲與體會):通過此次實(shí)驗(yàn),讓我了解到如何設(shè)計(jì)、編制并調(diào)試詞法分析程序,熟悉了構(gòu)造詞法分析程序的手工方式的相關(guān)原理,加深了對

11、編譯原理詞法分析的理解,本次使用C+語言直接編寫此法分析程序,也讓我重新熟悉了 C+語言的相關(guān)內(nèi)容,加深了對C+語言的用途的理解。本程序的數(shù)據(jù)輸入采取直接從文件中讀取,而不是由鍵盤輸入,因此在測試過程中,輸入得到大大簡化,但是本程序的關(guān)鍵 字表只初始化了一部分關(guān)鍵字,還可繼續(xù)擴(kuò)充(只需擴(kuò)大數(shù)組,向其中補(bǔ)充要添 加的關(guān)鍵字),而且程序的測試數(shù)據(jù)存在不足,程序可能存在未發(fā)現(xiàn)的漏洞,以 上兩點(diǎn)有待改善。附錄該程序的源代碼:#include <iostream>#include<string>using namespace std;/數(shù)據(jù)定義#define MAX 33char

12、 ch =''static int line=1,row=0;int NumberCount=0,IdCount=0;stringkey="auto","break","case","catch","cha r","class","const","continue","default","de lete","do","double", &qu

13、ot;else","enum","float","for","if","int","long" ,"new","private","protected","public","reg ister","return","short","static", "struct","switc

14、h","this","void","while","then"/關(guān)鍵字表單詞種別硝stringDelimiter="","(",")","","",",",".","",""/分界符表單詞種別52string Operator="+","-","*","/&q

15、uot;/算術(shù)運(yùn)算符表單詞種別53stringR_operators="<","<=","=",">",">="/關(guān)系運(yùn)算符表單詞種別54string Number100;而數(shù)表單詞種另1J碼 string Identfier100;晰示符表單詞種別碼6/數(shù)據(jù)分析int Iskey(string c)關(guān)鍵字判斷int i;for(i=0;i<MAX;i+) if(pare(c)=0) return 1;return 0;/判斷是否為字母int IsL

16、etter(char c) if(c<='z')&&(c>='a')|(c<=Z)&&(c>='A') if(ch<='Z')&&(ch>='A')ch=ch+32;冰專換成小寫return 1;else return 0;int IsNumber(char c)/ 判斷是否為數(shù)字if(c>='0'&&c<='9') return 1;else return 0;/將arr

17、中的標(biāo)示符插入符號蓑且返回符 號表的指針int InsertId(string s)for(int i=0;i<IdCount;i+)if(Identifieri=s) return i;break;else if(IdCount=i+1) IdentifierIdCount=s; return IdCount;IdCount+;/將arr中的常實(shí)數(shù)插入常數(shù)M且返回常 數(shù)表的指針int InsertNumber(string s)for(int i=0;i<NumberCount;i+)if(Numberi=s) return i;break;else if(NumberCount

18、=i+1) NumberNumberCount=s; return NumberCount;NumberCount+;void analyse(FILE *fpin)/arr相當(dāng)于課本中般rToken string arr=""while(ch=fgetc(fpin)!=EOF)判斷是否讀取到文件末尾或者讀取出錯arr="";if(ch=' '|ch='t'|ch='n')刪除空格類字符,包括回車、制表符空格if(ch='n') line+; row=0;else if(IsLetter(c

19、h)while(IsLetter(ch)|IsNumber(ch) arr=arr+ch;ch=fgetc(fpin);fseek(fpin,-1L,SEEK_CUR)伊指針回移一個位置if (Iskey(arr)row+; 識別出一個字符,列增加一cout<<arr<<"tt( 1,"<<arr<<")"<<"tt 關(guān)鍵字,<<"tt("<<line<<","<<row<<"

20、)"<<endl;elserow+; /識另 U 出一個字符,列增加一InsertId(arr);cout<<arr<<"tt( 6,"<<arr<<")"<<"tt標(biāo)識符"<<"tt("<<line<<","<<row<<")"<<endl;)/處理常數(shù)else if(IsNumber(ch)(while(IsNumber

21、(ch)/11ch='.'&&IsNum ber(fgetc(fpin)(arr=arr+ch;ch=fgetc(fpin);)if(IsLetter(ch)(while(IsLetter(ch)|IsNumber(ch)(arr=arr+ch;ch=fgetc(fpin);)fseek(fpin,-1L,SEEK_CUR);row+;cout<<arr<<"ttError"<<"ttError"<<"tt("<<line<<&qu

22、ot;,"<<row<<")"<<endl;)elseInsertNumber(arr);row+; 識另 U出一個字符,列增加一cout<<arr<<"tt( 5,"<<arr<<")"<<"tt 常數(shù)"<<"tt("<<line<<","<<row<<")"<<en dl;/處

23、理算符 elserow+;arr=ch;switch(ch)case'+':ch=fgetc(fpin);if(ch='('|IsNumber(ch)|IsLetter(ch) )fseek(fpin,-1L,SEEK_CUR);cout<<"+"<<"tt( 3,+ )”<<"tt 算術(shù) 運(yùn)算符"<<"tt("<<line<<","<<row<<")"<

24、;<en dl; elsecout<<arr+ch<<"ttError"<<"ttError" <<"tt("<<line<<","<<row<<")"<<endl ;break;case'-' :ch=fgetc(fpin);if(ch='('|IsNumber(ch)|IsLetter(ch)fseek(fpin,-1L,SEEK_CUR);cou

25、t<<"- <<"tt( 3,- )"<<"tt 算術(shù)運(yùn)算符 "<<"tt("<<line<<","<<row<<")"<<en dl;elsecout<<arr+ch<<"ttError"<<"ttEr ror"<<"tt("<<line<<&qu

26、ot;,"<<row<<")"<< endl;break;case'*' :cout<<"-"<<"tt( 3,*)"<<"tt 算術(shù)運(yùn)算符"<<"tt("<<line<<","<<row<<")"<<en dl;case'=' :ch=fgetc(fpin);if(ch=

27、'=')cout<<"="<<"tt( 4,= )"<<"tt 關(guān)系 運(yùn)算符"<<"tt("<<line<<","<<row<<")"<<endl;elsefseek(fpin,-1L,SEEK_CUR);cout<<"="<<"tt( 4,=)"<<"tt 關(guān)系運(yùn)算符

28、 "<<"t("<<line<<","<<row<<")"<<endl;break;case'/' :cout<<ch<<"tt( 3,"<<ch<<")"<<"tt算術(shù)運(yùn)算符"<<"tt("<<line<<","<<row<&

29、lt;")"<<en dl;break;case'(':case')':case'':case'':case'':case'.':case',':case'':case'' :cout<<ch<<"tt( 2,"<<ch<<")"<<"tt分界符"<<"tt("<&

30、lt;line<<","<<row<<")"<<en dl;break;case'>' :ch=fgetc(fpin);if(ch='=')cout<<">="<<"tt( 4,>=)"<<"tt關(guān)系運(yùn)算符"<<"tt("<<line<<","<<row<<")"<<en dl;elsecout<<">"<<"tt( 4,> )"<<"tt 關(guān)系運(yùn)算符"<<"tt("<<line<<","<<row<<")"<<en dl;fseek(fpin,-1L,SEEK_CUR);break;case'<' :ch=fgetc(fpin);if(ch='=&#

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論