第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  

www.18ie.com 欢迎留言

飞涛软件工作室
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

全部文章