2

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

4

1 回答 1

4

我发现在 flex 中适当使用“错误”标记会提示它正确调用析构函数。走我!

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;
     }
...
于 2010-07-20T13:29:22.277 回答