2009-11-28 2 views
69

ho un "linguaggio" semplice che sto usando Flex (lessicale Analyzer), è come questo:undefined reference to yywrap

/* Just like UNIX wc */ 
%{ 
int chars = 0; 
int words = 0; 
int lines = 0; 
%} 

%% 
[a-zA-Z]+ { words++; chars += strlen(yytext); } 
\n  { chars++; lines++; } 
.   { chars++; } 
%% 

int main() 
{ 
    yylex(); 
    printf("%8d%8d%8d\n", lines, words, chars); 
} 

L'ho eseguito un flex count.l, tutto va bene, senza errori o avvisi, poi quando provo a fare un cc lex.yy.c ho ottenuto questo errore:

ubuntu @ eeepc: ~/Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o: In funzione yylex': lex.yy.c:(.text+0x402): undefined reference to yywrap'
/tmp/ccwwkhvq.o: In funzione di input': lex.yy.c:(.text+0xe25): undefined reference to yywrap'
collect2: ld ha restituito lo stato 1 uscita

Cosa c'è di sbagliato?

risposta

112

Lo scanner chiama questa funzione alla fine del file, quindi è possibile puntarlo su un altro file e continuare a digitalizzare il suo contenuto. Se non avete bisogno di questo, utilizzare

%option noyywrap 

o legame con -lfl di utilizzare la funzione di default yywrap() nella libreria fl (vale a dire libfl.a), che fornisce flex.

+0

Grazie mille! –

+0

Molto apprezzato questo – JonnyRo

+0

Semplice, breve, e al punto. Molto utile. –

8

Preferisco definire il mio yywrap(). Sto compilando con C++, ma il punto dovrebbe essere ovvio. Se qualcuno chiama il compilatore con più file sorgente, li memorizzo in un elenco o in un array, quindi yywrap() viene chiamato alla fine di ogni file per darti la possibilità di continuare con un nuovo file.

int yywrap() { 
    // open next reference or source file and start scanning 
    if((yyin = compiler->getNextFile()) != NULL) { 
     line = 0; // reset line counter for next source file 
     return 0; 
    } 
    return 1; 
} 
2

flex non si installa sempre con le sue librerie di sviluppo (che è dispari, in quanto è uno strumento di sviluppo). Installare le librerie, e la vita è meglio:

yum -y install flex-devel 
./configure && make 
2

Come nota per i seguaci, 2.6.3 flex ha un bug in cui libfl.a "consueto" definire yywrap, ma poi non in alcuni casi, in modo da controllare se è la vostra versione di flex, potrebbe essere correlato al tuo problema:

https://github.com/westes/flex/issues/154