Предупреждение о сборке зубров: "опция -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 ответа

Решение

%option nodefault эквивалентен -s

Команда "flex" в вашей системе могла бы быть псевдонимом команды flex с опцией -s. Это может произойти в любом из нескольких сценариев запуска.

Предупреждение говорит вам, что есть некоторые входные данные, которые не соответствуют ни одному из правил в вашем входном файле. Это предупреждение поможет вам убедиться, что вы рассмотрели все случаи в своих регулярных выражениях.

Если вы действительно хотите использовать правило по умолчанию, добавьте его в конец правил во входном файле. Попробуйте добавить правила

. ECHO;
\n ECHO;

Обновление: предоставленный вами входной файл включает в себя% option nodefault, который аналогичен указанию "-s" в командной строке, так что загадка решена. Кроме того, файл не имеет правила для ".". Некоторые символы не охвачены, например, @.

Я также с подозрением отношусь к символу "-" в классе персонажей. Предполагается, что это оператор диапазона, но он может работать как персонаж на первой позиции, если он у вас есть. Я не знаю. Это может быть хорошей идеей, чтобы использовать вместо "\-".

Вы можете изменить последнее правило на

. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }

избавиться от предупреждения (и не дать полученному сканеру выйти из строя).

Кроме того, не могли бы вы изменить название вопроса, чтобы оно касалось гибкости вместо бизона?

Другие вопросы по тегам