Undefinierter Verweis auf yywrap

81

Ich habe eine einfache "Sprache", die ich mit Flex (Lexical Analyzer) verwende. Es ist wie folgt:

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

Das ich laufe flex count.l, geht alles in Ordnung , ohne Fehler oder Warnungen, dann , wenn ich versuche , eine zu tun , cc lex.yy.cich habe diesen Fehler:

ubuntu @ eeepc: ~ / Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o: In Funktion yylex': lex.yy.c:(.text+0x402): undefined reference toyywrap '
/tmp/ccwwkhvq.o: In Funktion input': lex.yy.c:(.text+0xe25): undefined reference toyywrap'
collect2: ld hat 1 Exit-Status zurückgegeben

Was ist falsch?

Nathan Campos
quelle

Antworten:

126

Der Scanner ruft diese Funktion am Ende der Datei auf, sodass Sie sie auf eine andere Datei verweisen und deren Inhalt weiter scannen können. Wenn Sie dies nicht benötigen, verwenden Sie

%option noyywrap

in der Scannerspezifikation.

Obwohl das Deaktivieren yywrap sicherlich die beste Option ist, kann es auch möglich sein, eine Verknüpfung herzustellen -lfl, um die Standardfunktion yywrap()in der von flex bereitgestellten Bibliothek fl(dh libfl.a) zu verwenden. Posix setzt voraus, dass die Bibliothek mit dem Linker-Flag verfügbar ist -llund die Standardinstallation von OS X nur diesen Namen enthält.

hjhill
quelle
1
Wo genau soll '% option noyywrap' hinzugefügt werden? Im Definitionsabschnitt oder in der Befehlszeile?
Yamex5
Ich habe es am Anfang der .lDatei hinzugefügt und lexakzeptiert! Ich bin mir nicht sicher, ob das der beste Ort ist. Vielleicht spielt es keine Rolle.
Deepak
9

Ich definiere lieber mein eigenes yywrap (). Ich kompiliere mit C ++, aber der Punkt sollte offensichtlich sein. Wenn jemand den Compiler mit mehreren Quelldateien aufruft, speichere ich sie in einer Liste oder einem Array, und dann wird am Ende jeder Datei yywrap () aufgerufen, damit Sie mit einer neuen Datei fortfahren können.

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;
}
Codenheim
quelle
3

flex wird nicht immer mit seinen Entwicklungsbibliotheken installiert (was seltsam ist, da es sich um ein Entwicklungstool handelt). Installieren Sie die Bibliotheken und das Leben ist besser.

Auf Redhat-Basissystemen:

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

Auf Debian-basierten Systemen

sudo apt-get install libfl-dev
Abstammung
quelle
2

Als Hinweis für Follower hat Flex 2.6.3 einen Fehler, bei dem libfl.a "normalerweise" yywrap definiert, dies aber in bestimmten Fällen nicht tut. Überprüfen Sie daher, ob dies Ihre Flex-Version ist, die möglicherweise mit Ihrem Problem zusammenhängt:

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

Rogerdpack
quelle
-1
int yywrap(){return(1);}

Verwenden Sie diesen Code am Ende des Programms

veeppiaar
quelle