我这里有我的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
文件。
非常感谢。
答案 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