2009-11-28 23 views
69

Tengo un "lenguaje" sencillo que estoy usando Flex (Analizador Léxico), es la siguiente:referencia indefinida Para 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); 
} 

El corro un flex count.l, todo va bien y sin errores o advertencias, luego, cuando intento hacer una cc lex.yy.c tengo este error:

ubuntu @ EeePC: ~/Desktop lex.yy.c $ cc
/tmp/ccwwkhvq.o: En función yylex': lex.yy.c:(.text+0x402): undefined reference to yywrap'
/tmp/ccwwkhvq.o: En función de input': lex.yy.c:(.text+0xe25): undefined reference to yywrap'
collect2: ld devolvió el código de salida 1

Cuál es el problema?

Respuesta

112

El escáner llama a esta función al final del archivo, por lo que puede apuntarlo a otro archivo y seguir escaneando su contenido. Si no es necesario, utilice

%option noyywrap 

o vínculo con -lfl utilizar la función yywrap predeterminado() en la biblioteca fl (es decir libfl.a) que proporciona la flexión.

+0

Gracias mucho! –

+0

Mucho aprecio esto – JonnyRo

+0

Simple, corto y al grano. Muy útil. –

8

Prefiero definir mi propio yywrap(). Estoy compilando con C++, pero el punto debería ser obvio. Si alguien llama al compilador con múltiples archivos fuente, los almaceno en una lista o matriz, y luego se llama a yywrap() al final de cada archivo para darle la oportunidad de continuar con un nuevo archivo.

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 no siempre se instala con sus bibliotecas de desarrollo (lo cual es extraño, ya que es una herramienta de desarrollo). Instalar las bibliotecas, y la vida es mejor:

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

Como nota para los seguidores, 2.6.3 Flex tiene un error en el libfl.a "normalmente sería" definir yywrap pero luego no supone, en ciertos casos, a fin de comprobar si ese es su versión de flex, podría estar relacionado con su problema:

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