日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

用Lex做词法分析

發(fā)布時(shí)間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Lex做词法分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

用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
  • [\t]+??{printf(“”);}??
  • 表示遇到連續(xù)多個(gè)空白符(或制表符),則替換為一個(gè)空格符
    [plain]?view plaincopy
  • \n|.????{printf(“%s”,yytext);}??
  • 表示其余的語(yǔ)句均照常打印出來
    實(shí)驗(yàn)結(jié)果 讀入文件:

    替換掉空白符后結(jié)果:

    (2)練習(xí)3.5.3:編寫一個(gè)Lex程序。該程序拷貝一個(gè)C文件,并將程序中的關(guān)鍵字float的每個(gè)實(shí)例替換成double
    編寫Lex程序如下:


    [plain]?view plaincopy
  • \”.*\”??{printf(“%s”,yytext);}??
  • 表示如果是在雙引號(hào)(“)中(即為字符串),則照常打印
    [plain]?view plaincopy
  • float/[?\t]+??{printf(“double”);}??
  • 表示如果遇到float,且附加模式是后面跟有空白符,則將float替換為double
    在這句話前面加上 [plain]?view plaincopy
  • [^?\t\n]+?{printf(“%s”,yytext);}??
  • (連續(xù)的非空白符),是為了保證當(dāng)float并非關(guān)鍵字時(shí),如afloat,不會(huì)被替換為adouble.

    實(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
  • {YuanYin}({Letter})*/[?\t\n]+?{printf(“%say”,yytext);}??
  • 表示遇到元音字母開頭的字母串,且附加模式跟有空白符(確保為單詞),則在單詞結(jié)尾加上ay
    [plain]?view plaincopy
  • {FuYin}({Letter})*/[?\t\n]+?{printf(”%s%cay”,&yytext[1],yytext[0]);}??
  • 表示遇到輔音字母開頭的字母串,且附加模式跟有空白符(確保為單詞),則從單詞第二個(gè)字母開始輸出,之后輸出第一個(gè)字母,再在結(jié)尾加上ay
    實(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é)

    以上是生活随笔為你收集整理的用Lex做词法分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。