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.c
ich habe diesen Fehler:
ubuntu @ eeepc: ~ / Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o: In Funktionyylex': lex.yy.c:(.text+0x402): undefined reference to
yywrap '
/tmp/ccwwkhvq.o: In Funktioninput': lex.yy.c:(.text+0xe25): undefined reference to
yywrap'
collect2: ld hat 1 Exit-Status zurückgegeben
Was ist falsch?
quelle
.l
Datei hinzugefügt undlex
akzeptiert! Ich bin mir nicht sicher, ob das der beste Ort ist. Vielleicht spielt es keine Rolle.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.
quelle
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:
Auf Debian-basierten Systemen
quelle
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
quelle
Verwenden Sie diesen Code am Ende des Programms
quelle