首页 > 代码库 > lex/flex 笔记

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

 

lex/flex 笔记