Bison aviso construção: “opção -s dado, mas regra padrão pode ser igualada”
Pergunta
Eu recebo o aviso
warning, -s option given but default rule can be matched
Se você google "opção dada, mas regra padrão pode ser igualada", você encontrará capítulo do manual do Flex em Diagnostics e esta entrada em uma velho Flex manpage na seção Diagnóstico:
aviso, 'opção -s dado, mas padrão regra pode ser combinado', que é possível (talvez apenas em um determinado condição de início) que a regra padrão (Corresponde a qualquer caractere único) é o apenas um que irá corresponder a um determinado entrada. Desde
-s
foi dada, Presumivelmente, isso não se destina.
Meu arquivo de construção não tem uma opção -s
. Eu escrevi
bison -y -d calc1.y
flex calc1.l
gcc code...
Como faço para corrigir este aviso?
Aqui está uma versão pequena do meu arquivo lex. Este arquivo também dispara o aviso
%{
#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"); }
%%
Solução
opção% NODEFAULT é equivalente a -s
Outras dicas
O comando "flexível" em seu sistema poderia ter sido alias para ser o comando flexível com opção -s. Isso pode ocorrer em qualquer um dos vários scripts de inicialização.
O aviso está lhe dizendo que há algumas entradas que não sejam compensadas por qualquer uma das regras no seu arquivo de entrada. O aviso está lá para levá-lo para ter certeza de ter considerado todos os casos em suas expressões regulares.
Se você quiser realmente a regra padrão a ser usado, em seguida, adicioná-lo ao fim das regras em seu arquivo de entrada. Tente adicionar as regras
. ECHO;
\n ECHO;
Update: O arquivo de entrada que você fornecer inclui a% NODEFAULT opção, que é o mesmo que especificar "-s" na linha de comando, de modo que mistério está resolvido. Além disso, o arquivo não tem uma regra para "". Há alguns caracteres não cobertos, '@', por exemplo.
Eu também sou suspeito do símbolo - na classe de caracteres "". É suposto ser um operador de intervalo, mas pode funcionar como um personagem na primeira posição como você tê-lo. Eu não sei. Pode ser uma boa idéia usar "\ -". Invés
Você pode mudar a última regra para
. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
para se livrar do aviso (e para evitar o scanner resultante de bater).
Além disso, você poderia alterar o título da pergunta ser sobre Flex vez de bisonte?