你可以替换yylex并传递你自己的论点,用yywrap有什么简单的方法吗?
最佳答案
如果您正在构建一个普通的不可重入扫描仪,则可以将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 context objectscanner_t scanner
可以扩展为包含您自己的extra data,这通常是保存可能传递到yywrap
的数据的更好地方。有其他好的理由选择建立一个重新进入扫描器。关于c - 任何方式来代替yywrap定义?论据等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49470118/