Вопрос
У меня есть простой " язык " что я использую Flex (Lexical Analyzer), это так:
/* 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);
}
Я запускаю flex count.l
, все идет нормально, без ошибок и предупреждений, затем, когда я пытаюсь сделать cc lex.yy.c
, я получил это ошибки:
ubuntu @ eeepc: ~ / Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o: в функцииyylex ': lex.yy.c :(. text + 0x402): неопределенная ссылка на
yywrap '
/tmp/ccwwkhvq.o: в функцииinput ': lex.yy.c :(. text + 0xe25): неопределенная ссылка на
yywrap '
collect2: ld вернул 1 статус выхода
Что не так?
Решение
Сканер вызывает эту функцию в конце файла, поэтому вы можете указать его в другом файле и продолжить сканирование его содержимого. Если вам это не нужно, используйте
%option noyywrap
Хотя отключение yywrap
, безусловно, является наилучшим вариантом, также возможно связать с -lfl
использование yywrap ()
по умолчанию. функция в библиотеке fl
(т.е. libfl.a
), предоставляемая flex. Posix требует, чтобы эта библиотека была доступна с флагом компоновщика -ll
, и установка по умолчанию OS X предоставляет только это имя. Р>
Другие советы
Я предпочитаю определять свой собственный yywrap (). Я компилирую с C ++, но суть должна быть очевидной. Если кто-то вызывает компилятор с несколькими исходными файлами, я сохраняю их в списке или массиве, а затем в конце каждого файла вызывается yywrap (), чтобы дать вам возможность продолжить работу с новым файлом.
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 не всегда устанавливается вместе с его библиотеками разработки (что странно, так как это инструмент разработки). Установите библиотеки, и жизнь станет лучше.
В базовых системах Redhat:
yum -y install flex-devel
./configure && make
В системах на основе Debian
sudo apt-get install libfl-dev
Как примечание для подписчиков, во Flex 2.6.3 есть ошибка, из-за которой libfl.a "обычно" " определить yywrap, но в некоторых случаях это не так, поэтому проверьте, не является ли это вашей версией flex, может быть связано с вашей проблемой:
int yywrap(){return(1);}
используйте этот код в конце программы .. Простой