2009-11-28 14 views
69

J'ai un « langage » simple que je suis en utilisant Flex (lexicales Analyzer), il est comme ça:Référence non définie Pour yywrap

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

Le Je lance un flex count.l, tout se passe bien sans erreurs ou des avertissements, puis lorsque je tente de faire cc lex.yy.c je suis arrivé cette erreur:

ubuntu @ eeepc: ~/bureau $ cc lex.yy.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 retourné 1 état de sortie

Qu'est-ce qui ne va pas?

Répondre

112

Le scanner appelle cette fonction à la fin du fichier, ce qui vous permet de pointer vers un autre fichier et de continuer à analyser son contenu. Si vous n'avez pas besoin, utilisez

%option noyywrap 

ou lien avec -lfl utiliser la fonction yywrap par défaut() dans la bibliothèque fl (à savoir libfl.a) que flex offre.

+0

Merci beaucoup! –

+0

J'apprécie beaucoup cela – JonnyRo

+0

Simple, court et direct. Très utile. –

8

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

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

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

Comme note pour les adeptes, 2.6.3 flex a un bug où libfl.a « serait typiquement » définir yywrap mais ne puis pas dans certains cas, afin de vérifier si c'est votre version de flex, pourrait être lié à votre problème:

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