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 个字母,例如 s
(q
除外)。它还包括数字。它包括任何其他字符:标点符号、空格,甚至控制字符。特别是,它包含一个换行符。
所以当你输入
10s10<newline>
那肯定是最后一个模式的开始。扫描器还没有看到 q
所以它不知道模式是否最终会匹配,但它还没有失败。所以它继续阅读更多字符,包括更多换行符。
当您最终键入 q
时,扫描器可以继续模式的其余部分。根据您接下来键入的内容,它可能会或可能不会继续。如果,看起来很可能,你的输入最终无法匹配模式,词法分析器将回退到最长的成功匹配,这是第一个模式。届时,它将执行第一个动作
否定字符类需要谨慎使用。很容易陷入“不……”只包括“合理”输入的思维陷阱。但它包括一切。通常,在这种情况下,您至少要排除换行符。,
我正在尝试使用 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 个字母,例如 s
(q
除外)。它还包括数字。它包括任何其他字符:标点符号、空格,甚至控制字符。特别是,它包含一个换行符。
所以当你输入
10s10<newline>
那肯定是最后一个模式的开始。扫描器还没有看到 q
所以它不知道模式是否最终会匹配,但它还没有失败。所以它继续阅读更多字符,包括更多换行符。
当您最终键入 q
时,扫描器可以继续模式的其余部分。根据您接下来键入的内容,它可能会或可能不会继续。如果,看起来很可能,你的输入最终无法匹配模式,词法分析器将回退到最长的成功匹配,这是第一个模式。届时,它将执行第一个动作
否定字符类需要谨慎使用。很容易陷入“不……”只包括“合理”输入的思维陷阱。但它包括一切。通常,在这种情况下,您至少要排除换行符。,