flex-lexer - 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());
}
解决了愚蠢的问题
解决方案
我不知道您要做什么,所以我将专注于当前的问题,这是您的最后一个模式:
^[^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
时,扫描仪可以继续该模式的其余部分。根据您接下来键入的内容,它可能会或可能无法继续。如果看起来很可能,您的输入最终无法匹配模式,词法分析器将回退到最长的成功匹配,这是第一个模式。此时,它将执行第一个动作
需要谨慎使用负字符类。很容易陷入认为“不是……”只包括“合理”输入的陷阱。但它包括一切。通常,在这种情况下,您至少需要排除换行符。
推荐阅读
- python - Python cv2 VideoWriter 文件损坏
- ruby-on-rails - Rails 创建方法创建副本
- c# - 如何创建绑定到对象的文本框
- angular - Angular:json-pipe显示属性时无法读取未定义的属性
- python - 如何解决 PySpark 中的 SQL ParseError?
- laravel - 仅在 Gitlab CI 中测试失败,本地成功
- javascript - 通过ajax从php请求数据
- android-things - 如何用 Oreo/Kitkat/lollipop 或类似的完整 Android 操作系统替换 AoT 操作系统
- php - 来自谷歌字体的印地语字体在带有elfinder的cakephp中集成的tinymce编辑器中不起作用
- c++ - 将 double 添加到 long long 时的 C++ 精度错误