Memory leaks flex/bison使用意外令牌修复内存泄漏
我有一个flex bison应用程序。对于我的一些令牌,我使用strdup从flex中复制yytext。这非常有效,除非出现意外令牌错误 简单例子Memory leaks flex/bison使用意外令牌修复内存泄漏,memory-leaks,bison,flex-lexer,Memory Leaks,Bison,Flex Lexer,我有一个flex bison应用程序。对于我的一些令牌,我使用strdup从flex中复制yytext。这非常有效,除非出现意外令牌错误 简单例子 flex.l: ... [a-zA-Z0-9]+ { lval.string = strdup(yytext); return IDENT }; [\{\}] { return yytext[0] }; ... 及 lexer将发送第一个IDENT令牌,该令牌被推送到堆栈上。在第一个令牌之后,它需要一个括号令牌,但会得到另一个IDENT
flex.l:
...
[a-zA-Z0-9]+ { lval.string = strdup(yytext); return IDENT };
[\{\}] { return yytext[0] };
...
及
lexer将发送第一个IDENT令牌,该令牌被推送到堆栈上。在第一个令牌之后,它需要一个括号令牌,但会得到另一个IDENT令牌。这是一个语法错误。将对第一个IDENT令牌调用析构函数,但不会对第二个IDENT令牌(意外令牌)调用析构函数。我还没有找到一种方法来破坏这个意外的令牌。有人知道我应该怎么做吗?我发现在flex中正确使用“error”标记会提示它正确调用析构函数。跟我来
parse.y
...
%destructor { free($$); } IDENT
%destructor { free($$->name); free($$->type); free($$); } tag
...
tags: tag tags | error tags | ;
tag: IDENT '{' IDENT '}'
{
struct tag *mytag = malloc(sizeof(struct tag));
mytag->name = $1;
mytag->type = $3;
$<tag>$ = mytag;
}
...
parse.y
...
%析构函数{free($$);}IDENT
%析构函数{free($$->name);free($$->type);free($$);}标记
...
标记:标记标记|错误标记|;
标记:IDENT'{'IDENT'}'
{
结构标签*mytag=malloc(sizeof(结构标签));
mytag->name=$1;
mytag->type=$3;
$$=mytag;
}
...
blah blah blah
parse.y
...
%destructor { free($$); } IDENT
%destructor { free($$->name); free($$->type); free($$); } tag
...
tags: tag tags | error tags | ;
tag: IDENT '{' IDENT '}'
{
struct tag *mytag = malloc(sizeof(struct tag));
mytag->name = $1;
mytag->type = $3;
$<tag>$ = mytag;
}
...