Flex語法淺析

不了解Flex的同學(xué),可以先溫習(xí)一下上一節(jié)的內(nèi)容Flex和Bison背景介紹

字?jǐn)?shù)統(tǒng)計(jì)實(shí)例介紹

我們先通過一個(gè)例子來給大家介紹Flex的語法規(guī)則,這個(gè)例子的主要作用是統(tǒng)計(jì)我們輸入內(nèi)容的行數(shù),單詞數(shù)和字符數(shù),代碼示例如下:

%option noyywrap
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
/*
1. 變量yytext總是被設(shè)為指向本次匹配的輸入文本
2. . 在正則表達(dá)式中代表任意一個(gè)字符

**/
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n        { chars++; lines++;}
.         { chars++;}
%%

int main(int argc, char **argv)
{
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
}

整個(gè)程序結(jié)構(gòu)包含三個(gè)部分,各部分通過%%來分割。
第一部分主要包含聲明和選項(xiàng)設(shè)置。在聲明部分%{%}之間的代碼會(huì)直接拷貝到C文件的開頭部分,示例代碼中主要是聲明了三個(gè)整形變量,用來分別統(tǒng)計(jì)字符數(shù),單詞數(shù)和行數(shù)。

第二部分主要包含匹配模式和相應(yīng)的動(dòng)作。在示例代碼中第一條正則表達(dá)式[a-zA-Z]+主要用來匹配一個(gè)單詞,當(dāng)成功匹配到單詞后,會(huì)將變量word1,同時(shí)將字符數(shù)加上單詞的長(zhǎng)度(strlenC語言中獲取字符串長(zhǎng)度的庫函數(shù)),第二條\n匹配換行符,當(dāng)成功匹配后,行數(shù)加1,字符數(shù)也加1,最后一條.匹配的是除換行符 \n之外的任何單字符,匹配成功以后字符數(shù)加1。

第三部分則是直接拷貝到詞法分析器中的C代碼。在示例代碼中會(huì)將主函數(shù)拷貝到生成的C文件中,當(dāng)運(yùn)行程序時(shí),會(huì)首先調(diào)用main函數(shù),在其內(nèi)部負(fù)責(zé)調(diào)用Flexyylex函數(shù)開始詞法分析,并打印出分析之后的結(jié)果,包括行數(shù),單詞數(shù),字符數(shù)。

編譯和運(yùn)行示例代碼

在Mac平臺(tái)下編譯示例如下:

% flex fb1_1.l
% gcc lex.yy.c -o fb1 -lm

如果是Window或者Linux下編譯,鏈接選項(xiàng)更改為-lfl,當(dāng)?shù)谝恍忻顖?zhí)行完以后當(dāng)前文件夾下應(yīng)該會(huì)生成一個(gè)lex.yy.c文件,有興趣的同學(xué)可以對(duì)照著上面的示例代碼比對(duì)一下,看一看Flex是如何處理我們的示例代碼的。當(dāng)?shù)诙忻顖?zhí)行完以后,當(dāng)前文件夾下應(yīng)該會(huì)生成一個(gè)fb1可執(zhí)行文件,然后執(zhí)行當(dāng)前文件,輸入測(cè)試代碼,按Control+D后會(huì)顯示出統(tǒng)計(jì)的行數(shù),單詞數(shù)和字符數(shù)

% ./fb1 
Hello World
       1       2      12    

通過上面的示例代碼,大家應(yīng)該可以深刻的體會(huì)到,要想編寫好Flex程序,首先要熟悉正則表達(dá)式。

本節(jié)的內(nèi)容就先到這里,謝謝大家~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、基本用法: 注意: 當(dāng)^在[ ]內(nèi)時(shí)表示 "非" ,當(dāng)直接出現(xiàn)在匹配式內(nèi)表示匹配一行的開頭。 二、示例 1. ...
    Minority閱讀 2,717評(píng)論 0 2
  • flex是用來生成程序的工具(最初用來生成編譯器),它所生成的程序能夠處理結(jié)構(gòu)化輸入?;A(chǔ):了解正則表達(dá)式和編譯原...
    Dakini_Wind閱讀 1,538評(píng)論 0 2
  • 一、Ubuntu安裝flex 在ubutu上安裝 yacc的命令: sudo apt-get install fl...
    Minority閱讀 10,582評(píng)論 0 3
  • 最近在看 《Flex & Bison》 這本書, 針對(duì)書中的例子進(jìn)行解讀和筆記, 以消化每一個(gè)知識(shí)細(xì)節(jié), 所以本文...
    ManateeLazyCat閱讀 4,787評(píng)論 2 5
  • 一、概要 對(duì)于模版,其實(shí)就是讀取模版(其中嵌套著模版標(biāo)簽),然后將模型中獲取的數(shù)據(jù)插入到模版中,最后將信息返回給用...
    好好他爸爸閱讀 314評(píng)論 0 0

友情鏈接更多精彩內(nèi)容