【发布时间】: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