码迷,mamicode.com
首页 > 其他好文 > 详细

lex/flex 笔记

时间:2014-12-16 20:51:16      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   sp   文件   div   log   bs   as   

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 笔记

标签:style   blog   color   sp   文件   div   log   bs   as   

原文地址:http://www.cnblogs.com/zinthos/p/4167871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!