有什么方法可以替换 yywrap 定义?争论等

any way to replace yywrap definition? arguments, etc

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

如果您正在构建一个普通的 non-reentrant 扫描器,您可以将 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. In a reentrant scanner, yywrap will be automatically called with the same scanner argument that yylex will be called with. The scanner context object scanner_t scanner can be extended to include your own extra data,那么有一个更简洁的解决方案,通常这是一个更好的地方来保存可能会传递给 yywrap 的数据。选择构建 re-entrant 扫描仪还有其他充分的理由。