有什么方法可以替换 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 扫描仪还有其他充分的理由。
你可以替换 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 扫描仪还有其他充分的理由。