未定义参考yywrap

时间:2009-11-28 00:30:58

标签: flex-lexer

我有一个简单的“语言”,我正在使用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:在函数yylex': lex.yy.c:(.text+0x402): undefined reference to yywrap'中   /tmp/ccwwkhvq.o:在函数input': lex.yy.c:(.text+0xe25): undefined reference to yywrap'中   collect2:ld返回1退出状态

有什么问题?

5 个答案:

答案 0 :(得分:120)

扫描程序在文件末尾调用此函数,因此您可以将其指向另一个文件并继续扫描其内容。如果您不需要,请使用

%option noyywrap

虽然禁用yywrap肯定是最佳选择,但也可以与-lfl链接以使用库yywrap()中的默认fl功能(即{ {1}})由flex提供。 Posix要求库可以使用链接器标志libfl.a,默认的OS X安装仅提供该名称。

答案 1 :(得分:9)

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

答案 2 :(得分:3)

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

在Redhat基础系统上:

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

基于Debian的系统

sudo apt-get install libfl-dev

答案 3 :(得分:2)

作为关注者的注释,flex 2.6.3有一个bug,其中libfl.a"通常会#34;定义yywrap,但在某些情况下没有,所以检查你的flex版本是否与你的问题有关:

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

答案 4 :(得分:-1)

import weakref

a = {0, 1}
wref = weakref.ref(a)
print(wref())

a = {2, 3}
print(wref())

在程序末尾使用此代码。.简单