第2个非常简单的lex例子:用内存作为lex的输入缓冲区
lex 默认的输入是从stdio,也就是键盘, 当然也可以传一个文件的fopen返回的handle作为输入。 为了把一段内存里的字符串,作为lex的输入,需要用到yy_switch_to_buffer 和 yy_scan_string 函数。 举1个最简单易懂的例子:
%{
/* filename=string.l */
/* mafeitao www.18ie.com */
//使用方法:
//d:\flex.exe string.l
//flexe.exe生成 了lex.yy.c
//然后,用vc++ 6,就可以直接编译lex.yy.c了//flex生成的代码总是不能通过编译,说缺少yywrap的定义。
//后来多方查找反复试验终于发现,在前面加个%option noyywrap就好了
//软件目的:从缓冲区char * ch 里找出数字,并放到全局变量char global_buffer[100]里面
//注意,缓冲区的长度是一个定数100,可能会溢出的!
//这里仅仅是为了简化程序,便于读者理解,才这么写的!
//如果是正式的软件,建议用stl的容器来做全局变量,才没有溢出的危险!
char global_buffer[100];
%}
%option noyywrap
number [0-9]+
%%
{number} { strcat(global_buffer,yytext);
strcat(global_buffer, " ");
//如果是正式的软件,建议用stl的容器来做全局变量,才没有溢出的危险!
}
. {printf("");}
%%
main()
{
char * ch="abcd1234efg 马飞涛 mafeitao 18ie.com";
yy_switch_to_buffer(yy_scan_string(ch));
yylex();
printf("%s",global_buffer);
return 0;
}
附图如下:
飞涛软件工作室
2006-10-03 23:42:12
Warning: MkDir failed (Disc quota exceeded) in /z1/18ie/public_html/count/html/count.php on line 12
Warning: fopen("/z1/18ie/public_html/count/html/2008_07/06_every.txt", "a+") - No such file or directory in /z1/18ie/public_html/count/html/count.php on line 42
Warning: Supplied argument is not a valid File-Handle resource in /z1/18ie/public_html/count/html/count.php on line 43
Warning: Supplied argument is not a valid File-Handle resource in /z1/18ie/public_html/count/html/count.php on line 46
Warning: Supplied argument is not a valid File-Handle resource in /z1/18ie/public_html/count/html/count.php on line 48
Warning: Supplied argument is not a valid File-Handle resource in /z1/18ie/public_html/count/html/count.php on line 49