[英]Flex lexical analyzer not behaving as expected
我正在尝试使用 Flex 来匹配基本模式并打印一些东西。
%%
^[^qA-Z]*q[a-pr-z0-9]*4\n {printf("userid1, userid2 \n"); return 1;}
%%
int yywrap(void){return 1;}
int main( int argc, char **argv )
{
++argv, --argc; /* skip over program name */
if ( argc > 0 )
yyin = fopen( argv[0], "r" );
else
yyin = stdin;
while (yylex());
}
解决了愚蠢的问题
我不知道你想做什么,所以我会关注眼前的问题,这是你的最后一个模式:
^[^qA-Z]*q[a-pr-z0-9]*4[a-pr-z0-9]*4[a-pr-z0-9]*\n
该模式首先匹配[^qA-Z]*
,它是任意数量的任何不是q
也不是大写字母 ( AZ
) 的东西。 然后它匹配一个q
。
这里值得考虑所有不是q
也不是大写字母 ( AZ
) 的东西。 显然,这包括小写字母,例如s
( q
除外)。 它还包括数字。 它包括任何其他字符:标点符号、空格,甚至控制字符。 特别是,它包括一个换行符。
所以当你输入
10s10<newline>
那当然可能是最后一个模式的开始。 扫描仪还没有看到q
所以它不知道模式最终是否会匹配,但它还没有失败。 所以它会继续读取更多的字符,包括更多的换行符。
当您最终键入q
,扫描仪可以继续处理模式的其余部分。 根据您接下来键入的内容,它可能会或可能无法继续。 如果,看起来很可能,您的输入最终无法匹配模式,词法分析器将回退到最长的成功匹配,即第一个模式。 此时,它将执行第一个动作
需要谨慎使用负字符类。 很容易陷入认为“不……”只包括“合理”输入的陷阱。 但它包括一切。 通常,在这种情况下,您至少要排除换行符。,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.