2009-10-25 3 views
4

je reçois l'avertissementBison construire avertissement: « option -s donnée, mais la règle par défaut peut être adaptée »

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

si vous « option donnée, mais la règle par défaut peut être adaptée » google, vous trouverez the Flex manual's chapter on Diagnostics et cette entrée dans un old Flex manpage dans la section Diagnostics:

avertissement

, « option -s donnée, mais par défaut règle peut être adaptée » signifie qu'il est possible (peut-être seulement dans un état de démarrage particulier) que le défaut règle (correspondre à un seul caractère) est le seul qui correspond à une entrée particulière . Puisque -s a été donné, probablement ceci n'est pas prévu.

Mon fichier de construction n'a pas d'option -s. J'ai écrit

bison -y -d calc1.y 
flex calc1.l 
gcc code... 

Comment réparer cet avertissement?

Voici une petite version de mon fichier lex. Ce fichier déclenche également l'avertissement

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

%% 
+0

Pouvez-vous inclure votre fichier d'entrée de flex dans la question? – UncleO

Répondre

4
Option

% de nodefault équivaut à -s

2

La commande « flex » sur votre système aurait pu être aliasé être la commande flex avec une option -s. Cela peut se produire dans n'importe lequel des scripts de démarrage.

L'avertissement vous indique qu'il existe des entrées qui ne correspondent à aucune des règles de votre fichier d'entrée. L'avertissement est là pour vous assurer que vous avez pris en compte tous les cas dans vos expressions régulières.

Si vous voulez vraiment que la règle par défaut soit utilisée, ajoutez-la à la fin des règles dans votre fichier d'entrée. Essayez d'ajouter les règles

. ECHO; 
\n ECHO; 

Mise à jour: Le fichier d'entrée que vous fournissez inclut l'option% nodefault, qui est identique à la spécification « -s » sur la ligne de commande, de sorte que le mystère est résolu. En outre, le fichier n'a pas de règle pour ".". Certains caractères ne sont pas couverts, '@' par exemple.

Je suis également suspect du symbole "-" dans la classe de caractères. Il est censé être un opérateur de gamme, mais il peut fonctionner comme un personnage dans la première position que vous l'avez. Je ne sais pas. Ce pourrait être une bonne idée d'utiliser "\ -" à la place.

Vous pouvez changer la dernière règle à

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

pour se débarrasser de l'avertissement (et pour empêcher le scanner résultant de tomber en panne).

Aussi, pourriez-vous changer le titre de la question à propos de flex au lieu de bison?

+0

J'ai '.' et' [- +() =/* {},; \ n] 'en règle générale. Ne devrait-il pas couvrir toutes les entrées? (est-ce que. cover \ r, \ v, \ b? \ a? etc) –

+0

. est censé couvrir tous les personnages, mais newline.J'ai essayé flex -s avec juste les deux règles ci-dessus, et l'avertissement n'apparaissait pas. Lorsque j'ai supprimé la deuxième règle, l'avertissement est apparu. – UncleO

Questions connexes