【发布时间】:2015-09-15 05:52:28
【问题描述】:
我有使用strdup() 复制字符串词位的弹性代码。
%{
#include "json.tab.h"
#define YY_DECL extern "C" int yylex()
%}
%option noyywrap
%%
[ \t\n]+ ;
\"[a-zA-Z]+\" {yylval.sval = strdup(yytext); return STRING; }
[0-9]+ {yylval.ival = atoi(yytext); return NUMBER; }
. {return yytext[0];} ;
%%
strdup() 分配内存并将输入字符串复制到其中并返回(strdup() - what does it do in C?),所以我想当我不再需要它时需要释放它。
从这个帖子:When is %destructor invoked in BISON?,我在 yacc 文件中添加了%destructor { free($$); printf("free");} STRING。
但是,即使为yylval.sval 分配了从strdup() 返回的新字符串,我也没有看到free() 被调用。
可能出了什么问题?如何释放flex/bison中分配的字符串?
添加
我考虑使用静态分配的sval如下:
%union {
int ival;
char sval[100]; // char* sval;
}
flex 代码现在变为(如果 yytext 小于 100 字节,则没有检查代码):
\"[a-zA-Z]+\" {
//yylval.sval = strdup(yytext);
memset(yylval.sval, 0, 100);
strcpy(yylval.sval, yytext);
return STRING;
}
我不确定这种方法是否是人们通常使用的方法。
添加2
对于我的申请,简单的实习是可以的。
extern char buffer[]; // [100];
%}
%option noyywrap
%%
\"[a-zA-Z]+\" {
//yylval.sval = strdup(yytext);
memset(buffer, 0, 100);
strcpy(buffer, yytext);
yylval.sval = buffer;
return STRING;
}
...
char buffer[100];
对于 yacc 代码
%union {
int ival;
char *sval;
}
【问题讨论】:
-
你知道c和c++不是一回事吗?不要在 C++ 中使用
strdup(),使用std::string并忘记为字符串分配或释放内存。 -
@iharob:我想我不明白你的回答。您能否详细说明如何使用 std::string 将其分配给 yylval 变量?
-
我不记得怎么做了,但肯定有可能。问题是您正在生成一个 c 解析器,并使用 c++ 代码。阅读有关 c++ 解析器的信息。
-
@iharob:你能做的最好的就是在联合中放置一个 std::string *,这需要你仍然关心内存管理。
标签: c bison yacc flex-lexer strdup