Неопределенная ссылка на 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':yywrap'
lex.yy.c:(.text+0x402): undefined reference to
/ tmp / ccwwkhvq.о: в функцииinput':yywrap'
lex.yy.c:(.text+0xe25): undefined reference to
collect2: ld возвратил 1 статус выхода
что это неправильно?
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 с вашей проблемой:
Comments