任何方式来取代yywrap定义?参数等

时间:2018-03-24 21:26:11

标签: c flex-lexer lex

你可以替换yylex并传递你自己的参数,有没有简单的方法用yywrap来做这个?

1 个答案:

答案 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的数据类型的更好位置。选择构建可重入扫描器还有其他充分的理由。