Mam prosty „język”, w którym używam Flex (Lexical Analyzer), wygląda to tak:
/* 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);
}
Uruchamiam a flex count.l
, wszystko idzie dobrze bez błędów i ostrzeżeń, to jak próbuję zrobić a cc lex.yy.c
wyskakuje mi ten błąd:
ubuntu @ eeepc: ~ / Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o: W funkcjiyylex': lex.yy.c:(.text+0x402): undefined reference to
yywrap '
/tmp/ccwwkhvq.o: W funkcjiinput': lex.yy.c:(.text+0xe25): undefined reference to
yywrap'
collect2: ld zwrócił 1 status wyjścia
Co jest nie tak?
źródło
.l
pliku ilex
zaakceptowałem! Nie jestem pewien, czy to najlepsze miejsce. Może to nie ma znaczenia.Wolę zdefiniować własny yywrap (). Kompiluję w C ++, ale sprawa powinna być oczywista. Jeśli ktoś wywoła kompilator z wieloma plikami źródłowymi, przechowuję je na liście lub w tablicy, a następnie na końcu każdego pliku wywoływana jest yywrap (), aby dać ci szansę na kontynuację z nowym plikiem.
źródło
flex nie zawsze instaluje się wraz ze swoimi bibliotekami programistycznymi (co jest dziwne, ponieważ jest to narzędzie programistyczne). Zainstaluj biblioteki, a życie będzie lepsze.
W systemach bazowych Redhat:
W systemach opartych na Debianie
źródło
Uwaga dla obserwujących, flex 2.6.3 ma błąd, w którym libfl.a "zazwyczaj definiowałoby" yywrap, ale w niektórych przypadkach nie, więc sprawdź, czy to twoja wersja fleksa, może być związana z twoim problemem:
https://github.com/westes/flex/issues/154
źródło
użyj tego kodu na końcu programu… Prosty
źródło