你可以替换yylex并传递你自己的参数,有没有简单的方法用yywrap来做这个?
答案 0 :(得分:2)
如果要构建普通的非重入扫描程序,可以将yywrap
定义为宏。该宏可以扩展为使用任意参数调用任意函数。 (在这种情况下,你可以合理地传递给wrap函数的大部分内容都是全局变量,但是传递给yylex
的参数可能很有用。)
但是,由于生成的代码中yywrap
的前向声明,您需要将宏定义放在yylex顶部的插入代码中。
所以你的文件可能包括:
%{
#define YY_DECL int yylex(Frobber* data)
/* Forward declaration of mywrap
int mywrap(Frobber* data);
%}
%option ...
%%
/* Indented lines before the first rule are inserted at the top of yylex
#define yywrap() mywrap(data)
Flex文档和Posix都没有明确允许将yywrap
定义为宏。所以它应该至少应该伴随着一个评论,以防一些后来的版本做某种事情,以某种方式阻止它工作。将定义放在yylex
的顶部是一个黑客攻击,对于旧的lex版本可能没有必要。
如果您准备构建re-entrant scanner,那么有一个更清洁的解决方案。在可重入扫描程序中,yywrap
将使用与yylex
将被调用的扫描器参数相同的自动调用。扫描仪上下文对象scanner_t scanner
可以扩展为包含您自己的extra data,这通常是保存可能合理传递到yywrap
的数据类型的更好位置。选择构建可重入扫描器还有其他充分的理由。