Вопрос

У меня есть простой " язык " что я использую 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, может быть связано с вашей проблемой:

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

int yywrap(){return(1);}

используйте этот код в конце программы .. Простой

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top