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

下載本文檔

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

文檔簡介

1、軟件類課程設計報告設計題目: 詞法分析器 學生學號: 專業(yè)班級: 計算機科學與技術(shù) 學生姓名: 學生成績: 指導教師(職稱): 課題工作時間: 至 信息工程學院軟件類課程設計任務書學生姓 名學號專業(yè)班級設計題目詞法分析器主要任務及設計要求:完成下述文法所描繪的單詞符號的詞法分析程序:<標識符>-><字母>|<標識符><字母>|<標識符><數(shù)字><無符號整數(shù)>-><數(shù)字>|<無符號整數(shù)><數(shù)字><分界符>->+|-|*|/|;|(|)|<|&

2、lt;=|=|!=|>=|>|=|<空格><字母>->a|z|A|Z<數(shù)字>->0|9設計要求:設計詞法分析器,由指定文件讀入預分析的源程序,經(jīng)過詞法分析器的分析,分析目標代碼,查找錯誤。本程序是在Python2環(huán)境下,使用Python語言作為開發(fā)工具?;趯嶒炄蝿盏膬?nèi)容及目的,實現(xiàn)初步的需求分析,具備詞法分析器的基本功能和整體構(gòu)架。逐步細化其功能,做到相應模塊的具體化。畫出未成熟的流程圖,確定整體設計的走向,在一定范圍內(nèi)約束編程活動,確保沒有大的問題及缺陷存在,然后通過將來的具體的編程設計完善流程圖。指導教師: 日期:年月日成績評定

3、表學生姓名: 學號: 專業(yè)/班級: 類別合計分值各項分值評分標準實際得分合計得分備注平時表現(xiàn)1010按時參加設計指導,無違反紀律情況。完成情況3020按設計任務書的要求完成了全部任務,能完整演示其設計內(nèi)容,符合要求。10能對其設計內(nèi)容進行詳細、完整的介紹,并能就指導教師提出的問題進行正確的回答。報告質(zhì)量3515報告文字通順,內(nèi)容翔實,論述充分、完整,立論正確,結(jié)構(gòu)嚴謹合理;報告字數(shù)符合相關要求,工整規(guī)范,整齊劃一。5課題背景介紹清楚,綜述分析充分。5設計方案合理、可行,論證嚴謹,邏輯性強,具有說服力。5符號統(tǒng)一;圖表完備、符合規(guī)范要求。5能對整個設計過程進行全面的總結(jié),得出有價值的結(jié)論或結(jié)果。

4、答辯情況2510在規(guī)定時間內(nèi)能就所設計的內(nèi)容進行闡述,言簡意明,重點突出,論點正確,條理清晰。15在規(guī)定時間內(nèi)能準確、完整、流利地回答教師所提出的問題??傇u成績: 分 指導教師: (簽字)日 期: 年 月 日西安文理學院信息工程學院 課程設計報告目錄目錄I第一章概述21.1詞法分析器概述21.2課程設計內(nèi)容2第二章詞法分析器課程設計32.1課程設計內(nèi)容32.2課程設計思想32.3設計目的及說明32.3.1程序設計范疇32.3.2程序設計說明3第三章程序詳細設計43.1主要算法的設計43.2算法的實現(xiàn)43.2.1數(shù)據(jù)類型43.2.2函數(shù)模塊功能43.3程序設計流程圖43.3.1設計流程圖53.3

5、.2狀態(tài)轉(zhuǎn)換圖5第四章運行結(jié)果及分析64.1運行結(jié)果64.2結(jié)果分析64.3設計總結(jié)6結(jié)束語8參考文獻8附錄源程序9- 12 -第一章概述1.1詞法分析器概述詞法分析器是通過詞法分析程序?qū)?gòu)成源程序的字符串從左到右的掃描,逐個字符地讀入源程序字符并按照構(gòu)詞規(guī)則切分成一個一個具有獨立意義的單詞。并確定其屬性(如保留字、標識符、運算符、界限符和常量等)。再把它們轉(zhuǎn)換稱長度統(tǒng)一的標準形式屬性字(TOKEN)。而詞法分析器的功能是輸入源程序,輸出單詞符號,并且詞法分析器有兩種處理結(jié)構(gòu):一種是把詞法分析器作為主程序;另一種是把詞法分析器作為語法分析程序調(diào)用的子程序。編譯器也一樣,它的輸入是語言的源文件(

6、一般可以是文本文件)對于輸入的文件,首先要分離出這個輸入文件的每個元素(關鍵字、變量、符號、)然后根據(jù)語言的文法,分析這些元素的組合是否合法,以及這些組合所表達的意思。程序設計語言和自然語言不一樣,都是用符號來描述,每個特定的符號表示特定的意思,而且程序設計語言是上下文無關的。上下文無關就是某一個特定語句所要表達的意思和它所處的上下文沒有關系,只有它自身決定。詞法分析器的功能就是把輸入的符號串整理成特定的詞素。1.2課程設計內(nèi)容運用c+語言設計詞法分析器,由指定文件讀入預分析的源程序,經(jīng)過詞法分析器的分析,將結(jié)果寫入指定文件。本程序是在Visual Studio環(huán)境下,使用c+語言作為開發(fā)工具

7、?;趯嶒炄蝿盏膬?nèi)容及目的,實現(xiàn)初步的需求分析,具備詞法分析器的基本功能和整體構(gòu)架。逐步細化其功能,做到相應模塊的具體化。畫出未成熟的流程圖,確定整體設計的走向,在一定范圍內(nèi)約束編程活動,確保沒有大的問題及缺陷存在,然后通過將來的具體的編程設計完善流程圖。第二章詞法分析器課程設計2.1課程設計內(nèi)容用c+語言設計詞法分析器,由指定文件讀入預分析的源程序,從左至右描源程序的字符串,按照詞法規(guī)則(正則文法規(guī)則)識別出一個個正確的單詞,并轉(zhuǎn)換成該單詞相應的二元式(種別碼、屬性值)交給語法分析使用。2.2課程設計思想該詞法分析器首先掃描文件,識別出一系列具有獨立意義的基本語法單位單詞,包括關鍵字、保留字

8、、標識符、各種常數(shù)、各種運算符及界符等。由于我們規(guī)定的c+語言程序語句中涉及單詞較少,所以在詞法分析階段忽略了單詞輸入錯誤的檢查,并在掃描后輸出單詞符號。規(guī)定輸出的單詞符號格式為如下的二元式:(單詞種別,單詞自身的值)。c+語言中定義了屬于這五種類型的大量的單詞,但是由于預編譯器只識別我們自定義的注釋,因此預編譯器處理的單詞集只是c+語言中定義的單詞集的一個真子集。2.3設計目的及說明2.3.1程序設計范疇完成下述文法所描繪的單詞符號的詞法分析程序:<標識符>-><字母>|<標識符><字母>|<標識符><數(shù)字><

9、;無符號整數(shù)>-><數(shù)字>|<無符號整數(shù)><數(shù)字><分界符>->+|-|*|/|;|(|)|<|<=|=|!=|>=|>|=|<空格><字母>->a|z|A|Z<數(shù)字>->0|92.3.2程序設計說明說明:1.假如該語言對字母的大小寫不敏感,則由指定文件讀入預分析的源程序,分析結(jié)果再寫入指定文件;2.語言關鍵字:“if”,“else”,“then”,“for”,“while”,“do”;第三章程序詳細設計3.1主要算法的設計<1>fopen()打

10、開源文件,讀入字符,對文件進行掃描,把讀入的字符放入緩沖區(qū)中,然后對該字符進行判斷。<2>若是字母開頭,則可能是關鍵字或者標識符,因此進入letterprocess()進行識別。識別的過程為:將以字母開頭的字母數(shù)字串放入char letter30中,然后進行識別。識別的過程是先讓它與保留關鍵字表中的所有關鍵字進行匹配,若獲得成功則說明它是關鍵字,則輸出其二元式;否則說明其為標識符,這時,將它與標識符表char *label20中的元素進行匹配,如沒有與之相匹配的,則為其申請空間,將其放入標識符表中。并輸出其二元式。<3>若是數(shù)字開頭,則可能是常量,因

11、此進入numberprocess()進行識別。識別的過程為:將其與常量表char num20中的元素進行匹配,如沒有與之相匹配的,則為其申請空間,將其放入標識符表中。并輸出其二元式。<4>否則進入otherprocess()識別當前是其它字符。在識別關系運算符的時候,有可能是兩個字符為一個關系運算符,所以在識別的時候要判斷連續(xù)的兩個是否為一個關系運算符。3.2算法的實現(xiàn)3.2.1數(shù)據(jù)類型(1)關鍵字:char*keyword6="if","else","then","for","wh

12、ile","do"(2)運算符和界符:char*operatornum16="+","-","*","/","<","<=",">",">=","!","=","","","","(",")"/運算符和界符(3)常量表和標識符表:char*num

13、20:用于存放文件中的常量;char*label20:用于存放文件中的標識符。3.2.2函數(shù)模塊功能(1)search():查找并識別當前單詞類別,并給定單詞類別二元式碼,決定給定字符串類別碼(即單詞種別)和記錄次序碼。(2)letterprocess():識別當前是數(shù)組、保留字、標識符。(3)numprocess():識別當前是常整數(shù)、小數(shù)、負小數(shù)。(4)otherprocess():識別當前是其它(標點符號等)。(5)fopen():在默認路徑下打開分析程序并讀入字符串。3.3程序設計流程圖3.3.1設計流程圖圖3-1程序設計流程圖3.3.2狀態(tài)轉(zhuǎn)換圖詞法分析器使用狀態(tài)轉(zhuǎn)換圖來識別單詞符號

14、。狀態(tài)轉(zhuǎn)換圖是一張有限方向圖。在狀態(tài)轉(zhuǎn)換圖中,有一個初態(tài),至少一個終態(tài)。2210字母 其它圖3-2狀態(tài)轉(zhuǎn)換圖其中0為初態(tài),2為終態(tài)。這個轉(zhuǎn)換圖識別(接受)標識符的過程是:從初態(tài)0開始,若在狀態(tài)0之下輸入字符是一個字母,則讀進它,并轉(zhuǎn)入狀態(tài)1。在狀態(tài)1之下,若下一個輸入字符為字母或數(shù)字,則讀進它,并重新進入狀態(tài)1。一直重復這個過程直到狀態(tài)1發(fā)現(xiàn)輸入字符不再是字母或數(shù)字時(這個字符也已被讀進)就進入狀態(tài)2。狀態(tài)2是終態(tài),它意味著到此已識別出一個標識符,識別過程宣告終止。終態(tài)結(jié)上打個星號意味著多讀進了一個不屬于標識符部分的字符,應把它退還給輸入口中 。如果在狀態(tài)0時輸入字符不為“字母”,則意味著識別

15、不出標識符,或者說,這個轉(zhuǎn)換圖工作不成功。第四章運行結(jié)果及分析4.1運行結(jié)果圖4-1運行截圖4.2結(jié)果分析通過程序運行截圖可以知道程序運行結(jié)果完全是正確的。程序設計過程大致如下:首先,根據(jù)課程設計的任務:使用c+語言編程,實現(xiàn)詞法分析器的基本功能,來確定本次程序設計的總體目標及路線。詳細閱讀課程設計的內(nèi)容及要求,明確接下來的大致作業(yè)。進一步,規(guī)劃算法,描繪出初步的,總體的流程圖。然后,結(jié)合編譯原理相關書籍,理解程序系統(tǒng)的基本原理。結(jié)合c+語言相關書籍,具體細化程序設計的思路,粗略確定程序的模塊劃分,功能劃分,并確定這些模塊和功能應該有c+語言的哪些函數(shù)來實現(xiàn)。接下來,著手程序編寫。依次完成源文

16、件的讀入,字符的判斷,文件的讀寫,結(jié)果的輸出,并在編程過程中反復完善,多多的測試,及時檢測問題是否存在,若存在,立即改善。直到程序足夠強壯,功能完善,結(jié)果正確為止。最后,選擇考慮到所有可能的測試數(shù)據(jù),總體測試詞法分析器的性能。更改輸出數(shù)據(jù)的格式,使之布局合理。在需要的地方增添注釋信息,刪除設計過程中的測試代碼或其他冗余代碼,美化程序布局,調(diào)整整體的程序代碼間隔。4.3設計總結(jié)雖然曾經(jīng)學過一個學期的c+語言,但現(xiàn)在基本上生疏了。所以,我又用了一周的時間來復習c+語言??傮w的算法及流程圖不是困難的問題,這些問題可以在紙上很快的解決。本以為這些解決了,課程設計的其他問題,如程序的具體編寫,應該不是難

17、事了。當著手于實際編程時,問題接連出現(xiàn)。即便如此,付出換回的收獲也是可觀的。自己獨立完成課程設計,熟悉程序設計中出現(xiàn)的所有問題以及解決方案,這無疑加深了我對設計項目的印象,增進了c+語言編程能力,熟悉了程序設計的具體流程。為以后的工作打下了基礎。結(jié)束語本次課程設計初步培養(yǎng)設計者對編譯器設計的思想的了解,加深對編譯原理和應用程序的理解。通過設計調(diào)試詞法分析程序,實現(xiàn)了從程序中分出各種單詞的方法,從而加深了對該知識的理解,提高了詞法分析的實踐能力。程序的關鍵點在于對對給出一段程序中的各種單詞的分離。在每段程序中,單詞種類可以分為:關鍵字,分界符,算術(shù)運算符,關系運算符,標識符和常數(shù)。關鍵字的判斷則

18、是通過與已知數(shù)組中列出的元素進行對比,得出該單詞是否為關鍵字;分解符,算術(shù)運算符,關系運算符的判斷與接受到的字符進行比較,得出該字符是否為分解符,算術(shù)運算符或者為關系運算符。同時在編寫程序過程中也遇到了許多問題,如在vc+6.0中運行是出現(xiàn)了錯誤或是運行結(jié)果沒有達到預期的效果,而出現(xiàn)了中斷等其他的問題,在不斷解決問題和發(fā)現(xiàn)問題的過程中,我學到了很多,我體會到實踐和理論的巨大差別,并且也有所成長??傊ㄟ^課程設計,我樹立了正確的設計思想,鞏固了所學編程語言基本知識,增進c+語言編程基本功;學習到如何綜合運用所學的理論知識,進一步理解到高級語言在計算機中的執(zhí)行過程,加深了對編譯原理中重點算法和編

19、譯技術(shù)的理解,理解詞法分析在編譯程序中的作用;掌握了課程設計的一般方法與步驟,設計和構(gòu)造編譯程序的基本原理和常用的編譯技術(shù),以及編譯程序的實現(xiàn)方法和技,提高了自己的編程能力。參考文獻1編譯原理(第2版)陳意云、張昱等編著,高等教育出版社2c+語言語言程序設計(第三版)鄭莉,董淵,張瑞豐編著,清華大學出版社3c+程序設計(第二版)譚浩強編著,清華大學出版社附錄源程序源程序代碼:/Lex.cpp:定義控制臺應用程序的入口點。/#include"stdafx.h"#include<iostream>#include<string>usingnamespac

20、estd;#define NULL 0FILE*fp;char ch;char*keyword6="if","else","then","for","while","do"/關鍵字char*operatornum16="+","-","*","/","<","<=",">",">=","

21、;!=","=","","","","(",")","#"/運算符和界符 boolsearch(charsearchstr,intwordtype)/查找是否是系統(tǒng)關鍵字或運算符或界符Int i;switch(wordtype)case1:for(i=0;i<=5;i+)/判斷是否是關鍵字if(strcmp(keywordi,searchstr)=0)Return true;case2:for(i=0;i<=15;i+)/判

22、斷是否是運算符或界符if(strcmp(operatornumi,searchstr)=0)return true;Return false;/*/Char letterprocess(char ch)/字母處理程序int i=-1;char letter30;/定義一個字符串最大長度為30while(isalnum(ch)!=0)/判斷是否為數(shù)字或字母,從文件中獲得一個字符串letter+i=ch;ch=fgetc(fp);letteri+1='0'/字符串結(jié)束if(search(letter,1)/調(diào)用search方法,判斷是否是系統(tǒng)關鍵字if(strcmp(keyword

23、0,letter)=0)cout<<"(1,"<<keyword0<<")"<<endl;else if(strcmp(keyword1,letter)=0)cout<<"(2,"<<keyword1<<")"<<endl;  else if(strcmp(keyword2,letter)=0) cout<<"(3,"<<keyword2

24、<<")"<<endl;   else if(strcmp(keyword3,letter)=0)cout<<"(4,"<<keyword3<<")"<<endl;else if(strcmp(keyword4,letter)=0)cout<<"(5,"<<keyword4<<")"<<endl;  else

25、 if(strcmp(keyword5,letter)=0)cout<<"(6,"<<keyword5<<")"<<endl; else/若不是關鍵字,則為一般字符串 cout<<"(10,'"<<letter<<"')"<<endl;return(ch);/*/ charnumberprocess(char ch)/數(shù)字處理程序int i=-1

26、;char num20;while(isdigit(ch)!=0)  num+i=ch;ch=fgetc(fp);if(isalpha(ch)!=0)/判斷是否為字母while(isspace(ch)=0)/判斷是否為空格之類的,如/t,/n,/r等num+i=ch;ch=fgetc(fp);numi+1='0'cout<<"錯誤!非法標識符:"<<num<<endl;goto u;numi+1='0'/數(shù)字結(jié)束  cout<<&quo

27、t;(11,"<<num<<")"<<endl;u:return(ch);charotherprocess(char ch)/運算符和界符處理程序int i=-1;char other20;if(isspace(ch)!=0)/判斷是否為空格之類的,如/t,/n,/r等ch=fgetc(fp);goto u;/若是,就返回該字符 while(isspace(ch)=0)&&(isalnum(ch)=0)/判斷字符串是否結(jié)束other+i=ch;ch=fgetc(f

28、p);otheri+1='0'/標示符結(jié)束 if(search(other,2)/調(diào)用search方法,判斷是否是運算符或界符 if(strcmp(operatornum0,other)=0)cout<<"(13,"<<operatornum0<<")"<<endl; else if(strcmp(operatornum1,other)=0)   cout<<"(14,"<<op

29、eratornum1<<")"<<endl; else if(strcmp(operatornum2,other)=0)   cout<<"(15,"<<operatornum2<<")"<<endl; else if(strcmp(operatornum3,other)=0)cout<<"(16,"<<operatornum3<<&quo

30、t;)"<<endl;   else if(strcmp(operatornum4,other)=0)      cout<<"(20,"<<operatornum4<<")"<<endl;     else if(strcmp(operatornum5,other)=0)    

31、0; cout<<"(22,"<<operatornum5<<")"<<endl;   else if(strcmp(operatornum6,other)=0)      cout<<"(23,"<<operatornum6<<")"<<endl;     el

32、se if(strcmp(operatornum7,other)=0)      cout<<"(24,"<<operatornum7<<")"<<endl;   else if(strcmp(operatornum8,other)=0)      cout<<"(21,"<<operatornu

33、m8<<")"<<endl;     else if(strcmp(operatornum9,other)=0)      cout<<"(25,"<<operatornum9<<")"<<endl;   else if(strcmp(operatornum10,other)=0)  &

34、#160;   cout<<"(17,"<<operatornum10<<")"<<endl;     else if(strcmp(operatornum11,other)=0)      cout<<"(18,"<<operatornum11<<")"<<endl;&#

35、160;  else if(strcmp(operatornum12,other)=0)      cout<<"(26,"<<operatornum12<<")"<<endl;     else if(strcmp(operatornum13,other)=0)      cout<<&

36、quot;(27,"<<operatornum13<<")"<<endl;   else if(strcmp(operatornum14,other)=0)      cout<<"(28,"<<operatornum14<<")"<<endl;     else  if(strcmp(operatornum15,other)=0)       cout<<"(0,"<<operatornum15<<")"<<endl;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論