题
我有一个简单的“语言”我正在使用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):未定义引用
yywrap'
/tmp/ccwwkhvq.o:在函数input'中: lex.yy.c :(。text + 0xe25):未定义引用
yywrap'
collect2:ld返回1退出状态
有什么问题?
解决方案
扫描程序在文件末尾调用此函数,因此您可以将其指向另一个文件并继续扫描其内容。如果您不需要,请使用
%option noyywrap
虽然禁用 yywrap
当然是最好的选择,但也可以使用 -lfl
链接以使用默认的 yywrap()
函数在flex提供的库 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并不总是与其开发库一起安装(这很奇怪,因为它是一个开发工具)。安装库,生活更美好。
在Redhat基础系统上:
yum -y install flex-devel
./configure && make
基于Debian的系统
sudo apt-get install libfl-dev
作为关注者的注释,flex 2.6.3有一个bug,其中libfl.a“通常会”定义yywrap,但在某些情况下不会,所以检查这是你的flex版本,可能与你的问题有关:
int yywrap(){return(1);}
在程序结束时使用此代码。简单