詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)精編版_第1頁(yè)
詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)精編版_第2頁(yè)
詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)精編版_第3頁(yè)
詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)精編版_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余10頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、題目:詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)一、引言 .3二、詞法分析器的設(shè)計(jì) .42.1 詞的內(nèi)部定義 .42.2詞法分析器的任務(wù)及功能 .52.2.1任務(wù) .52.2.2功能: .52.3單詞符號(hào)對(duì)應(yīng)的種別碼: .6三、詞法分析器的實(shí)現(xiàn) .63.1主程序示意圖: .73.2函數(shù)定義說(shuō)明 .73.3程序設(shè)計(jì)實(shí)現(xiàn)及功能說(shuō)明 .81關(guān)鍵字8關(guān)鍵字的定義8符合的關(guān)鍵字的查找8四、詞法分析程序的C語(yǔ)言源代碼:8五、 結(jié)果分析:11摘要:詞法分析是中文信息處理中的一項(xiàng)基礎(chǔ)性工作。詞法分析結(jié)果的好壞將直接影響中文信息處理上層應(yīng)用的效果。通過(guò)權(quán)威的評(píng)測(cè)和實(shí)際應(yīng)用表明 ,IRLAS 是一個(gè)高精度、高質(zhì)量的、高可靠性的詞法分

2、析系統(tǒng)。 眾所周知 , 切分歧義和未登錄詞識(shí)別是中文分詞中的兩大難點(diǎn)。理解詞法分析在編譯程序中的作用,加深對(duì)有窮自動(dòng)機(jī)模型的理解,掌握詞法分析程序的實(shí)現(xiàn)方法和技術(shù),用 c 語(yǔ)言對(duì)一個(gè)簡(jiǎn)單語(yǔ)言的子集編制一個(gè)一遍掃描的編譯程序,以加深對(duì)編譯原理的理解, 掌握編譯程序的實(shí)現(xiàn)方法和技術(shù)。Abstract:lexical analysis is a basic task in Chineseinformation processing. The results of lexical analysis willdirectlyaffectthe effectivenessof the applicatio

3、nof Chinese2information processing. The evaluation and practicalapplication show that IRLAS is a high precision, high qualityand high reliabilitylexicalanalysis system. Itis wellknownthat segmentation ambiguity and unknown word recognition arethe two major difficulties in Chinese word segmentation.

4、Theunderstanding of lexical analyse the program at compile,deepenof finite automata model for understanding, master lexicalanalysis program implementation method and technology, usingC language subsetof a simplelanguage compilationof a scannedagain compiler, to deepen to compile the principle soluti

5、on, master compiler implementation method and technology.關(guān)鍵詞: 詞法分析器掃描器單詞符號(hào)預(yù)處理Keywords: lexical analyzer word symbol pretreatment scanner一、引言3運(yùn)用 C 語(yǔ)言設(shè)計(jì)詞法分析器,由指定文件讀入預(yù)分析的源程序,經(jīng)過(guò)詞法分析器的分析,將結(jié)果寫(xiě)入指定文件。本程序是在 VisualStudio環(huán)境下,使用C 語(yǔ)言作為開(kāi)發(fā)工具?;趯?shí)驗(yàn)任務(wù)的內(nèi)容及目的,實(shí)現(xiàn)初步的需求分析,具備詞法分析器的基本功能和整體構(gòu)架。逐步細(xì)化其功能,做到相應(yīng)模塊的具體化。畫(huà)出未成熟的流程圖,確定整

6、體設(shè)計(jì)的走向,在一定范圍內(nèi)約束編程活動(dòng),確保沒(méi)有大的問(wèn)題及缺陷存在,然后通過(guò)將來(lái)的具體的編程設(shè)計(jì)完善流程圖。完成計(jì)算機(jī)翻譯過(guò)程的關(guān)鍵階段, 它為后面的語(yǔ)法分析、語(yǔ)義分析做好準(zhǔn)備 , 打好基礎(chǔ) , 以便快速地、高質(zhì)量地生成目標(biāo)語(yǔ)言程序。二、詞法分析器的設(shè)計(jì)由于我們規(guī)定的程序語(yǔ)句中涉及單詞較少" 故在詞法分析階段忽略了單詞輸入錯(cuò)誤的檢查 " 而將編譯程序的重點(diǎn)放在中間代碼生成階段$詞法分析器的功能是輸入源程序" 輸出單詞符號(hào) $規(guī)定輸出的單詞符號(hào)格式為如下的二元式%!單詞種別 "單詞自身的值#2.1 詞的內(nèi)部定義對(duì)常量,變量,臨時(shí)變量,保留關(guān)鍵字(if,wh

7、ile,begin,else,do等 ) 、關(guān)系運(yùn)算符、邏輯運(yùn)算符、分號(hào)、括號(hào)等, 規(guī)定其內(nèi)部定義如附表所示42.2 詞法分析器的任務(wù)及功能任務(wù)就編譯器基本結(jié)構(gòu)而言,詞法分析(lexicalanalysis)是編譯過(guò)程的第一階段。實(shí)際上,在詞法分析之前,有些編譯器模型存在編譯預(yù)處理階段,C 語(yǔ)言就是一個(gè)典型的例子。不過(guò),大多數(shù)Pascal 編譯器都不存在預(yù)處理器。本書(shū)對(duì)編譯預(yù)處理不作討論。詞法分析的任務(wù)是從左到右掃描與分析構(gòu)成源程序的字符流(字符串),把字符流分解為多個(gè)單詞( token )。每個(gè)單詞都是具有獨(dú)立含義且不可再分割的字符序列。在編譯器框架中,完成詞法分析任務(wù)的模塊稱(chēng)為詞法分析器。

8、功能:詞法分析器的基本功能是, 按照語(yǔ)言的定義規(guī)則, 逐個(gè)地讀入源程序的符號(hào), 識(shí)別出對(duì)語(yǔ)言有意義的符號(hào)串, 即單詞符號(hào); 然后分析單詞符號(hào)的屬性, 并把單詞符號(hào)及其屬性填寫(xiě)在表中;同時(shí)把源程序改造成等價(jià)的計(jì)算機(jī)內(nèi)部表示單詞記號(hào),以便編譯的后續(xù)階段5使用。( 1)識(shí)別出源程序中的各個(gè)單詞符號(hào),并將其轉(zhuǎn)換成內(nèi)部編碼形式;( 2)刪除無(wú)用的空白字符、回車(chē)字符以及其他非實(shí)質(zhì)性字符;( 3)刪除注釋?zhuān)?4)進(jìn)行詞法檢查,報(bào)告所發(fā)現(xiàn)的錯(cuò)誤。2.3 單詞符號(hào)對(duì)應(yīng)的種別碼:?jiǎn)卧~符號(hào)對(duì)應(yīng)的種別碼單詞符號(hào)種別碼單詞符號(hào)種別碼bgin1:17If2: =18Then3<20wile4<>21do

9、5<=22end6>23lettet10>=24( letter|digit) *dight dight*11=25+13;2614(27*15)28/16#0三、詞法分析器的實(shí)現(xiàn)編寫(xiě)詞法分析器, 詞法分析器能夠識(shí)別關(guān)系算符,詞法分析器能夠識(shí)別標(biāo)識(shí)符和關(guān)鍵字,詞法分析器能夠識(shí)別無(wú)符號(hào)數(shù)。編制一個(gè)能夠分析三種整數(shù)、標(biāo)識(shí)符、 主要運(yùn)算符和主要關(guān)鍵字的詞法分析器。詞法分析是從左向右掃描每行源程序的符號(hào),拼成單詞, 換成統(tǒng)一的二元式( 單詞種別碼, 單詞符號(hào)的屬性值) 表示。對(duì)給定的程序通過(guò)詞法分析器識(shí)別一個(gè)個(gè)單詞符號(hào),并以二元式( 單詞種別碼,單詞符號(hào)的屬性值) 顯示, 設(shè)計(jì)一個(gè)詞

10、法分析程序,理解6詞法分析器實(shí)現(xiàn)的原理,掌握程序設(shè)計(jì)語(yǔ)言中的各類(lèi)單詞的詞法分析方法,加深對(duì)詞法分析原理的理解。3.1 主程序示意圖: 關(guān)鍵字表的初值。關(guān)鍵字作為特殊標(biāo)識(shí)符處理,把它們預(yù)先安排在一張表格中(稱(chēng)為關(guān)鍵字表),當(dāng)掃描程序識(shí)別出標(biāo)識(shí)符時(shí),查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識(shí)符。關(guān)鍵字表為一個(gè)字符串?dāng)?shù)組,其描述如下:Char *rwtab6 = “ begin ” ,“ if ”,“ then ”,“ while ” ,“ do”,“ end”,;置初值調(diào)用掃描子程序輸出單詞二元組輸出串結(jié)束?是結(jié)束(2) 程序中需要用到的主要變量為syn, token 和 s

11、um。3.2 函數(shù)定義說(shuō)明(1) search()查找并識(shí)別當(dāng)前單詞類(lèi)別,并給定單詞類(lèi)別二元式碼,決定給定字符串類(lèi)別碼(即單詞種別)和記錄次序碼。(2) alphaprocess()識(shí)別當(dāng)前是數(shù)組、保留字、標(biāo)識(shí)符。(3) point()識(shí)別當(dāng)前字符串是指針。(4) digitprocess()識(shí)別當(dāng)前是常整數(shù)、小數(shù)、負(fù)小數(shù)。(5) otherprocess()識(shí)別當(dāng)前是其它(標(biāo)點(diǎn)符號(hào)等)。7(6) fopen()在默認(rèn)路徑下打開(kāi)分析程序并讀入字符串。3.3 程序設(shè)計(jì)實(shí)現(xiàn)及功能說(shuō)明關(guān)鍵字關(guān)鍵字:beginifend whlieelsewritereaddo callconstcharUntilp

12、roducerepeat運(yùn)算符:+*/界符:(),.;:關(guān)鍵字的定義void init() for( int j=0; j<18; j+) strcpy(symtablej.lexptr,strj); symtablej.token=j+3; 符合的關(guān)鍵字的查找int search(char *temp)for(unsigned int i=0;i < 18;i+) if(!strcmp(symtablei.lexptr ,temp) return symtablei.token; return 0;四、詞法分析程序的C語(yǔ)言源代碼:#include <iostream>

13、#include<string>using namespace std;8#define MAX 22char ch =' 'string key15="begin","end","if","then","else","while","write","read","do","call","const","char","u

14、ntil","procedure","repeat"/ 字符串鍵 15 = “開(kāi)始”, “結(jié)束”, “如果”, “當(dāng)時(shí)”, “其他”, “當(dāng)”, “寫(xiě)”,“讀”,“做”,“訪(fǎng)問(wèn)”,“常量”,“字符”,“直到”,“程序”,“重復(fù)” ;int Iskey(string c)/關(guān)鍵字判斷int i;for(i=0;i<MAX;i+) if(pare(c)=0) return 1;/將 i 作比較,返回1return 0;int IsLetter(char c) /判斷是否為字母if(c<='z')&

15、&(c>='a')|(c<='Z')&&(c>='A') return 1;else return 0;int IsDigit(char c)/判斷是否為數(shù)字if(c>='0'&&c<='9') return 1;else return 0;void analyse(FILE *fpin)/無(wú)效的分析(文件及外地個(gè)人識(shí)別號(hào))string arr=""while(ch=fgetc(fpin)!=EOF) /賦值arr="

16、;"if(ch=' '|ch='t'|ch='n')else if(IsLetter(ch)while(IsLetter(ch)|IsDigit(ch) if(ch<='Z')&&(ch>='A') ch=ch+32;arr=arr+ch;ch=fgetc(fpin);fseek(fpin,-1L,SEEK_CUR);if (Iskey(arr)cout<<arr<<"t$關(guān)鍵字 "<<endl;else cout<

17、<arr<<"t$普通標(biāo)識(shí)符 "<<endl;else if(IsDigit(ch)while(IsDigit(ch)|ch='.'&&IsDigit(fgetc(fpin)arr=arr+ch;ch=fgetc(fpin);fseek(fpin,-1L,SEEK_CUR);9cout<<arr<<"t$無(wú)符號(hào)實(shí)數(shù) "<<endl;else switch(ch)/標(biāo)識(shí)符分類(lèi)識(shí)別case'+':case'-' :case'

18、;*' :case'/' :cout<<ch<<"t$運(yùn)算符 "<<endl;break;case'=' :case'(' :case')' :case'' :case'' :case'' :case'' :cout<<ch<<"t$界符 "<<endl;break;case'' :case',' :case'

19、:' :ch=fgetc(fpin);if(ch='=') cout<<":="<<"t$運(yùn)算符 "<<endl;else cout<<"="<<"t$運(yùn)算符 "<<endl;fseek(fpin,-1L,SEEK_CUR);break;case'.' :case'<' :ch=fgetc(fpin);if(ch='=')cout<<"<=

20、"<<"t$運(yùn)算符 "<<endl;else if(ch='<')cout<<"<<"<<"t$輸出控制符 "<<endl;else if(ch='>') cout<<"<>"<<"t$運(yùn)算符 "<<endl;elsecout<<"<"<<"t$運(yùn)算符 "

21、<<endl;fseek(fpin,-1L,SEEK_CUR);break;case'>' :ch=fgetc(fpin);if(ch='=') cout<<">="<<"t$運(yùn)算符 "<<endl;if(ch='>')cout<<">>"<<"t$輸入控制符 "<<endl;else cout<<">"<<"t$運(yùn)算符 "<<endl;fseek(fpin,-1L,SEEK_CUR);break;default : cout<<ch<<"t$無(wú)法識(shí)別字符 "<<endl;void main()char in_fn30;FILE * fpin;cout<<"

溫馨提示

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

評(píng)論

0/150

提交評(píng)論