用Lex做词法分析
用Lex做詞法分析
Lex編譯器將輸入的模式轉(zhuǎn)換成一個(gè)狀態(tài)轉(zhuǎn)換圖,并生成相應(yīng)的實(shí)現(xiàn)代碼,并存放到文件lex.yy.c中,這些代碼模擬了狀態(tài)轉(zhuǎn)換圖。
用Lex創(chuàng)建一個(gè)詞法分析器
沖突解決規(guī)則:
1) 總是選擇最長(zhǎng)的前綴
2) 如果最長(zhǎng)的可能前綴與多個(gè)模式匹配,總是選擇Lex中先被列出的模式。
【實(shí)驗(yàn)步驟】
1、實(shí)驗(yàn)環(huán)境配置
安裝Parser Generator,并編譯lex和yacc函數(shù)庫(kù)使用向?qū)渲脮r(shí),用的VS2010,屬性設(shè)置如下(有些庫(kù)是用的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)練習(xí)3.5.2:編寫一個(gè)Lex程序。該程序拷貝一個(gè)文件,并將文件中的每個(gè)非空的空白符序列替換為單個(gè)空格。編寫Lex程序如下:
[plain]?view plaincopy
[plain]?view plaincopy
實(shí)驗(yàn)結(jié)果 讀入文件:
替換掉空白符后結(jié)果:
(2)練習(xí)3.5.3:編寫一個(gè)Lex程序。該程序拷貝一個(gè)C文件,并將程序中的關(guān)鍵字float的每個(gè)實(shí)例替換成double
編寫Lex程序如下:
[plain]?view plaincopy
[plain]?view plaincopy
在這句話前面加上 [plain]?view plaincopy
實(shí)驗(yàn)結(jié)果 讀入C文件:
替換掉關(guān)鍵字float后如下:
(3)練習(xí)3.5.4:編寫一個(gè)Lex程序。該程序把一個(gè)文件改變成為“Pig latin”文。明確的講,假設(shè)該文件是一個(gè)用空白符分隔開的單詞(即字母串)序列。每當(dāng)你遇到一個(gè)單詞時(shí):
1)如果第一個(gè)字母是輔音字母,則將它移到單詞結(jié)尾,并加上ay
2)如果第一個(gè)字母是元音字母,則只在單詞的結(jié)尾加上ay
所有非字母的字符不加處理直接拷貝到輸出
編寫Lex程序如下:
[plain]?view plaincopy
[plain]?view plaincopy
實(shí)驗(yàn)結(jié)果 輸入aword bword “word”,轉(zhuǎn)換成“Pig Latin”文結(jié)果:
【結(jié)果分析】
(1)通過實(shí)驗(yàn)熟悉了Lex做詞法分析。在定義規(guī)則時(shí),對(duì)Lex解決沖突的兩個(gè)原則體會(huì)尤深——總是選擇最長(zhǎng)的前綴;如果最長(zhǎng)的可能前綴與多個(gè)模式匹配,總是選擇Lex中先被列出的模式。(2)實(shí)驗(yàn)中幾個(gè)題目并不復(fù)雜,但卻很難考慮到所有的情況,如第二個(gè)練習(xí)替換float時(shí),不能只遇到float即可,還要判斷其是否為關(guān)鍵字。在后面發(fā)現(xiàn)實(shí)驗(yàn)中忘了考慮float單詞出現(xiàn)在注釋中的情況。不過考慮方法和進(jìn)階實(shí)驗(yàn)中的考慮相似。
轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7760927
總結(jié)
- 上一篇: 正则表达式Regular Express
- 下一篇: 多个类的DLL封装及调用