如何调试flex(lexer)文件? `warning,-s选项,但默认规则可以匹配

问题描述 投票:0回答:1
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);
}
flex-lexer
1个回答
0
投票

你有一个模式

<STRING>\\[\\"]

和(实际上)

<STRING>[^\\]

但你没有与\匹配的模式,其次是\"以外的东西:

<STRING>\\[^\\"]

此外,您没有在输入的最后匹配\的模式

<STRING>\\

最后,如果它出现在字符串的中间,则没有与EOF匹配的模式

<STRING><<EOF>>

%option nodefault不关心<<EOF>>默认规则,但您可能希望发出错误消息。)

不幸的是,flex不会(据我所知)告诉你哪个字符串可能触发默认操作。该功能已被要求了几次。但是,通过按顺序依次为每个状态编写正则表达式,通常很容易看出缺少什么。 (根据我的经验,最难以看到的遗漏是早产EOF造成的遗漏。)

© www.soinside.com 2019 - 2024. All rights reserved.