基于flex的詞法分析器的設(shè)計和實現(xiàn)_第1頁
基于flex的詞法分析器的設(shè)計和實現(xiàn)_第2頁
基于flex的詞法分析器的設(shè)計和實現(xiàn)_第3頁
基于flex的詞法分析器的設(shè)計和實現(xiàn)_第4頁
基于flex的詞法分析器的設(shè)計和實現(xiàn)_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、課程設(shè)計1 基于Flex的詞法分析器設(shè)計及實現(xiàn)1.1 需求分析1.1.1 問題定義1、 通過對 flex 基本知識的閱讀,了解其工作原理和過程以及其匹配模式和規(guī)則,掌握簡單的 lex 語法和規(guī)則; 2、 在上述基礎(chǔ)上能夠自主編寫出簡單且可以運行的詞法分析器,實現(xiàn)簡單的詞法分析功能;3、 通過實驗,設(shè)計編制調(diào)試一個具體的詞法分析程序,加深對詞法分析原理的理解,并掌握在對程序設(shè)計語言源程序進行掃描過程中將其分解為各類單詞的詞法分析方法。1.1.2 功能描述本次編制調(diào)試的詞法分析器基本可以實現(xiàn)如下簡單功能: 1、 可以匹配識別關(guān)鍵字:else if switch for int float retu

2、rn void while(所有的關(guān)鍵字都是保留字,并且必須是小寫) ;2、 可以匹配識別專用符號: + - * / < <= > >= = != = ; ,( ) /* */; 3、 標識符(ID) 和數(shù)字(NU )通過下列正則表達式定義: ID = letter letter* NUM = digit digit* letter = a|.|z|A|.|Z digit = 0|.|9;4、可以匹配識別空格(空格由空白、換行符和制表符組成,空格通常被忽略,除了它必須分開 ID、NUM 關(guān)鍵字); 5、可以識別簡單的注釋(/* 注釋內(nèi)容*/) ;1.1.3 開發(fā)環(huán)境及工

3、具介紹1、Window環(huán)境下載Visual Studio之后,利用其命令提示窗口進行操作。下載并安裝Flex。 2、vs2010的編譯器cl.exe。3、flex:詞法分析器 Flex是用來生成程序的工具,他們所生成的程序能夠處理結(jié)構(gòu)化輸入,最初的Flex是用來生成編譯器的,但是后來他們被證明在其他領(lǐng)域也非常有效。Flex是一個SourceForge項目。其依賴于GNU m4宏處理器。Linux和BSD都應(yīng)該有m4,對于Windos用戶來說,F(xiàn)lex被包含在Cygein Linux模擬環(huán)境中。什么是FLEX?它是一個自動化工具,可以按照定義好的規(guī)則自動生成一個C函數(shù)yylex(),也

4、成為掃描器(Scanner)。這個C函數(shù)把文本串作為輸入,按照定義好的規(guī)則分析文本串中的字符,找到符合規(guī)則的一些字符序列后,就執(zhí)行在規(guī)則中定義好的動作(Action)。例如在規(guī)則中可以這樣定義:如果遇到一個換行字符n,那么就把行計數(shù)器的值加一。Flex文件就是一個文本文件,內(nèi)容包括定義好的一系列詞法規(guī)則。1.2 系統(tǒng)概要設(shè)計1.2.1 系統(tǒng)體系結(jié)構(gòu) 圖1-1 體系結(jié)構(gòu)圖 圖1-2 詞法分析流程圖1.2.2 系統(tǒng)模塊劃分Lex 工具是一種詞法分析程序生成器,它可以根據(jù)詞法規(guī)則說明書的要求來生成單詞識別程序, 由該程序識別出輸入文本中的各個單詞。 一般可以分為<定義部分><規(guī)則部

5、分>< 用戶子程序部分>。其中規(guī)則部分是必須的,定義和用戶子程序部分是任選的。 (1) 定義部分:定義部分起始于 % 符號,終止于 % 符號,其間可以是包括 include 語句、聲明語句在內(nèi)的 C 語句。這部分跟普通 C 程序開頭沒什么區(qū)別。 (2) 規(guī)則部分:規(guī)則部分起始于"%"符號,終止于"%"符號,其間則是詞法規(guī)則。詞 法規(guī)則由模式和動作兩部分組成。模式部分可以由任意的正則表達式組成,動作部分是由 C 語言語句組成,這些語句用來對所匹配的模式進行相應(yīng)處理。需要注意的是,lex 將識 別出來的單詞存放在 yytext字符數(shù)據(jù)中,

6、因此該數(shù)組的內(nèi)容就代表了所識別出來的單詞 的內(nèi)容。類似 yytext 這些預定義的變量函數(shù)會隨著后面內(nèi)容展開一一介紹。動作部分如 果有多行執(zhí)行語句,也可以用括起來。 (3) 用戶子程序部分:最后一個%后面的內(nèi)容是用戶子程序部分,可以包含用 C 語言 編寫的子程序,而這些子程序可以用在前面的動作中,這樣就可以達到簡化編程的目的。這里需要注意的是,當編譯時不帶-ll 選項時,是必須加入 main 函數(shù)和 yywrap(yywrap 將 下后面說明)。 Lex 其實就是詞法分析器, 通過配置文件*.l,依據(jù)正則表達式逐字符去順序解析文件, 并動態(tài)更新內(nèi)存的數(shù)據(jù)解析狀態(tài)。Lex 善長于模式匹配。詞法分

7、析的基本任務(wù)是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據(jù)掃描到單詞符號的第一個字符的種類,拼出相應(yīng)的單詞符號。詞法分析階段是編譯過程的第一個階段,是編譯的基礎(chǔ)。這個階段的任務(wù)是從左到右一個字符一個字符地讀入源程序,即對構(gòu)成源程序的字符流進行掃描然后根據(jù)構(gòu)詞規(guī)則識別單詞(也稱單 詞符號或符號)。詞法分析的核心任務(wù)是掃描、識別單詞且對識別出的單詞給出定性、定長的處理;實現(xiàn)詞法分析程序的常用途徑:自動生成, 手工生成。1.3 詳細設(shè)計與實現(xiàn)1.3.1 Lex代碼的設(shè)計與實現(xiàn)lex 源代碼編寫 通過對 flex 的語法學習,掌握了編寫的基本原則和步驟,因為實驗要求編寫一個簡

8、單地詞法分析器,根據(jù)實驗所要求實現(xiàn)檢查分析的功能,實驗代碼較為簡單,以下是自己 編寫的實驗代碼:letter a-zA-Z_ 定義字母letter dight 0-9 定義數(shù)字dight ID letter(letter)* 定義單詞ID由若干個字母組成 NUM dight(dight)* 定義數(shù)字串NUM由若干個數(shù)字組成 B letter(dight|letter)* 定義標識符B 由數(shù)字戒字母組成 % int nchar, nword, nline; nchar 字符數(shù) nword單詞數(shù) nline 行數(shù)int line=1; line 為當前行數(shù) 初始化為1 % % "else

9、"|"if"|"else if"|"switch"|"for"|"int"|"float"|"return"|"void"|"while" nword+;nchar+=yyleng;printf("第 %d 行:t",line);printf("關(guān)鍵字: %sn",yytext); 若匹配上 else int float 等上述的關(guān)鍵字:單詞數(shù)+1;字符數(shù)增加相應(yīng)的個

10、數(shù); 輸出“第line 行 yytext n”; B nword+;nchar+=yyleng;printf("第 %d 行:t",line);printf("標識符: %sn",yytext); B nword+;nchar+=yyleng;printf("第 %d 行:t",line);printf("標識符: %sn",yytext); 若匹配上B 標識符:單詞數(shù)+1;字符數(shù)增加相應(yīng)的個數(shù); 輸出“第line 行 標識符:yytext n”; NUM nword+;nchar+=yyleng;printf(&

11、quot;第 %d 行:t",line);printf("數(shù)字: %sn",yytext); 若匹配上NUM數(shù)字:單詞數(shù)+1;字符數(shù)增加相應(yīng)的個數(shù); 輸出“第line 行 數(shù)字:yytext n”;+|-|*|/|<|>|=|;|,|(|)| nchar+=yyleng;printf("第 %d 行:t",line);printf("與 %sn",yytext); 若匹配上+ - * / 等與:字符數(shù)增加相應(yīng)的個數(shù); 輸出“第line 行 與 yytext n”; <=|>=|=|!=|/*|*/ n

12、word+;nchar+=yyleng;printf("第 %d行:t",line);printf("與 %sn",yytext); 若匹配上< = > 等與 :字符數(shù)增加相應(yīng)的個數(shù); 輸出“第line 行 與 yytext n”; t+ nchar+; 若匹配上制表符:字符數(shù)+1;無輸出; n nline+;line+;nchar+; 若匹配上回車n:字符數(shù)+1;行數(shù)+1;當前行數(shù)line+1;無輸出; tn+ nword+;nchar+=yyleng;printf("第 %d 行:t",line);printf(&qu

13、ot;其他符號: %sn",yytext); 若匹配上其他符號:字符數(shù)增加相應(yīng)的個數(shù);輸出“第line 行 其他符號:yytext n”; % void main() yylex(); 調(diào)用 yylex 函數(shù) printf("字符數(shù): %dt 單詞數(shù): %dt 行數(shù): %dn", nchar, nword,nline); 最后輸出字符數(shù)、單詞數(shù)、行數(shù) int yywrap() return 1; 最后將這些代碼按照 flex 語法進行整合得到完整 flex 源碼,得到源程序 lex1.l; 1.3.2 定義部分的設(shè)計與實現(xiàn)定義部份由C語言代碼、模式的宏定義、條件模

14、式的開始條件說明三部份組成。其中,C代碼部份由頂行的%和%引入,LEX掃描源文件時將%和%之間的部分原封不動的拷貝到輸出文件lex.yy.c中。上面的定義部分沒有條件模式的開始條件說明部分,只有C語言代碼、模式的宏定義。模式宏定義是一個正則表達式的定義,如上面所示的INTEGER -+?1-90-9*。正則表達式的匹配如下: 模式 解 釋 x 配置單個字母x . 匹配除換行符n之外的任意字符 xyz 匹配x、y或z  abj-oz 匹配a、b、z及j至o之間的字母  

15、;A-Z 除大寫字母A-Z之外的其它字符 A-Zn  除大寫字母A-Z和換行符之外的其它字符 r* 匹配0個或多個r r+ 匹配1個或多個r  r? 匹配0個或1個r 1.3.3 規(guī)則部分的設(shè)計與實現(xiàn) 規(guī)則部份是LEX源文件的核心部份,它包括一組模式和在生成分析器識別相應(yīng)模式后對相應(yīng)模式進行處理的C語言動作(Action)。格式如下C語言代碼模式1 動作1模式2 |模式3 動作3同定義部分一樣,C語言代碼必須出現(xiàn)在第一個模式之前,包括在%和%之中,且%必須

16、頂行書寫。%和%之間的代碼部份可用來定義yylex()用到的局部變量。模式必須頂行書寫。模式可為正規(guī)式或用括起且在定義部份定義過的宏名。動作為用括起的C代碼。且開始括號與模式之間用白字符隔開,且須和模式在同一行上。注意,在模式后加一|表示模式2和3采用同一動作3.|和模式2以白字符隔開。1.3.4 模式匹配模塊的設(shè)計與實現(xiàn)yylex()函數(shù)被調(diào)用之后,它首先檢查全局文件指針變量yyin是否有定義,如有,則將之設(shè)置為將要掃描的文件指針。如無,則設(shè)置為標準輸入文件stdin.同理,如全局文件指針變量yyout無定義,則將之設(shè)置為標準輸出文件stdout。若有多個模式與被掃描文件中的字符串相匹配,則

17、yylex()執(zhí)行能匹配最長字符串的模式,稱為“最長匹配原則”;若還有多個模式匹配長度相同的字符串,則yylex()選擇在LEX源文件中排列最前面的模式進行匹配,稱為“最先匹配原則”。yylex()常通過超前搜索一個字符來實現(xiàn)這樣的原則,如果使用超前搜索匹配了某一模式,則yylex()在進行下一次分析前,將回退一個字符。1.4 系統(tǒng)分析與測試1.4.1 測試用例設(shè)計詞法分析一個C+程序:#include iostreamusing namespace stdint maincout "Hello! "<<endlcout "Welcome to c+! " endlReturn1.4.2 測試結(jié)果1、把lex2源代碼保存到flex安裝目錄中2、進入flex安裝目錄 > cd C:GnuWin32bin 3、調(diào)用flex.exe > flex.exe -o"lex2.yy.c" lex2.l 4、調(diào)用VS2010編譯器cl.exe 圖1-3 運行結(jié)果15. 輸入>lex2.yy.exe < 1-1.cpp得到輸出結(jié)果 圖1-4 運行結(jié)果21.5 結(jié) 論1.5.1 本文工作和成果本次實驗通過對 flex 基本知識的

溫馨提示

  • 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

提交評論