繁体   English   中英

如何将 yyout 重定向到 GNU flex 中的 char* 缓冲区?

[英]How to redirect yyout to char* buffer in GNU flex?

默认情况下yyout设置为stdout并且可以重定向到FILE*流。 是一种将yyout重定向到char*吗?

有很多方法可以做到这一点。 如果您在尝试使用 yyout 的地方发布了一些扫描仪代码,我可以给您一个更具体的答案:

通常是在你的行动中你会这样做。 因此,不要使用ECHOfprintf(yyout...你会使用其他类似的东西

<token>  { snprintf(buf, sizeof(buf), "%s", yytext); }

早先你会声明:

char buf[BUFSIZE];

附录 I - 另一种方法

有处理这种情况的聪明方法,但从长远来看,它们很容易出现维护问题,因为它们“聪明”……而且解决方案越聪明,其寿命就越短。 (除非巧妙地记录在案并附有警告)

 int yyprintf(const char *fmt, ...)  {
     va_list ap;
     va_start(ap, fmt);
     if ( some_flag & FLAG_OUTFILE ) {
         vfprintf(yyout, fmt, ap);
     }
     else {
         sprintf(buf, fmt, ap);
     }
     va_end(ap);
 }

其中 buf 是全局缓冲区。

但是,如果您想让事情变得有点本地化:

方法 2:细粒度控制事物的去向和时间

您希望对事情的进展进行精细控制。 有时您希望输出到文件,有时希望输出到字符串,并且您并不总是知道哪个是哪个以及何时何地可以使用这样的东西:

 int myvprintf(void *here, size_t len, const char *fmt, va_list ap) 
      __attribute__((format (gnu_printf, 3, 4), nonnull(1, 3))) {
     
     int rv;

     if ( len > 0 ) { 
        rv = vsnprintf((char *), len, fmt, ap);
     }
     else {
        rv = vfprintf((FILE *)here, fmt, ap);
     }

     return rv;
 }

 int myprintf(void *here, size_t len, const char *fmt, ... ) 
      __attribute__((format (gnu_printf, 3, 4), nonnull(1, 3))) {
     int rv;
     va_list ap;
     va_start(ap, fmt);
     rv = myvprintf(here, len, fmt, ap);
     va_end(ap);
     return rv;
 }

并在此过程中使用 myprintf,您将始终控制here的内容。

只是为了好玩

不要在家里尝试这个。 但是所有 yy* 标识符和 ECHO 都不是普通变量,它们是 #define 的。 所以你可以做一些巧妙的宏重写:

例如,如果您在任何地方都使用 ECHO,那么您可以在顶部重新定义它以执行您喜欢的任何操作(仅 #undef 和 #define):

%{
#undef ECHO
#define ECHO snprintf(buf, sizeof(buf), "%s", yytext)
%}

%%

<token> ECHO;
%% 

只需将其全部隐藏在令人费解的标题中,并做其他聪明的事情,这将使您讨厌的程序员稍后进行调试。 这可以有自己的奖励和咯咯笑声。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM