首页 > 解决方案 > Flex 词法分析器未按预期运行

问题描述

我正在尝试使用 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());
             }

解决了愚蠢的问题

标签: flex-lexer

解决方案


我不知道您要做什么,所以我将专注于当前的问题,这是您的最后一个模式:

^[^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) 的东西。显然,这包括小写字母,例如s(除q)。它还包括数字。它包括任何其他字符:标点符号、空格,甚至控制字符。特别是,它包括一个换行符。

所以当你输入

10s10<newline>

这当然可能是最后一个模式的开始。扫描仪还没有看到 aq所以它不知道模式是否最终会匹配,但它还没有失败。所以它继续阅读更多的字符,包括更多的换行符。

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

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


推荐阅读