Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory leaks flex/bison使用意外令牌修复内存泄漏_Memory Leaks_Bison_Flex Lexer - Fatal编程技术网

Memory leaks flex/bison使用意外令牌修复内存泄漏

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 bison应用程序。对于我的一些令牌,我使用strdup从flex中复制yytext。这非常有效,除非出现意外令牌错误

简单例子

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;
     }
...