Advertencia de compilación de Bison: opción de & # 8220; -s dada pero la regla predeterminada puede coincidir & # 8221;

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

  •  06-07-2019
  •  | 
  •  

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"); }

%%
¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top