用Lex做词法分析
用Lex做詞法分析
Lex編譯器將輸入的模式轉換成一個狀態轉換圖,并生成相應的實現代碼,并存放到文件lex.yy.c中,這些代碼模擬了狀態轉換圖。
用Lex創建一個詞法分析器
沖突解決規則:
1) 總是選擇最長的前綴
2) 如果最長的可能前綴與多個模式匹配,總是選擇Lex中先被列出的模式。
【實驗步驟】
1、實驗環境配置
安裝Parser Generator,并編譯lex和yacc函數庫使用向導配置時,用的VS2010,屬性設置如下(有些庫是用的VC++6.0)
Compiler Bin Directory C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 10.0\VC\BIN
Compiler Bin Directory(2) C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 10.0\COMMON7\IDE
Compiler Include Directory C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 10.0\VC\INCLUDE
Compiler Include Directory(2) C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\INCLUDE
Compiler Library Directory C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 10.0\VC\LIB
Compiler Library Directory(2) C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\LIB
2、編寫Lex程序
(1)練習3.5.2:編寫一個Lex程序。該程序拷貝一個文件,并將文件中的每個非空的空白符序列替換為單個空格。編寫Lex程序如下:
[plain]?view plaincopy
[plain]?view plaincopy
實驗結果 讀入文件:
替換掉空白符后結果:
(2)練習3.5.3:編寫一個Lex程序。該程序拷貝一個C文件,并將程序中的關鍵字float的每個實例替換成double
編寫Lex程序如下:
[plain]?view plaincopy
[plain]?view plaincopy
在這句話前面加上 [plain]?view plaincopy
實驗結果 讀入C文件:
替換掉關鍵字float后如下:
(3)練習3.5.4:編寫一個Lex程序。該程序把一個文件改變成為“Pig latin”文。明確的講,假設該文件是一個用空白符分隔開的單詞(即字母串)序列。每當你遇到一個單詞時:
1)如果第一個字母是輔音字母,則將它移到單詞結尾,并加上ay
2)如果第一個字母是元音字母,則只在單詞的結尾加上ay
所有非字母的字符不加處理直接拷貝到輸出
編寫Lex程序如下:
[plain]?view plaincopy
[plain]?view plaincopy
實驗結果 輸入aword bword “word”,轉換成“Pig Latin”文結果:
【結果分析】
(1)通過實驗熟悉了Lex做詞法分析。在定義規則時,對Lex解決沖突的兩個原則體會尤深——總是選擇最長的前綴;如果最長的可能前綴與多個模式匹配,總是選擇Lex中先被列出的模式。(2)實驗中幾個題目并不復雜,但卻很難考慮到所有的情況,如第二個練習替換float時,不能只遇到float即可,還要判斷其是否為關鍵字。在后面發現實驗中忘了考慮float單詞出現在注釋中的情況。不過考慮方法和進階實驗中的考慮相似。
轉載請注明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7760927
總結
- 上一篇: 正则表达式Regular Express
- 下一篇: 使用Lex将C/C++文件输出为HTML