未定义对yywrap的引用

98

我正在使用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%8d\n", lines, words, chars);
}

我运行了flex count.l,没有任何错误或警告,但是当我尝试使用cc lex.yy.c时,我得到了以下错误:

ubuntu@eeepc:~/Desktop$ cc lex.yy.c
/tmp/ccwwkhvq.o: In function yylex': lex.yy.c:(.text+0x402): undefined reference toyywrap'
/tmp/ccwwkhvq.o: In function input': lex.yy.c:(.text+0xe25): undefined reference toyywrap'
collect2: ld returned 1 exit status

问题出在哪里?

5个回答

152
扫描器在文件结束时调用此函数,因此您可以将其指向另一个文件并继续扫描其内容。如果您不需要这样做,请使用。
%option noyywrap

在扫描器规范中。

虽然禁用 yywrap 是最佳选项,但也可以使用链接器标志 -lfl 与库 fl(即 flex 提供的 libfl.a)中的默认 yywrap() 函数。Posix 要求该库可用于链接器标志 -ll,默认的 OS X 安装只提供该名称。


2
请问'%option noyywrap'应该添加在哪里?是在定义部分还是命令行上? - yamex5
我把它添加到了.l文件的开头,然后lex接受了它!我不确定那是否是最好的位置。也许这并不重要。 - the.slow.one

15

我更喜欢定义自己的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;
}

你好 @codenheim,我尝试添加你建议的yywrap()函数,但出现了错误:"compiler未声明"。 - Roger Costello

6
int yywrap(){return(1);}

在程序末尾使用以下代码… 简单易懂。


4

Flex不总是安装其开发库(这很奇怪,因为它是一个开发工具)。安装这些库,生活将更美好。

在基于Redhat的系统上:

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

在基于Debian的系统上

sudo apt-get install libfl-dev

arch 的等效物是什么? - Parsa Noori

3
作为一条提示,对于使用者而言,flex 2.6.3 存在一个错误,即 libfl.a "通常会" 定义 yywrap,但在某些情况下却没有定义,因此请检查您使用的 flex 版本是否是该版本,这可能与您的问题有关。相关信息请参考链接:https://github.com/westes/flex/issues/154

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接