第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;
}

附图如下: 

yy_scan_string

 

1 Comment »

  1. wilbur said,

    February 9, 2008 @ 13:38

    恩 不错 谢谢

    我正在学这个

    qq:724881183

RSS feed for comments on this post · TrackBack URI

发表评论


0.013 sec