web-dev-qa-db-fra.com

Référence indéfinie à yywrap

J'ai un "langage" simple que j'utilise Flex (Lexical Analyzer), 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);
}

Je lance un flex count.l, Tout se passe bien sans erreurs ni avertissements, puis lorsque j'essaie de faire un cc Lex.yy.c, J'ai ces erreurs:

ubuntu @ eeepc: ~/Desktop $ cc Lex.yy.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 renvoyé 1 état de sortie

Qu'est-ce qui ne va pas?

74
Nathan Campos

Le scanner appelle cette fonction à la fin du fichier, vous pouvez donc le pointer vers un autre fichier et continuer à analyser son contenu. Si vous n'en avez pas besoin, utilisez

%option noyywrap

Bien que la désactivation de yywrap soit certainement la meilleure option, il peut également être possible de créer un lien avec -lfl Pour utiliser la fonction par défaut yywrap() dans la bibliothèque fl ( ie libfl.a) fourni par flex. Posix nécessite que la bibliothèque soit disponible avec l'indicateur de l'éditeur de liens -ll Et l'installation par défaut d'OS X ne fournit que ce nom.

120
hjhill

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 source, je les stocke dans une liste ou un tableau, puis yywrap () est appelé à la fin de chaque fichier pour vous donner une chance 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;
}
9
codenheim

flex ne s'installe pas toujours avec ses bibliothèques de développement (ce qui est étrange, car c'est un outil de développement). Installez les bibliothèques et la vie est meilleure.

Sur les systèmes de base Redhat:

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

Sur les systèmes basés sur Debian

Sudo apt-get install libfl-dev
3
Des Cent

Pour les adeptes, flex 2.6.3 a un bogue où libfl.a "définirait" généralement "yywrap" mais ne le fait pas dans certains cas, alors vérifiez si c'est votre version de flex, cela pourrait être lié à votre problème:

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

2
rogerdpack