Предупреждение о строении бизона:“-задан параметр s, но может быть выбрано правило по умолчанию”

StackOverflow https://stackoverflow.com/questions/1622493

  •  06-07-2019
  •  | 
  •  

Вопрос

Я получаю предупреждение

warning, -s option given but default rule can be matched

если вы загуглите "опция задана, но правило по умолчанию может быть сопоставлено", вы найдете глава руководства Flex, посвященная диагностике и эта запись в старая страница руководства Flex в разделе Диагностика:

предупреждение " - опция задана, но по умолчанию правило может быть сопоставлено" означает, что возможно (возможно, только при определенном начальном условии), что правило по умолчанию (соответствует любому отдельному символу) является единственным символом, который будет соответствовать определенному входные данные.С тех пор как -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"); }

%%
Это было полезно?

Решение

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

Другие советы

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

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

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

. ECHO;
\n ECHO;

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top