2010-07-20 47 views
1

我有一个灵活的野牛应用程序。对于我的一些令牌,我使用strdup从flex复制了yytext。除非出现意外令牌的错误,否则此功能很好。弯曲/野牛修复内存泄漏与意外的令牌

简单的例子

flex.l: 
... 
[a-zA-Z0-9]+ { lval.string = strdup(yytext); return IDENT }; 
[\{\}]  { return yytext[0] }; 
... 

parse.y 
... 
%destructor { free($$); } IDENT 
%destructor { free($$->name); free($$->type); free($$); } tag 
... 
tag: IDENT '{' IDENT '}' 
    { 
     struct tag *mytag = malloc(sizeof(struct tag)); 
     mytag->name = $1; 
     mytag->type = $3; 
     $<tag>$ = mytag; 
     } 
... 

现在假设我把它输入:

blah blah blah 

词法分析器将发送了第一个IDENT令牌,该令牌被压入堆栈。在第一个令牌期待一个括号令牌之后,而是获得另一个IDENT令牌。这是一个语法错误。第二个(意外的)将在第一个 IDENT令牌上调用析构函数,但而不是。我一直无法找到破坏意外令牌的方法。有谁知道我应该怎么做?

回答

2

我发现在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; 
    } 
...