詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)_第1頁
詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)_第2頁
詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)_第3頁
詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)_第4頁
詞法分析器的實(shí)現(xiàn)與設(shè)計(jì)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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ù)定義說明73.3程序設(shè)計(jì)實(shí)現(xiàn)及功能說明83.3.1關(guān)鍵字83.3.2關(guān)鍵字的定義83.3.3符合的關(guān)鍵字的查找8四、詞法分析程序的C語言源代碼:8五、 結(jié)果分析:11摘要:詞法分析是中文信息處理中的一項(xiàng)基礎(chǔ)性工作。詞法分析結(jié)果的好壞將直接影響中文信息處理上層應(yīng)用的效果。通過權(quán)威的評(píng)測和實(shí)際應(yīng)用表明,IRLAS是一個(gè)高精度、高質(zhì)量的、高可靠性的詞法分析系統(tǒng)。 眾所

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

3、hinese information processing. The evaluation and practical application show that IRLAS is a high precision, high quality and high reliability lexical analysis system. It is well known that segmentation ambiguity and unknown word recognition are the two major difficulties in Chinese word segmentatio

4、n. The understanding of lexical analyse the program at compile, deepen of finite automata model for understanding, master lexical analysis program implementation method and technology, using C language subset of a simple language compilation of a scanned again compiler, to deepen to compile the prin

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

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

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

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

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

10、種別碼,單詞符號(hào)的屬性值)顯示,設(shè)計(jì)一個(gè)詞法分析程序,理解詞法分析器實(shí)現(xiàn)的原理,掌握程序設(shè)計(jì)語言中的各類單詞的詞法分析方法,加深對(duì)詞法分析原理的理解。3.1主程序示意圖: 關(guān)鍵字表的初值。關(guān)鍵字作為特殊標(biāo)識(shí)符處理,把它們預(yù)先安排在一張表格中(稱為關(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)程序中需要用到的主要變量為

11、syn,token和sum。3.2函數(shù)定義說明(1) search() 查找并識(shí)別當(dāng)前單詞類別,并給定單詞類別二元式碼,決定給定字符串類別碼(即單詞種別)和記錄次序碼。(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)等)。(6) fopen() 在默認(rèn)路徑下打開分析程序并讀入字符串。3.3程序設(shè)計(jì)實(shí)現(xiàn)及功能說明3.3.1關(guān)鍵字關(guān)鍵字:beginifendwhlieelsewritereaddoca

12、llconstcharUntilproduce repeat運(yùn)算符:+*/界符:(),.;:3.3.2關(guān)鍵字的定義void init() for( int j=0; j<18; j+) strcpy(symtablej.lexptr,strj); symtablej.token=j+3; 3.3.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語言源

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

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

15、f(c<='z')&&(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) /無效的分析(文件及外地個(gè)人識(shí)別號(hào)) string arr="" while(c

16、h=fgetc(fpin)!=EOF) /賦值 arr="" 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<<&quo

17、t;t$關(guān)鍵字"<<endl; else cout<<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); cout<<arr<<"t$無符號(hào)實(shí)數(shù)"<<endl; else switch(ch) /標(biāo)識(shí)符

18、分類識(shí)別 case'+': case'-' : case'*' : case'/' :cout<<ch<<"t$運(yùn)算符"<<endl;break;case'=' : case'(' : case')' : case'' : case'' : case'' :case'' :cout<<ch<<"t$界符"<<e

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

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

21、lsecout<<"<"<<"t$運(yùn)算符"<<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$無法識(shí)別字符"<<endl; void main() char in_fn30; FILE * fpin; cout<&l

溫馨提示

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

評(píng)論

0/150

提交評(píng)論