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 fonctionyylex': Lex.yy.c:(.text+0x402): undefined reference to
yywrap '
/tmp/ccwwkhvq.o: Dans la fonctioninput': Lex.yy.c:(.text+0xe25): undefined reference to
yywrap '
collect2: ld a renvoyé 1 état de sortie
Qu'est-ce qui ne va pas?
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.
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;
}
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
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: