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