詞法分析設計實驗報告(附代碼)_第1頁
詞法分析設計實驗報告(附代碼)_第2頁
詞法分析設計實驗報告(附代碼)_第3頁
詞法分析設計實驗報告(附代碼)_第4頁
詞法分析設計實驗報告(附代碼)_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗一詞法分析設計實驗學時:4實驗類型:綜合實驗要求:必修一、實驗目的通過本實驗的編程實踐,使學生了解詞法分析的任務,掌握詞法分析程序設 計的原理和構造方法,使學生對編譯的基本概念、原理和方法有完整的和清楚的 理解,并能正確地、熟練地運用。二、實驗內容用VC+/VB/JAVA語言實現(xiàn)對C語言子集的源程序進行詞法分析。通過輸 入源程序從左到右對字符串進行掃描和分解,依次輸出各個單詞的內部編碼及單 詞符號自身值;若遇到錯誤則顯示“Error ”,然后跳過錯誤部分繼續(xù)顯示時進行標識符登記符號表的管理。以下是實現(xiàn)詞法分析設計的主要工作:(1)從源程序文件中讀入字符。(2)統(tǒng)計行數和列數用于錯誤單詞的定

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

3、、注釋的使用、縮進的使用等。2、將標識符填寫的相應符號表須提供給編譯程序的以后各階段使用。3、根據測試數據進行測試。測試實例應包括以下三個部分 :全部合法的輸入。各種組合的非法輸入。由記號組成的句子。4、詞法分析程序設計要求輸出形式:例:輸入VC+語言的實例程序:If i=0 thenn+;a< = 3b %);輸出形式為:單詞二元序列類型位置(行,列)(單詞種別,單詞屬性)for(1,for )關鍵字(1,1)i(6,i )標識符(1, 2)=(4,=)關系運算符(1, 3)0(5, 0 )常數(1 , 4)then(1 , then)關鍵字(1, 5)n(6,n )標識符(1 , 6

4、)+ErrorError(1, 7);(2,;)分界符(1, 8)a(6,a )標識符(2, 1)< =(4,<二)關系運算符(2, 23bErrorError(2, 4)%ErrorError(2, 4)(2,)分界符(2, 5);(2,;)分界符(2, 6)實驗報告正文:功能描述:該程序具有詞法分析功能,即面對一段程序源代碼,通過該程序,能檢查出源代碼是否由詞法錯誤。三、詞法分析實驗設計思想及算法:首先構造六個表,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" 關鍵字表,單詞種別 碼1;Delimiter="","(",")","","

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

8、er100; 標示符表單詞種別碼6;構造關鍵字判斷函數Iskey(),字母判斷函數Isletter(),數字判斷函數Isnumber();構造標示符判別函數InsertId(),若輸入的標示符在標示符數組Identifier 中, 返回其下標,若不在,將該標示符插到數組末尾。構造標示符判別函數InsertNumber(),若輸入的數字在數字數組Number口中, 返回其下標,若不在,將該數字插到數組末尾。具體分析函數analyse。具體實現(xiàn)輸入源代碼的識別anaiyse()構造思路,程序設計圖:(knpclnteO生成關鍵字表和分碗奏當前的首字符是什么?造人標識將表形成(Lpuinteij形成

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

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

11、編譯原理詞法分析的理解,本次使用C+語言直接編寫此法分析程序,也讓我重新熟悉了 C+語言的相關內容,加深了對C+語言的用途的理解。本程序的數據輸入采取直接從文件中讀取,而不是由鍵盤輸入,因此在測試過程中,輸入得到大大簡化,但是本程序的關鍵 字表只初始化了一部分關鍵字,還可繼續(xù)擴充(只需擴大數組,向其中補充要添 加的關鍵字),而且程序的測試數據存在不足,程序可能存在未發(fā)現(xiàn)的漏洞,以 上兩點有待改善。附錄該程序的源代碼:#include <iostream>#include<string>using namespace std;/數據定義#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"/關鍵字表單詞種別硝stringDelimiter="","(",")","","",",",".","",""/分界符表單詞種別52string Operator="+","-","*","/&q

15、uot;/算術運算符表單詞種別53stringR_operators="<","<=","=",">",">="/關系運算符表單詞種別54string Number100;而數表單詞種另1J碼 string Identfier100;晰示符表單詞種別碼6/數據分析int Iskey(string c)關鍵字判斷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)/ 判斷是否為數字if(c>='0'&&c<='9') return 1;else return 0;/將arr

17、中的標示符插入符號蓑且返回符 號表的指針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中的常實數插入常數M且返回常 數表的指針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相當于課本中般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 關鍵字,<<"tt("<<line<<","<<row<<"

20、)"<<endl;elserow+; /識另 U 出一個字符,列增加一InsertId(arr);cout<<arr<<"tt( 6,"<<arr<<")"<<"tt標識符"<<"tt("<<line<<","<<row<<")"<<endl;)/處理常數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 常數"<<"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 算術 運算符"<<"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 算術運算符 "<<"tt("<<line<<","<<row<<")"<<en dl;elsecout<<arr+ch<<"ttError"<<"ttEr ror"<<"tt("<<line<<&qu

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

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

28、 "<<"t("<<line<<","<<row<<")"<<endl;break;case'/' :cout<<ch<<"tt( 3,"<<ch<<")"<<"tt算術運算符"<<"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關系運算符"<<"tt("<<line<<","<<row<<")"<<en dl;elsecout<<">"<<"tt( 4,> )"<<"tt 關系運算符"<<"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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論