95 votes

Référence non définie à yywrap

J'ai un simple "langue" que je suis à l'aide de Flex(Analyseur Lexical), c'est comme ça:

/* 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);
}

La je lance un flex count.l, tout va ok sans erreurs ou des avertissements, puis quand j'ai essayer de faire un cc lex.yy.c j'ai eu cette erreur:

ubuntu@eeepc:~/Desktop$ cc lex.aa.c
/tmp/ccwwkhvq.o: Dans la fonction yylex': lex.yy.c:(.text+0x402): undefined reference to yywrap'
/tmp/ccwwkhvq.o: Dans la fonction input': lex.yy.c:(.text+0xe25): undefined reference to yywrap'
collect2: ld a retourné 1 code de sortie

Quel est le problème?

147voto

hjhill Points 1434

Le scanneur appelle cette fonction en fin de fichier afin que vous puissiez le diriger vers un autre fichier et continuer à analyser son contenu. Si vous n'en avez pas besoin, utilisez

 %option noyywrap
 

ou liez avec -lfl pour utiliser la fonction yywrap () par défaut dans la bibliothèque fl .

15voto

codenheim Points 6836

Je préfère définir mon propre yywrap (). Je compile avec C ++, mais le point devrait être évident. Si quelqu'un appelle le compilateur avec plusieurs fichiers sources, je les stocke dans une liste ou un tableau, puis yywrap () est appelé à la fin de chaque fichier pour vous permettre de continuer avec un nouveau fichier.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X