首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未定义对`yywrap`的引用

未定义对`yywrap`的引用
EN

Stack Overflow用户
提问于 2014-07-24 12:40:27
回答 1查看 7.3K关注 0票数 2

我这里有我的莱克斯档案。

代码语言:javascript
运行
复制
%{
#include <stdio.h>
%}

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

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

: undefined reference to yywrap

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

代码语言:javascript
运行
复制
ld.exe: cannot find -lfl

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

EN

回答 1

Stack Overflow用户

发布于 2014-07-24 12:52:26

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

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

因为我的编译器通常允许多个源文件,所以我更喜欢定义我自己的yywrap()。我是用C++编译的,但重点应该很明显。如果有人使用多个源文件调用编译器,我会将它们存储在一个列表或数组中,然后在每个文件的末尾调用yywrap(),让您有机会继续处理新文件。注意: getNextFile()或编译器->getNextFile()是我自己的函数,不是flex函数。

代码语言:javascript
运行
复制
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++构建,请使用:

代码语言:javascript
运行
复制
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()是一个宏,因此要重新定义它,我们必须这样做:

代码语言:javascript
运行
复制
%{
#undef yywrap
%}

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

代码语言:javascript
运行
复制
%{
#undef yywrap
#define yywrap() 1
%}

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

代码语言:javascript
运行
复制
flex --noyywrap

这适用于除yywrap (--noyymore等)之外的其他函数。

或者将其放入选项部分。

代码语言:javascript
运行
复制
%option noyywrap
/* end of rules */
%%

其中lex文件的常规语法为:

代码语言:javascript
运行
复制
Options and definitions
%%
Rules
%%
C code
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24925247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档