flex lexer - how - Referencia indefinida a yywrap
how to use flex lexical analyzer (4)
Como nota para los seguidores, flex 2.6.3 tiene un error donde libfl.a "típicamente" definiría yywrap pero luego no en ciertos casos, así que verifique si esa es su versión de flex, podría estar relacionada con su problema:
Tengo un "lenguaje" simple que estoy usando Flex (Lexical Analyzer), es así:
/* 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 I ejecuta un flex count.l
, todo va bien sin errores o advertencias, entonces cuando intento hacer un cc lex.yy.c
obtuve estos errores:
ubuntu @ eeepc: ~ / Escritorio $ cc lex.yy.c
/tmp/ccwwkhvq.o: en la funciónyylex'': lex.yy.c:(.text+0x402): undefined reference to
yywrap''
/tmp/ccwwkhvq.o: en lainput'': lex.yy.c:(.text+0xe25): undefined reference to
funcióninput'': lex.yy.c:(.text+0xe25): undefined reference to
yywrap''
collect2: ld devolvió 1 estado de salida
¿Qué está mal?
El escáner llama a esta función al final del archivo, por lo que puede apuntarlo a otro archivo y continuar escaneando su contenido. Si no necesita esto, use
%option noyywrap
Aunque deshabilitar yywrap
es sin duda la mejor opción, también es posible vincular con -lfl
para usar la función yywrap()
predeterminada en la biblioteca fl
(es decir, libfl.a
) proporcionada por flex. Posix requiere que la biblioteca esté disponible con el indicador del enlazador -ll
y la instalación predeterminada de OS X solo proporciona ese nombre.
Flex no siempre se instala con sus bibliotecas de desarrollo (lo cual es extraño, ya que es una herramienta de desarrollo). Instale las bibliotecas, y la vida es mejor:
yum -y install flex-devel
./configure && make
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;
}