Unfähig Ausgabe von lex zu kompilieren
Frage
Wenn ich versuche, die Ausgabe dieses trivialen lex Programms zu kompilieren:
# lex.l
integer printf("found keyword INT");
mit:
$ gcc lex.yy.c
ich:
Undefined symbols:
"_yywrap", referenced from:
_yylex in ccMsRtp7.o
_input in ccMsRtp7.o
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
lex --Version sagt mir, ich verwende eigentlich ‚flex 2.5.35‘ obwohl ls -fla `die lex` kein symbolischer Link ist. Irgendwelche Ideen, warum der Ausgang wird nicht kompiliert?
Lösung
ich einen Fehler zu undefiniert yywrap get ().
Sie müssen eine yywrap () Funktion des eigenen liefern, oder einen Link zu libfl.a (die man zur Verfügung stellt) oder die Verwendung
%option noyywrap
in Ihrer Quelle zu sagen, dass Sie nicht über eine yywrap () -Funktion werden sollen.
Wenn der Scanner empfängt ein End-of-Datei Anzeige von YY_INPUT, überprüft er dann die yywrap () Funktion. Ob yywrap () gibt falsch (Null) ist, dann wird angenommen, dass die Funktion hat vor und yyin Punkt einzurichten gegangen eine andere Eingabedatei, und das Scannen wird fortgesetzt. Wenn es zurückgibt true (nicht Null), dann wird der Scanner endet, Return 0 an seinen Aufrufer. Beachten Sie, dass in jedem Fall der Start Bedin- tion bleibt unverändert; es zufällt nicht INITIAL.
Andere Tipps
Antwort Wie Elis schon sagt, das ist kein triviales lex Programm. Es ist eine triviale lex Datei , und damit ein Teil eines Programms, aber es (wie jede lex-Datei) muss mit etwas C-Code kombiniert werden, um ein komplettes Programm zu machen. Insbesondere müssen Sie noch eine main
Funktion (die Sie in C oder C ++ oder etwas schreiben, in einer separaten Datei), und Sie werden auch eine yywrap
Funktion, die die Schnittstelle zwischen dem lex Code bereitstellt und dem Rest Ihres C schreiben müssen Code.