Advertencia de compilación de Bison: opción de & # 8220; -s dada pero la regla predeterminada puede coincidir & # 8221;
Pregunta
Recibo la advertencia
warning, -s option given but default rule can be matched
si tiene la opción google "dada pero la regla predeterminada puede coincidir", encontrará el capítulo del manual de Flex sobre Diagnóstico y esta entrada en una antigua página de manual de Flex en la sección Diagnóstico:
advertencia, opción '-s dada pero predeterminada regla puede coincidir 'significa que es posible (quizás solo en un particular condición de inicio) que la regla predeterminada (coincide con cualquier carácter individual) es el solo uno que coincida con un particular entrada. Como se dio
-s
, presumiblemente esto no está destinado.
Mi archivo de compilación no tiene una opción -s
. Escribí
bison -y -d calc1.y
flex calc1.l
gcc code...
¿Cómo soluciono esta advertencia?
Aquí hay una pequeña versión de mi archivo lex. Este archivo también activa la advertencia
%{
#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"); }
%%
Solución
% opción nodefault es equivalente a -s
Otros consejos
El " flex " el comando en su sistema podría tener el alias para ser el comando flex con una opción -s Eso podría ocurrir en cualquiera de varios scripts de inicio.
La advertencia le dice que hay algunas entradas que no coinciden con ninguna de las reglas en su archivo de entrada. La advertencia está ahí para que se asegure de haber considerado todos los casos en sus expresiones regulares.
Si realmente desea que se use la regla predeterminada, agréguela al final de las reglas en su archivo de entrada. Intenta agregar las reglas
. ECHO;
\n ECHO;
Actualización: El archivo de entrada que proporciona incluye la opción% nodefault, que es lo mismo que especificar " -s " en la línea de comando, para que se resuelva el misterio. Además, el archivo no tiene una regla para ". & Quot ;. Hay algunos caracteres no cubiertos, '@' por ejemplo.
También sospecho del " - " símbolo en la clase de personaje. Se supone que es un operador de rango, pero puede funcionar como un personaje en la primera posición que tenga. No lo sé. Puede ser una buena idea usar " \ - " en su lugar.
Puede cambiar la última regla a
. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
para deshacerse de la advertencia (y para evitar que el escáner resultante se bloquee).
Además, ¿podría cambiar el título de la pregunta para que sea sobre flex en lugar de bison?