warning, -s option given but default rule can be matched
当我使用以下flex文件时,我收到了上述警告。我不知道如何调试规则。有谁能告诉我找出问题的最简单方法?
%option nodefault
%x STRING
%%
const char fmt[] = "%s\t%s\t%s\n";
<INITIAL>\" {
BEGIN(STRING);
fprintf(yyout, fmt, "<INITIAL>\\\"", yytext, "");
}
<INITIAL>[^"\n] {
fprintf(yyout, fmt, "<INITIAL>[^\"\\n]", yytext, yytext);
}
<INITIAL>\n {
fprintf(yyout, fmt, "<INITIAL>\\n", "\\n", "");
}
<STRING>\\[\\"] {
fprintf(yyout, fmt, "<STRING>\\\"", yytext, yytext+1);
}
<STRING>\n {
fprintf(yyout, fmt, "<STRING>", "\\n", "\\n");
}
<STRING>\" {
fprintf(yyout, fmt, "<STRING>\\\"", yytext, "");
BEGIN(INITIAL);
}
<STRING>[^\\"\n]+ {
fprintf(yyout, fmt, "<STRING>[^\\\\\"\\n]+", yytext, yytext);
}
你有一个模式
<STRING>\\[\\"]
和(实际上)
<STRING>[^\\]
但你没有与\
匹配的模式,其次是\
或"
以外的东西:
<STRING>\\[^\\"]
此外,您没有在输入的最后匹配\
的模式
<STRING>\\
最后,如果它出现在字符串的中间,则没有与EOF匹配的模式
<STRING><<EOF>>
(%option nodefault
不关心<<EOF>>
默认规则,但您可能希望发出错误消息。)
不幸的是,flex不会(据我所知)告诉你哪个字符串可能触发默认操作。该功能已被要求了几次。但是,通过按顺序依次为每个状态编写正则表达式,通常很容易看出缺少什么。 (根据我的经验,最难以看到的遗漏是早产EOF造成的遗漏。)