gpt4 book ai didi

当与词法分析器中的 strdup() 一起使用时,flex/bison 中的 Char* 作为 YYSTYPE 仅返回标记中的第一个字符

转载 作者:行者123 更新时间:2023-12-03 23:25:01 25 4
gpt4 key购买 nike

我正在使用 char*YYSTYPE在用 flex 和 bison 构建的编译器中。线

#define YYSTYPE char*

位于我的语法文件的顶部。我的词法分析器中的一些标记需要传递它们与我的语法匹配的整个字符串,而其他标记只需要传递它们的标记,所以这对我来说很有效。我在我的词法分析器中做这样的事情:
[(foo|bar)]    {yylval = *strdup(yytext); return FOOBAR;}

在我的语法中,我将它们与这样的作品一起使用:
fb:
FOOBAR
{
sprintf($$, "%s", &$1);
}
;

这将设置 $$ 的值到原始匹配标记中的第一个字符。我(可能)明白为什么,因为取消引用 char*char ,但我修复它的步骤导致了问题。例如,删除 &来自 sprintf()行导致段错误。删除 *从赋值导致“从指针生成整数而不进行强制转换”。我该怎么办?我认为问题在于对 yylval 的赋值.

最佳答案

你正在做的事情有几个问题。首先,由于 YYSTYPE是一个字符指针,实际上没有为字符串分配空间。所以当你做 sprintf($$, "%s", &$1) ,您尝试将字符串打印到未初始化的指针中( $$ 是一个指针,但未初始化为任何内容,因此它可以指向内存中的任何位置。)

另一个问题可能是您使用了 &$1sprintf .它获取指针的地址,而不是指针指向的实际字符串。

第三个问题是您正在使用 strdup在词法分析器中,它分配内存。但是您永远不会在某处释放它,从而造成内存泄漏。

第四个也是最后一个问题是为什么你只得到一个字符,你实际上很幸运得到了它,因为 while strdup(yytext)正在返回一个字符串的副本,它前面的星号返回取消引用的指针,它是一个字符。因此,您将指针设置为单个字符。

编辑:我希望这一切都有意义,已经晚了,我可能会喝一两杯酒......

关于当与词法分析器中的 strdup() 一起使用时,flex/bison 中的 Char* 作为 YYSTYPE 仅返回标记中的第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8362048/

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