默认情况下yyout
设置为stdout
并且可以重定向到FILE*
流。是一种重定向yyout
到的方法char*
吗?
user2465521
问问题
1731 次
1 回答
1
有很多方法可以做到这一点。如果您在尝试使用 yyout 的地方发布一些扫描仪代码,我可以给您一个更具体的答案:
通常,在您的行动中,您会执行此操作。所以不要使用ECHO
或者fprintf(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;
%%
只需将其全部隐藏在复杂的标题中并做其他聪明的事情,这将使您讨厌的程序员在以后调试地狱。这可以有它自己的奖励和笑声。
于 2013-06-08T04:28:35.050 回答