gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:16 25 4
gpt4 key购买 nike

默认情况下 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,您将始终控制此处的内容。

纯属娱乐

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

例如,如果你在任何地方都使用 ECHO,那么你可以在顶部重新定义它来做任何你喜欢的事情(只是#undef 和#define):

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

%%

<token> ECHO;
%%

只需将其全部隐藏在复杂的 header 中,并采取其他技巧,这些技巧会让您讨厌的程序员稍后进行调试。这可以有它自己的奖励和笑声。

关于c - 如何在 GNU flex 中将 yyout 重定向到 char* 缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com