標籤:lex helloworld 詞法分析器
lex和yacc可以協助你編寫程式轉換結構化輸入。既包括從輸入檔案中尋找模式的簡單文本搜尋程式,也包括將來源程式變換為最佳的目標代碼的C編譯器等。
?lex使用一系列對可能標記的描述,產生一個能識別那些標記的C常式(我們成為詞法分析器。詞法剖析器(lexer),或成為掃描程式)。
?lex使用的標記描述稱為Regex。yacc採用簡明的文法描述併產生在一個能分析文法的C常式。即剖析器。yacc剖析器自動檢測輸入的標記序列是否匹配文法中的某條規則,並且一旦輸入不匹配任一條規則,他就會檢測語法錯誤。
最簡單的lex程式
?%% ?.|\n ?ECHO?%%
?將它的標準輸入拷貝到標準輸出。
?用lex識別單詞
?構建一個識別不同類型英語單詞的簡單程式。識別動詞和非動詞
?
%{ /** * 這個例子示範了非常簡單的識別 * 動詞/非動詞 */ /** * {% %}為定義部分,定義一個段,介紹了將拷貝到最終程式中的 * 原始C程式碼。也就是說這一部分的內容C程式裡面是可以使用 * 的。如果有後來檔案中必須包含的標頭檔,那麼也需要在這裡面 * 包含。其中,{% %}裡面的內容使用C實現,lex將其中的內容直接 * 拷貝到產生的C檔案。 * * lex中的注釋必須使用空白符縮排來正確標識,否則將會被lex * 解釋成別的東西。 * 後面的%%標記這一部分結束 * 下面一部分是規則段,每個規則都有兩部分組成,模式和動作, * 由空白分開。當lex產生的詞法剖析器識別出某個模式時,將 * 執行相應的動作,其中模式是unix樣式的Regex */ /** * 規則"|"表示下一個模式應用相同的動作,因此所有的 * 動詞都使用為最後一個動詞指定的動作 * * island為什麼不匹配is而是匹配island或者是兩者都匹配呢? * * yytext數組包含匹配模式的文本 * lex有一套簡單的消除歧義規則: * 1:lex模式只匹配輸入字元或字串一次 * 2:lex執行當前輸入的最長可能匹配的動作。 * 因為lsland是比is長的匹配u,所以lex把island * 來看做匹配上面那條“包括一切”的規則 * * 最後一行是預設情況語句。"."匹配分行符號意外的任意單個字元, * "\n"匹配一個分行符號,ECHO輸出匹配的模式。 * * 最後部分是使用者子常式序,有任意合法的C程式碼群組成。 * * 使用命令進行編譯 * lex simple.lex //產生lex.yy.c * gcc lex.yy.c -o simple * */%}%%[\t ]+ /* 忽略空白 */;is |am |are |were |was |be |being |been |do |does |did |will |would |should |can |could |has |have |had |go {printf("%s : is a verb\n",yytext);}[a-zA-Z]+ {printf("%s: is not a verb\n",yytext);}.|\n {ECHO; /* 通常的預設狀態 */}%%int main(){ yylex(); return 0;}?//必須要包含的函數int yywrap(){ return 1;}
下面是我的程式的運行結果:
最簡單的lex的例子