你可以替换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/

10-12 16:00