Avviso di creazione del bisonte: opzione & # 8220; -s fornita ma la regola predefinita può essere abbinata & # 8221;

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

  •  06-07-2019
  •  | 
  •  

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

%%
È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top