Référence indéfinie à yywrap

J'ai un "langage" simple que j'utilise Flex (analyseur Lexical), c'est comme ceci:

/* 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%8dn", lines, words, chars);
}

Le je lance un flex count.l, tout va bien sans erreurs ou avertissements, puis quand j'essaie de faire un cc lex.yy.c j'ai eu ces erreurs:

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

Qu'est-ce qui ne va pas?

71
demandé sur lesmana 2009-11-28 03:30:57

4 réponses

Le scanner appelle cette fonction à la fin du fichier, de sorte que vous pouvez 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 yywrap() par défaut dans la bibliothèque fl (c'est-à-dire libfl.a) fournie par flex. Posix exige que cette bibliothèque soit disponible avec l'indicateur d'éditeur de liens -ll et L'installation par défaut D'OS X ne fournit que ce nom.

115
répondu hjhill 2018-03-25 07:34:06

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, et ensuite yywrap() est appelée à 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
répondu codenheim 2014-07-24 04:49:44

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:

yum -y install flex-devel
./configure && make
2
répondu derdeolifant 2016-08-01 15:39:32

Comme une note pour les adeptes, flex 2.6.3 a un bug où libfl.un" typiquement " définirait yywrap mais ne le fait pas dans certains cas, alors vérifiez si c'est votre version de flex, peut être lié à votre problème:

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

2
répondu rogerdpack 2017-03-09 17:25:36