Avviso di creazione del bisonte: opzione & # 8220; -s fornita ma la regola predefinita può essere abbinata & # 8221;
Domanda
Ricevo l'avvertimento
warning, -s option given but default rule can be matched
se google " opzione fornita ma la regola predefinita può essere abbinata " ;, troverai il capitolo del manuale Flex sulla diagnostica e questa voce in una vecchia manpage Flex nella sezione Diagnostica:
avviso ", opzione fornita ma predefinita regola può essere abbinata "significa che lo è possibile (forse solo in un particolare condizione iniziale) che è la regola predefinita (corrisponde a un singolo carattere) è il solo uno che corrisponderà a un particolare ingresso. Poiché è stato fornito
-s
, presumibilmente non è previsto.
Il mio file di build non ha un'opzione -s
. Ho scritto
bison -y -d calc1.y
flex calc1.l
gcc code...
Come posso correggere questo avviso?
Ecco una piccola versione del mio file lex. Questo file attiva anche l'avviso
%{
#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"); }
%%
Soluzione
% option nodefault è equivalente a -s
Altri suggerimenti
Il " flex " il comando sul tuo sistema avrebbe potuto essere aliasato come comando flessibile con un'opzione -s. Ciò potrebbe verificarsi in uno dei numerosi script di avvio.
L'avvertimento ti dice che ci sono alcuni input che non corrispondono a nessuna delle regole nel tuo file di input. L'avvertimento è lì per convincerti ad aver considerato tutti i casi nelle tue espressioni regolari.
Se vuoi veramente usare la regola predefinita, aggiungila alla fine delle regole nel tuo file di input. Prova ad aggiungere le regole
. ECHO;
\n ECHO;
Aggiornamento: Il file di input fornito include l'opzione% nodefault, che equivale a specificare " -s " dalla riga di comando, in modo che il mistero sia risolto. Inoltre, il file non ha una regola per ". & Quot ;. Esistono alcuni caratteri non coperti, ad esempio "@".
Sono anche sospettoso di " - " simbolo nella classe di caratteri. Dovrebbe essere un operatore a distanza, ma potrebbe funzionare come personaggio in prima posizione come lo hai tu. Non lo so. Potrebbe essere una buona idea usare " \ - " invece.
È possibile modificare l'ultima regola in
. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
per sbarazzarsi dell'avvertimento (e per impedire il crash dello scanner risultante).
Inoltre, potresti cambiare il titolo della domanda in modo da essere flessibile anziché bisonte?