如何调试flex(lexer)文件?警告,提供-s选项,但可以匹配默认规则。

时间:2019-02-12 22:47:05

标签: flex-lexer

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);
}

1 个答案:

答案 0 :(得分:0)

您有一个模式

<STRING>\\[\\"]

和(实际上)是

<STRING>[^\\]

但是您没有与\\以外的"匹配的模式:

<STRING>\\[^\\"]

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

<STRING>\\

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

<STRING><<EOF>>

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

不幸的是,据我所知,flex并没有告诉您哪个字符串可能触发默认操作。该功能已被要求两次。但是,通常只需按顺序依次为每个状态编写正则表达式就可以很容易地看出缺少的内容。 (根据我的经验,最难发现的遗漏是由于EOF过早造成的。)