Предупреждение о сборке зубров: "опция -s задана, но правило по умолчанию может быть найдено"
Я получаю предупреждение
warning, -s option given but default rule can be matched
Если вы зададите Google "опция указана, но правило по умолчанию может быть найдено", вы найдете главу руководства Flex по диагностике и эту запись на старой странице руководства Flex в разделе "Диагностика":
предупреждение "указана опция -s, но правило по умолчанию может быть сопоставлено" означает, что возможно (возможно, только в определенном начальном условии), что правило по умолчанию (соответствует любому отдельному символу) является единственным, которое будет соответствовать определенному вводу. поскольку
-s
было дано, по-видимому, это не предназначено.
Мой файл сборки не имеет -s
вариант. я написал
bison -y -d calc1.y
flex calc1.l
gcc code...
Как мне исправить это предупреждение?
Вот крошечная версия моего файла lex. Этот файл также вызывает предупреждение
%{
#include "y.tab.h"
%}
%option noyywrap nodefault yylineno
%%
[0-9]+ {
return INTEGER;
}
[-+()=/*{},;\n] { return *yytext; }
[ \t] /* skip whitespace */
[a-zA-Z0-9_]* { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
%%
2 ответа
Команда "flex" в вашей системе могла бы быть псевдонимом команды flex с опцией -s. Это может произойти в любом из нескольких сценариев запуска.
Предупреждение говорит вам, что есть некоторые входные данные, которые не соответствуют ни одному из правил в вашем входном файле. Это предупреждение поможет вам убедиться, что вы рассмотрели все случаи в своих регулярных выражениях.
Если вы действительно хотите использовать правило по умолчанию, добавьте его в конец правил во входном файле. Попробуйте добавить правила
. ECHO;
\n ECHO;
Обновление: предоставленный вами входной файл включает в себя% option nodefault, который аналогичен указанию "-s" в командной строке, так что загадка решена. Кроме того, файл не имеет правила для ".". Некоторые символы не охвачены, например, @.
Я также с подозрением отношусь к символу "-" в классе персонажей. Предполагается, что это оператор диапазона, но он может работать как персонаж на первой позиции, если он у вас есть. Я не знаю. Это может быть хорошей идеей, чтобы использовать вместо "\-".
Вы можете изменить последнее правило на
. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
избавиться от предупреждения (и не дать полученному сканеру выйти из строя).
Кроме того, не могли бы вы изменить название вопроса, чтобы оно касалось гибкости вместо бизона?