我有使用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() - 它在 C 中做了什么?),所以我想当我不再需要它时需要释放它。
来自这篇文章:什么时候在 BISON 中调用 %destructor?,我%destructor { free($$); printf("free");} STRING
在yacc文件中添加了。
但是,free()
即使yylval.sval
分配了从strdup()
.
可能有什么问题?如何释放 flex/bison 中分配的字符串?
添加
我考虑使用静态分配的 sval 如下:
%union {
int ival;
char sval[100]; // char* sval;
}
弹性代码现在变为(如果 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;
}