【问题标题】:flex/bison fixing memory leaks with unexpected tokensflex/bison 使用意外令牌修复内存泄漏
【发布时间】:2010-07-20 12:58:34
【问题描述】:

我有一个 flex bison 应用程序。对于我的一些标记,我使用 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 令牌上调用析构函数,但在第二个(意外的)令牌上。我一直无法找到破坏意外令牌的方法。有谁知道我应该怎么做?

【问题讨论】:

    标签: memory-leaks bison flex-lexer


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 2012-10-11
      • 2011-01-10
      • 1970-01-01
      • 2013-07-29
      • 2017-07-29
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多