nvt how example compile flex-lexer

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:

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

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ón yylex'': lex.yy.c:(.text+0x402): undefined reference to yywrap''
/tmp/ccwwkhvq.o: en la input'': lex.yy.c:(.text+0xe25): undefined reference to función input'': 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; }