带多个缓冲区的lex flex扫描仪

时间:2011-11-01 15:09:52

标签: lex

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

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

为简单起见,我只返回与scanner匹配的规则的索引。 temp是一个char缓冲区。我试图使用yy_switch_to_buffer(yy_scan_bytes(&amp; temp [i],1));但这没用。

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

1 个答案:

答案 0 :(得分:2)

好的,这只是对lex / flex如何工作的误解。默认情况下,yylex挂钩到stdin,读取直到它收到EOF,并匹配每个规则。这就是为什么它是一个标记器。因此,下面的示例程序将从stdin读取,直到您输入-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。编译完成后,您将在同一目录中获得名为flexer.exe的文件。从终端运行它,你会得到一个等待输入的空白​​提示。您键入的所有内容都会尝试与规则匹配,直到您只找到一个匹配项。然后它将执行与规则关联的代码。

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

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