C 有没有办法取代yywrap定义?争论等

C 有没有办法取代yywrap定义?争论等,c,flex-lexer,lex,C,Flex Lexer,Lex,您可以替换yylex并传递您自己的参数,有没有简单的方法用yywrap实现这一点?如果您正在构建一个普通的不可重入扫描程序,您可以将yywrap定义为宏。该宏可以扩展为对具有任意参数的任意函数的调用。(在这种情况下,可以合理地传递给wrap函数的大部分内容都是全局变量,但传递传递给yylex的参数可能会很有用) 但是,您需要将宏定义放在插入代码的yylex顶部,因为在生成的代码中正向声明了ofyywrap 因此,您的文件可能包括: %{ #define YY_DECL int yylex

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

如果您正在构建一个普通的不可重入扫描程序,您可以将
yywrap
定义为宏。该宏可以扩展为对具有任意参数的任意函数的调用。(在这种情况下,可以合理地传递给wrap函数的大部分内容都是全局变量,但传递传递给
yylex
的参数可能会很有用)

但是,您需要将宏定义放在插入代码的yylex顶部,因为在生成的代码中正向声明了of
yywrap

因此,您的文件可能包括:

%{
  #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版本可能没有必要


如果你准备建立一个更清洁的解决方案。在可重入扫描程序中,
yywrap
将使用与调用
yylex
相同的扫描程序参数自动调用。scanner上下文对象
scanner\u t scanner
可以扩展为包含您自己的,这通常是保存可能传递到
yywrap
的数据类型的更好地方。选择构建可重入扫描程序还有其他原因。

如果要构建普通的不可重入扫描程序,可以将
yywrap
定义为宏。该宏可以扩展为对具有任意参数的任意函数的调用。(在这种情况下,可以合理地传递给wrap函数的大部分内容都是全局变量,但传递传递给
yylex
的参数可能会很有用)

但是,您需要将宏定义放在插入代码的yylex顶部,因为在生成的代码中正向声明了of
yywrap

因此,您的文件可能包括:

%{
  #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版本可能没有必要


如果你准备建立一个更清洁的解决方案。在可重入扫描程序中,
yywrap
将使用与调用
yylex
相同的扫描程序参数自动调用。scanner上下文对象
scanner\u t scanner
可以扩展为包含您自己的,这通常是保存可能传递到
yywrap
的数据类型的更好地方。选择构建可重入式扫描仪还有其他很好的理由。

哦,很有趣,那么您可以扩展扫描仪吗?看,我认为这是不透明的,我用扫描仪参考传递我自己的。“额外数据”是用于不可重入的,对吗?看,对于可重入函数,yywrap似乎不是用yylex的参数调用的。。。今天下午我得再检查一遍。@peterius:scanner\t有一个额外的数据槽,但你可以做任何你想要的。这仅适用于可重入式扫描仪,可重入式
yywrap
是通过
scanner\t
参数调用的。可能取决于flex版本,我没有检查。哦,有意思,所以可以扩展scanner\t?看,我认为这是不透明的,我用扫描仪参考传递我自己的。“额外数据”是用于不可重入的,对吗?看,对于可重入函数,yywrap似乎不是用yylex的参数调用的。。。今天下午我得再检查一遍。@peterius:scanner\t有一个额外的数据槽,但你可以做任何你想要的。这仅适用于可重入式扫描仪,可重入式
yywrap
通过
scanner\t
参数调用。可能取决于flex版本,我没有检查。