2011-11-01 22 views
0

我想使用yy_scan_bytes(),因为我有定义规则的空字符。我的问题是我的字符串可以匹配多个规则。我想要掌握所有匹配的规则。我想一次性提供yylex()函数一个字符,并检查是否匹配。我尝试了下面的代码进行测试,但这不起作用。带有多个缓冲区的lex flex扫描程序

for(int i=0;i<length;i++) 
{ 
    yy_scan_bytes(&temp[i],1); 
    index=TomsonTalkslex(); 
} 

为了简单起见,我只是返回从扫描仪匹配规则的索引。 temp是一个char缓冲区。我尝试使用yy_switch_to_buffer(yy_scan_bytes(& temp [i],1));但这没有奏效。

如何告诉扫描程序不要重置其状态并继续处理具有相同状态的后续缓冲区。

+0

为什么你需要使用扫描字节?默认情况下,yylex每次读取一个字符直到EOF,所以空字节应该正常读取。另外,您是否希望保存当前缓冲区状态,以便以后使用此缓冲区,或者在切换缓冲区时使用新缓冲区的*最后一个缓冲区状态保持状态*? –

+0

我在运行时输入了数据,所以我需要使用扫描字节。我也想为每个字符调用yylex,我不想让它重置状态机,这就是为什么我想保存缓冲区状态。我想用新的缓冲区使用我的最后缓冲区状态。例如,我有2个规则,一个用于匹配ab和另一个用于游行cd。如果我输入“abcd”来扫描字节,它将只返回一个我认为是cd的匹配。我想要规则,ab处理时需要ab规则,cd处理时cd,这只能通过扫描字节完成。 – Saba

回答

1

好吧,这只是对lex/flex如何工作的误解。默认情况下,yylex挂钩到stdin,读取直到它接收到EOF,并匹配每个规则。这就是为什么它是一个标记器。因此,下面的示例程序将从标准输入读取,直到您输入-c发送EOF。

%option 8bit outfile="scanner.c" 
%option nounput nomain noyywrap 
%option warn 

%% 

ab { fprintf(yyout, "We ran the ab rule.\n"); } 
cd { fprintf(yyout, "We ran the cd rule.\n"); } 

    // echo everything else we find to yyout 
. { ECHO; } 
\n { ECHO; } 

%% 

编译上面,使用:

flex -Cf scanner.l 
gcc -O -o flexer.exe scanner.c 

保存源文件scanner.l当你做到这一点。一旦编译完成,您将在同一个目录中获得一个名为flexer.exe的文件。从终端运行它,你会得到一个空白提示等待输入。您输入的所有内容都会根据规则进行尝试和匹配,直到您找到一个匹配项为止。然后它将执行与规则相关的代码。

因此,如果您键入abcd,那么您将匹配abcd规则。

我建议您阅读lex and yacc以获得更详细的介绍。

+0

嗯,我真的想要做同样的事情,但不想使用stdin,我想用扫描字节来完成。我从lex和yacc手册尝试了很多东西,但没有一个适用于扫描字节。我想调用我的原始文章中的代码中给出的扫描字节。 – Saba

+0

@Saba [flex手册](http://flex.sourceforge.net/manual/Multiple-Input-Buffers.html#Multiple-Input-Buffers)表示yy_scan_bytes在每次调用时切换到新创建的缓冲区。我不认为它会做你想做的。 –

+0

谢谢Spencer,有没有其他方法可以做我想做的,但我想在内存缓冲区中使用:( – Saba