未定义的引用`yywrap`

时间:2014-07-24 04:40:27

标签: c gcc flex-lexer

我这里有我的lex文件。

%{
#include <stdio.h>
%}

%%
stop    printf("Stop command received\n");
start   printf("Start command received\n");
%%

我使用flex编译了它。但是当我使用lex.yy.c编译gcc时出现错误。 它说..

: undefined reference to yywrap

我使用了gcc lex.yy.c -lfl,但仍然存在错误。 它说..

ld.exe: cannot find -lfl

请帮我编译我的lex.yy.c文件。 非常感谢。

1 个答案:

答案 0 :(得分:0)

有几种方法。我推荐的是。

提供你自己的yywrap()函数。

由于我的编译器通常允许多个源文件,我更喜欢定义自己的yywrap()。我正在用C ++编译,但重点应该是显而易见的。如果有人用多个源文件调用编译器,我将它们存储在列表或数组中,然后在每个文件的末尾调用yywrap(),以便您有机会继续使用新文件。注意:getNextFile()或compiler-&gt; getNextFile()是我自己的函数,而不是flex函数。

int yywrap() {
   // open next reference or source file and start scanning
   if((yyin = getNextFile()) != NULL) {
      line = 0; // reset line counter for next source file
      return 0;
   }
   return 1;
}

如果使用C ++构建:

extern "C" 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;
}

对于较旧的lex / flex,yywrap()是一个宏,所以要重新定义它我们必须这样做:

%{
#undef yywrap
%}

您可以重新定义一个简单的宏,它会在单个文件后结束扫描:

%{
#undef yywrap
#define yywrap() 1
%}

使用较新的Flex / POSIX lex,您可以在命令行中完全禁用yywrap:

flex --noyywrap

这适用于yywrap( - noyymore等)

之外的其他功能

或者将它放在选项部分。

%option noyywrap
/* end of rules */
%%

lex文件的一般语法是:

Options and definitions
%%
Rules
%%
C code