2010-07-20 119 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; 
    } 
...