Как отладить файл flex (lexer)?`предупреждение, опция -s задана, но правило по умолчанию может быть найдено` - PullRequest
0 голосов
/ 13 февраля 2019
warning, -s option given but default rule can be matched

Я получил вышеупомянутое предупреждение, когда использую следующий гибкий файл.Я не знаю, как отладить правило.Кто-нибудь может показать мне самый простой способ выяснить, что не так?

%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 голосов
/ 13 февраля 2019

У вас есть шаблон для

<STRING>\\[\\"]

и (в действительности) для

<STRING>[^\\]

Но у вас нет шаблона, который соответствует \, за которым следует что-то отличное от \или ":

<STRING>\\[^\\"]

Кроме того, у вас нет шаблона, который будет соответствовать \ в самом конце ввода

<STRING>\\

Наконец, у вас нетшаблон, который будет соответствовать EOF, если он встречается в середине строки

<STRING><<EOF>>

(%option nodefault не заботится о <<EOF>> правилах по умолчанию, но вы, вероятно, захотите выдать сообщение об ошибке.)

К сожалению, flex не знает (насколько мне известно), какая строка может вызвать действие по умолчанию.Эта функция была запрошена пару раз.Однако, как правило, довольно легко увидеть, чего не хватает, просто записывая регулярные выражения для каждого состояния по порядку.(По моему опыту, самые трудные упущения, которые можно увидеть, - это те, которые возникают в результате преждевременного EOF.)

...