Avertissement de construction Bison: «L'option -s est donnée mais la règle par défaut peut être vérifiée»

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

  •  06-07-2019
  •  | 
  •  

Question

je reçois l'avertissement

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

si vous google l'option donnée mais que la règle par défaut peut correspondre, vous trouverez Le chapitre du manuel de Flex sur les diagnostics et cette entrée dans une ancienne page de manuel Flex dans la section Diagnostics:

  

warning, option -s donnée mais valeur par défaut   règle peut être apparié 'signifie qu'il est   possible (peut-être que dans un cas particulier)   condition de démarrage) que la règle par défaut   (correspond à n'importe quel caractère) est le   un seul qui correspond à un particulier   contribution. Depuis que -s a été donné,   vraisemblablement, ce n’est pas ce que nous voulions.

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

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

Comment puis-je résoudre cet avertissement?

Voici une version minuscule 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"); }

%%
Était-ce utile?

La solution

% option nodefault est équivalent à -s

Autres conseils

Le " flex " La commande sur votre système aurait pu être associée à la commande flex avec une option -s. Cela pourrait se produire dans plusieurs scripts de démarrage.

L'avertissement vous indique que certaines entrées ne correspondent à aucune des règles de votre fichier d'entrée. L’avertissement vous aide à vous assurer que vous avez bien 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 de 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, ce qui revient au même que de spécifier "-s". sur la ligne de commande, de sorte que ce mystère est résolu. De plus, le fichier n'a pas de règle pour ".". Certains caractères ne sont pas couverts, par exemple «@».

Je me méfie également de l'option " - " symbole dans la classe de caractère. Il est supposé être un opérateur de plage, mais il peut fonctionner comme un personnage dans la première position telle que vous l’avez. Je ne sais pas. Ce serait peut-être une bonne idée d'utiliser " \ - " à la place.

Vous pouvez modifier la dernière règle en

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

pour vous 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 pour parler de flex au lieu de bison?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top