Неопределенная ссылка на yywrap



у меня есть простой "язык", который я использую Flex (лексический анализатор), это так:



/* 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%8dn", lines, words, chars);
}


у меня flex count.l, все идет нормально без ошибок или предупреждений, но когда я пытаюсь сделать cc lex.yy.c Я получил эту ошибку:




ubuntu@eeepc:~ / Desktop$ cc lex.да.c

/ tmp / ccwwkhvq.о: в функции yylex':
lex.yy.c:(.text+0x402): undefined reference to
yywrap'

/ tmp / ccwwkhvq.о: в функции input':
lex.yy.c:(.text+0xe25): undefined reference to
yywrap'

collect2: ld возвратил 1 статус выхода




что это неправильно?

459   4  

4 ответов:

сканер вызывает эту функцию в конец файла, так что вы можете указать другой файл и продолжить сканирование его содержимого. Если вам это не нужно, используйте

%option noyywrap

хотя отключение yywrap это, безусловно, лучший вариант, также можно связать с -lfl использовать по умолчанию yywrap() функция в библиотеке fl (т. е. libfl.a) предусмотрено флекс. 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 не всегда устанавливается со своими библиотеками разработки (что странно, так как это инструмент разработки). Установите библиотеки, и жизнь станет лучше:

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

Как примечание для последователей, flex 2.6.3 имеет ошибку, где libfl."обычно" определяет yywrap, но в некоторых случаях этого не происходит, поэтому проверьте, не связана ли эта версия flex с вашей проблемой:

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

Comments

    Ничего не найдено.