Flex 词法分析器未按预期运行

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 也不是大写字母 (A-Z)。然后匹配一个q.

这里值得考虑所有不是 q 也不是大写字母 (A-Z) 的东西。显然,这包括 lower-case 个字母,例如 sq 除外)。它还包括数字。它包括任何其他字符:标点符号、空格,甚至控制字符。特别是,它包含一个换行符。

所以当你输入

10s10<newline>

那肯定是最后一个模式的开始。扫描器还没有看到 q 所以它不知道模式是否最终会匹配,但它还没有失败。所以它继续阅读更多字符,包括更多换行符。

当您最终键入 q 时,扫描器可以继续模式的其余部分。根据您接下来键入的内容,它可能会或可能不会继续。如果,看起来很可能,你的输入最终无法匹配模式,词法分析器将回退到最长的成功匹配,这是第一个模式。届时,它将执行第一个动作

否定字符类需要谨慎使用。很容易陷入“不……”只包括“合理”输入的思维陷阱。但它包括一切。通常,在这种情况下,您至少要排除换行符。,