lex/flex 笔记
Lex的匹配策略:?
1.?按最長匹配原則確定被選中的單詞?
2.?如果一個字符串能被若干正規式匹配,則先匹配排在前面的正規式。
?
lex源程序的寫法:Lex源程序必須按照Lex語言的規范來寫,其核心是一組詞法規則(正規式)。一般而言,一個Lex源程序分為三部分,三部分之間以符號%%分隔。 ?
定義段
%%
詞法規則段
%%?
輔助函數段
?
Lex源程序中常用到的變量及函數: ?
yyin和yyout:這是Lex中本身已定義的輸入和輸出文件指針。這兩個變量指明了lex生成的詞法分析器從哪里獲得輸入和輸出到哪里。默認:鍵盤輸入,屏幕輸出。 ?
yytext和yyleng:這也是lex中已定義的變量,直接用就可以了。
yytext:指向當前識別的詞法單元(詞文)的指針 yyleng:當前詞法單元的長度。 ?
ECHO:Lex中預定義的宏,可以出現在動作中,相當于fprintf(yyout, “%s”,yytext),即輸出當前匹配的詞法單元。 ?
yylex():詞法分析器驅動程序,用Lex翻譯器生成的lex.yy.c內必然含有這個函數。 ?
yywrap():詞法分析器遇到文件結尾時會調用yywrap()來決定下一步怎么做: 若yywrap()返回0,則繼續掃描 ?若返回1,則返回報告文件結尾的0標記。
?
1. 用lex翻譯器編譯lex源程序命令(假設filename.l是lex源程序名): flex filename.l
2. 用gcc編譯器編譯lex翻譯器生成的c源程序(lex翻譯器生成的c源程序名固定為 lex.yy.c): gcc [-o outfile] lex.yy.c –lfl
其中,-lfl是鏈接flex的庫函數的,庫函數中可能包含類似yywrap一類的標準函數。-o outfile是可選編譯選項,該選項可將編譯生成的可執行程序命名為outfile,如果不寫該編譯選項,默認情況下生成的可執行程序名為a.exe(linux下實際為a.out)。 ?
3. 調用詞法分析器yylex()的main函數可以寫在lex源程序的輔助函數部分,也可以寫在 其他的c文件中。如果main函數寫在main.c中,則編譯時需要和lex.yy.c一起編譯鏈接,即編譯鏈接命令為:gcc [-o outfile] lex.yy.c main.c –lfl
?
1 %{ 2 /*********** 3 Sexy Lexy 4 ***********/ 5 %} 6 %% 7 a+b*a {printf("1%s\n",yytext);} 8 (ab)+c? {printf("2%s\n",yytext);} 9 aa {printf("3%s\n",yytext);} 10 (a|b)*c {printf("4%s\n",yytext);} 11 %% 12 int main() { 13 yyin = stdin; 14 return yylex(); 15 }ababcbacaabaababaa
2ababc
4bac
1aaba
2abab
1aa
?
posted on 2014-12-16 19:33 cyendra 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/zinthos/p/4167871.html
總結
以上是生活随笔為你收集整理的lex/flex 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE DataGuard主备切换
- 下一篇: 免费天气预报接口