詞法分析器課程設計報告_第1頁
詞法分析器課程設計報告_第2頁
詞法分析器課程設計報告_第3頁
詞法分析器課程設計報告_第4頁
詞法分析器課程設計報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2009-2010學年第二學期編譯原理課程設計報告 學院(系): 班 級: 學生姓名: 學 號: 指導教師: 時間: 2010 年 6 月11目錄1. 課程設計的目的12課程設計的內容及要求12.1.課程設計內容12.2.課程設計要求22.3.運行環(huán)境32.4.程序的不足33問題分析及相關原理介紹33.1. 編譯程序介紹33.2各部分的功能介紹及分析33.3. 算法實現(xiàn)及模擬43.3.1總體流程圖43.3.2詳細的流程圖54設計思路及關鍵問題的解決方法74.1.設計思路及關鍵問題74.1.1處理時機74.1.2一個棘手問題84.2.解決方法85結果及測試分析85.1.待分析程序的部分內容85.

2、2.運行結果96總結106.1.設計過程106.2.困難與收獲11參考文獻11附錄111.課程設計的目的通過課程設計實踐,樹立正確的設計思想,鞏固所學編程語言基本知識,增進C語言編輯基本功;綜合運用所學的理論知識,進一步理解高級語言在計算機中的執(zhí)行過程,加深對編譯原理中重點算法和編譯技術的理解;掌握課程設計的一般方法與步驟,深入掌握課程設計的基本理論、方法和步驟,提高自己的編程能力,培養(yǎng)好的程序設計風格。通過課程設計,真正掌握設計和構造編譯程序的基本原理和常用的編譯技術,具備系統(tǒng)軟件調試能力和開發(fā)能力,培養(yǎng)分析問題和解決問題的能力。同時通過某種編程語言的應用,具備初步的Windows環(huán)境下的編

3、程思想。完成本課程設計的項目詞法分析器,理解詞法分析在編譯程序中的作用,加深對有窮自動機模型的理解,掌握詞法分析程序的實現(xiàn)方法和技術,用c語言對一個簡單語言的子集編制一個一遍掃描的編譯程序,以加深對編譯原理的理解,掌握編譯程序的實現(xiàn)方法和技術。2課程設計的內容及要求2.1.課程設計內容設計內容:完成下述文法所描述的單詞符號的詞法分析程序。 <標識符>-><字母>|<標識符><字母>|<標識符><數字> <無符號整數>-><數字>|<無符號整數><數字><分界

4、符>->+|-|*|/|;|(|)|<|<=|=|!=|>=|>|=|<空格><字母>->a|z|A|Z<數字>->0|9運用C語言設計詞法分析器,由指定文件讀入預分析的源程序,經過詞法分析器的分析,將結果寫入指定文件。本程序是在Visual Studio環(huán)境下,使用C語言作為開發(fā)工具?;趯嶒炄蝿盏膬热菁澳康?,實現(xiàn)初步的需求分析,具備詞法分析器的基本功能和整體構架。逐步細化其功能,做到相應模塊的具體化。畫出未成熟的流程圖,確定整體設計的走向,在一定范圍內約束編程活動,確保沒有大的問題及缺陷存在,然后通過將來的

5、具體的編程設計完善流程圖。程序設計的具體內容:在實際的設計中,預分析程序保存在文本文件sourcecode.txt中,該文件不能由執(zhí)行程序自動創(chuàng)建,需要在程序執(zhí)行前預先提供,程序擁有只讀的權限。程序逐個字符的分析源程序,能夠識別標識符,整數,分界符,并分別把分析得到的字符寫入相應文檔:keyword,words,digit,single,double;其它字符標示為無法識別,記錄在error文檔中。程序結束后,將最總結果寫入文件Dualistic_formula,該文件的內容包括統(tǒng)計結果(排除重復出現(xiàn)的字符)和二元式。這七個文件會在程序執(zhí)行時自動創(chuàng)建,程序結束時,關閉文件,但保留文件的內容,以

6、供查看和檢驗,測試。不同類別的字符通過相應的函數模塊來分析識別。普通標識符由函數int word(char ch)來識別,并進一步由函數int keyword(char key)來分離普通標識符和關鍵字;數字有函數int digit(char ch)來識別;分界符由函數int delimiter(char ch)來識別;其他字符即為非法字符。該程序中,全局變量共有兩個int characters_exist=0和int countoffinal=0。characters_exist用來判斷是否是純數字,countoffinal用來記錄finalresult函數執(zhí)行的次數。統(tǒng)計主函數在內,總共1

7、6個函數模塊,除了前面說到得識別字符的函數外,還有對文件進行操作的函數,對數組操作的函數和實現(xiàn)顯示功能的函數。主函數中有六個文件指針,十一個字符數組,十個實現(xiàn)不同功能的變量。在程序設計過程中及時注釋,方便復讀和檢測。2.2.課程設計要求必須運用C語言設計詞法分析器,由指定文件讀入預分析的源程序,從左至右描源程序的字符串,按照詞法規(guī)則(正則文法規(guī)則)識別出一個個正確的單詞,并轉換成該單詞相應的二元式(種別碼、屬性值)交給語法分析使用。本程序規(guī)定輸出用KeyWord代表關鍵字,Word代表普通標識符,Digit代表阿拉伯數字,SingleWord代表單分界符,DoubleWord代表雙分界符,ER

8、ROR代表無法別的字符。了解和掌握詞法分析的方法;編程實現(xiàn)給定源語言程序的詞法分析器;利用該分析器掃描源語言程序的字符串,按照給定的詞法規(guī)則,識別出單詞符號作為輸出,發(fā)現(xiàn)其中的詞法錯誤。不同類別的字符通過相應的函數模塊來分析識別。針對該程序設計的具體設計:編程實現(xiàn)一個簡單的詞法分析器,可以對一個文件進行詞法分析處理。程序能夠正確識別文法所規(guī)定的任何組織形式的字符組合。例如在連續(xù)的分界符中,如何分離出單分界符和雙分界符;字符中間的空格如何處理,源程序中往往出現(xiàn)大量連續(xù)的空格,若是全部記錄下來,沒用實際意義,且又浪費時間和空間,這樣又如何處理;普通標識符和關鍵字如何分離出來;數字如何判斷,形如12

9、3,a123,123a,123=,=123,123#,#123的字符串中,哪些才是整數,其它的又如何舍去。這些功能都必須實現(xiàn)。標識符是被分界符分開的,只有在遇到分界符時才能判斷前面的字符串是否是標識符;假若非法字符和字母或數字混雜在一起,則這些字母或數字不能形成標識符或整數;這個問題并不復雜,當出現(xiàn)連續(xù)的分界符時,棘手的問題才出現(xiàn)。形如!<=-a,這個分界符字符串該如何分析呢?第一個字符!是單分界符,那么是不是當讀到!時就可以立即判斷這是一個單分界符呢?不能,因為還有形如字符串!=的可能性,這樣一來詞法分析器必須擁有展望未來的能力;那么<是不能判斷為單分界符的,因為,字符組合<

10、;=是雙分界符;問題出現(xiàn)了,字符組合=是雙分界符,還是單獨的認為第二個=是單分界符,這就決定與規(guī)定了;既然在讀到單分界時不能立即判斷其具體歸類,那么當讀到字符 后,還需要進一步讀字符 a ,然后才能判斷字符 是否是單分界符,這樣一來,就需要在遇到字母或數字時,進行對前面的分界符的判斷,這時又需要退兩步來分析,也就是需要分析字符 a前面的兩個字符才能判斷字符 a前面的一個字符是什么屬性;這就是說,出現(xiàn)連續(xù)的分界符時,需要尾隨的其他類的字符來輔助,以判斷分界符的具體屬性;可是,如果沒有其他字符尾隨呢,最好的一個分界符該如何處理?還有,如果標識符同樣沒有其他字符尾隨,又該如何處理?分析得到的字符,需

11、要寫入文件,保存以供后用。重復出現(xiàn)的字符不能都作為最后結果存儲。這些多余的字符是在分析時舍去還是在整個源程序被分析完畢后才進一步處理舍的去問題?可以把讀到的所有合法字符(出去連續(xù)出現(xiàn)的大量空格)暫時保存到相關文件,待分析源程序完畢后,在處理這些文件中的合法字符,舍去重復的,把正確合適的數據寫入到另一個文件,形成二元式,該文件才是最后結果。程序在實現(xiàn)基本功能的同時,以上提出的問題必須小心處理。在程序設計過程中需要及時注釋。首先整體把握程序設計的架構和內涵,理清需求,得到雛形的流程圖;完成程序編程,滿足前述功能,實現(xiàn)數據的輸入和正確輸出。2.3.運行環(huán)境此法分析器的設計和運行環(huán)境:Microsof

12、t Windows XP Professional /Microsoft Visual Studio 2005/Visual C+ 控制臺應用程序。2.4.程序的不足本程序只能分析小型的源程序,否則將會出現(xiàn)空間分配不足;能夠分析的字符串的長度有限,否則,也會出現(xiàn)空間問題。另外,變量反復使用,不利于閱讀。反復出現(xiàn) “fopen”被聲明為否決的 這樣的警告信息。程序冗長,未能充分利用C函數庫的功能函數。3問題分析及相關原理介紹3.1. 編譯程序介紹本詞法分析器,預分析程序保存在文本文件sourcecode.txt中,該文件不能由執(zhí)行程序自動創(chuàng)建,需要在程序執(zhí)行前預先提供,程序擁有只讀的權限。程序逐

13、個字符的分析源程序,能夠識別標識符,整數,分界符,并分別把分析得到的字符寫入相應文檔:keyword,words,digit,single,double;其它字符標示為無法識別,記錄在error文檔中。程序結束后,將最總結果寫入文件Dualistic_formula,該文件的內容包括統(tǒng)計結果(排除重復出現(xiàn)的字符)和二元式。這七個文件會在程序執(zhí)行時自動創(chuàng)建,程序結束時,關閉文件,但保留文件的內容,以供查看和檢驗,測試。不同類別的字符通過相應的函數模塊來分析識別。普通標識符由函數int word(char ch)來識別,并進一步由函數int keyword(char key)來分離普通標識符和關鍵

14、字;數字有函數int digit(char ch)來識別;分界符由函數int delimiter(char ch)來識別;其他字符即為非法字符。該程序中,全局變量共有兩個int characters_exist=0和int ountoffinal=0。characters_exist用來判斷是否是純數字,countoffinal用來記錄finalresult函數執(zhí)行的次數。統(tǒng)計主函數在內,總共16個函數模塊,除了前面說到得識別字符的函數外,還有對文件進行操作的函數,對數組操作的函數和實現(xiàn)顯示功能的函數。主函數中有六個文件指針,十一個字符數組,十個實現(xiàn)不同功能的變量。在程序設計過程中及時注釋,方

15、便復讀和檢測。通過while循環(huán)和fgetc(FILE *fp)實現(xiàn)對字符的逐個讀入。3.2各部分的功能介紹及分析各函數及功能說明int word( char ch) /*判斷是否為字母*/ int digit(char ch) /*判斷是否為數字*/int delimiter(char ch) /*判斷是否是分界符*/int keywordcompare(char key,char keyword) /*比較關鍵字*/int keyword(char key) /*判斷是否是關鍵字*/void writetofile(char cha) /*將數組cha寫入文件Dualistic_formu

16、la*/void keywordtofile(char cha) /*將關鍵字寫入文件keyword*/void wordstofile(char cha) /*將標識符寫入文件words*/void digittofile(char cha) /*將數字寫入文件digit*/void singletofile(char cha) /*將單分界符寫入文件single*/void doubletofile(char cha) /*將雙分界符寫入文件double*/void errortofile(char cha) /*將非法字符寫入文件error*/void displayw(char ch,

17、char cha) /*立即顯示遇到的字符*/*顯示統(tǒng)計信息并將二元式寫入文件Dualistic_formula*/void finalresult(int df,char filen,FILE *fpp,FILE *fpt) void cleararray(int n,char cha) /*清空數組*/3.3. 算法實現(xiàn)及模擬3.3.1總體流程圖 流程圖1讀入源文件有函數int fgetc(FILE *FILE)實現(xiàn),文件是否結束及循環(huán)讀入字符由while循環(huán)實現(xiàn),while(!feof(fpr),其中fpr=fopen("sourcecode.txt","r

18、"),sourcecode.txt為存放源程序的文本文件。判斷字符類別由五個函數實現(xiàn):int word( char ch) /*判斷是否為字母*/ int digit(char ch) /*判斷是否為數字*/int delimiter(char ch) /*判斷是否是分界符*/int keywordcompare(char key,char keyword) /*比較關鍵字*/int keyword(char key) /*判斷是否是關鍵字*/存儲或顯示由八個函數實現(xiàn):void writetofile(char cha) void keywordtofile(char cha) vo

19、id digittofile(char cha) void singletofile(char cha) void doubletofile(char cha) void errortofile(char cha) void displayw(char ch,char cha) void finalresult(int df,char filen,FILE *fpp,FILE *fpt) 3.3.2詳細的流程圖如下:流程圖2,流程圖3 流程圖2 流程圖3 4設計思路及關鍵問題的解決方法4.1.設計思路及關鍵問題4.1.1處理時機確定算法的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞

20、符號,其基本思想是根據掃描到單詞符號的種類,分別存儲或顯示。數字和標識符被分界符或非法字符分開,分界符同樣被數字或標識符或非法字符分開,當非法字符與數字或標識符鄰接或混雜時,數字或標識符則不能成為數字或標識符,而成為非法字符,這是非法字符的感染特性。但這個效果在遇到分界符時不起作用,既分界符遇到非法字符或者和非法字符混雜,分界符仍然為分界符。這就要求,如果要處理標識符,就必須在遇到后面的分界符時才能有所操作。4.1.2一個棘手問題數字同樣如此。遇到數字或標識符同樣需要處理前面的分界符,但并不是所有的分解都必須在遇到數字或標識符后才能處理的。例如出現(xiàn)連續(xù)的分界符時。當出現(xiàn)連續(xù)的分界符時,棘手的問

21、題才出現(xiàn)。形如!<=-a,這個分界符字符串該如何分析呢?第一個字符!是單分界符,那么是不是當讀到!時就可以立即判斷這是一個單分界符呢?不能,因為還有形如字符串!=的可能性,這樣一來詞法分析器必須擁有展望未來的能力;那么<是不能判斷為單分界符的,因為,字符組合<=是雙分界符;問題出現(xiàn)了,字符組合=是雙分界符,還是單獨的認為第二個=是單分界符,這就決定與規(guī)定了;既然在讀到單分界時不能立即判斷其具體歸類,那么當讀到字符 后,還需要進一步讀字符 a ,然后才能判斷字符 是否是單分界符,這樣一來,就需要在遇到字母或數字時,進行對前面的分界符的判斷,這時又需要退兩步來分析,也就是需要分析

22、字符 a前面的兩個字符才能判斷字符 a前面的一個字符是什么屬性;這就是說,出現(xiàn)連續(xù)的分界符時,需要尾隨的其他類的字符來輔助,以判斷分界符的具體屬性;可是,如果沒有其他字符尾隨呢,最好的一個分界符該如何處理?還有,如果標識符同樣沒有其他字符尾隨,又該如何處理?4.2.解決方法可以用一個變量來標示前面是否出現(xiàn)雙分界符。同樣,用不同的變量實現(xiàn)不同的功能。下面是本程序的一些功能變量。char ch; /*接受從文件中讀出的單個字符*/ int unknown=0; /*判斷是否出現(xiàn)無法識別的字符*/int numofword=0; /*字母數組中的字母個數*/int numofdigit=0; /*數

23、字數組中的數字個數*/int numofsingle=0; /*連續(xù)出現(xiàn)的單分界符個數*/ int catchdoubleword=0; /*是否出現(xiàn)雙分界符*/int enddelimit=10; /*末尾是否存在分界符*/int numofspace=0; /*限制遇到過多的空格*/5結果及測試分析5.1.待分析程序的部分內容如圖4. 該待分析源程序非任何編程語言,但完全滿足測試需要。 圖45.2.運行結果如圖5. 圖5 由此可見,程序運行及結果輸出是完全正確的!6總結通過課程設計,樹立了正確的設計思想,鞏固了所學編程語言基本知識,增進C語言編程基本功;學習到如何綜合運用所學的理論知識,進

24、一步理解到高級語言在計算機中的執(zhí)行過程,加深了對編譯原理中重點算法和編譯技術的理解,理解詞法分析在編譯程序中的作用;掌握了課程設計的一般方法與步驟,設計和構造編譯程序的基本原理和常用的編譯技術,以及編譯程序的實現(xiàn)方法和技,提高了自己的編程能力。6.1.設計過程首先,根據課程設計的任務:使用c語言編程,實現(xiàn)詞法分析器的基本功能,來確定本次程序設計的總體目標及路線。詳細閱讀課程設計的內容及要求,明確接下來的大致作業(yè)。進一步,規(guī)劃算法,描繪出初步的,總體的流程圖。然后,結合編譯原理相關書籍,理解程序系統(tǒng)的基本原理。結合c語言相關書籍,具體細化程序設計的思路,粗略確定程序的模塊劃分,功能劃分,并確定這些模塊和功能應該有c語言的哪些函數來實現(xiàn)。接下來,著手程序編寫。依次完成源文件的讀入,字符的判斷,文件的讀寫,結果的輸出,并在編程過程中反復完善,多多的測試,及時檢測問題是否存在,若存在,立即改善。直到程序足夠強壯,功能完善,結果正確為止。最后,選擇考慮到所有可能的測試數據,總體測試詞法分析器的性能。更改輸出數據的格式,使之布局合理。在需要的地方增添注釋信息,刪除設計過程中的測試代碼或其他冗余代碼,美化程序布局,調整整體的程序代碼間隔。6.2.困難與收獲首先遇到的困難是對c語言的陌生。雖然花了

溫馨提示

  • 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

提交評論