什么时候在BISON中调用%析构函数?

Jak*_* M. 5 c++ bison

什么时候在BISON中调用%析构函数?我有以下野牛代码:

%union{
    char * sval; 
    Variable * vval; 
} 

%token VARIABLE 
%token Literal 
%type <vval> Expression VARIABLE 
%type <sval> Literal 

%destructor { delete $$; } <vval> 
%destructor { delete $$; } Literal 
Run Code Online (Sandbox Code Playgroud)

其中Variable是一个类.我认为在处理一行之后,所有的Variable对象都将被释放,但我看不到调用析构函数.这将导致直接内存泄漏......

编辑:要清楚; 我为新令牌分配了一个新的Variable对象,并将此令牌推送到BISON堆栈.我希望删除变量,当它被bison弹出并从堆栈中丢弃时.我认为%析构函数可以达到这个目的,但我不确定了..

Joh*_*ter 6

来自"野牛手册":

丢弃的符号如下:

  • 在错误恢复的第一阶段弹出堆叠符号,
  • 在错误恢复的第二阶段进入终端,
  • 当解析器立即返回时,当前前瞻和整个堆栈(当前右侧符号除外),和
  • 解析器成功时的开始符号.

因此,如果您没有遇到错误,%destructor如果您立即返回(call YYABORTYYACCEPT),将在堆栈上调用,或者如果解析成功,它将在启动符号上调用它.


Jak*_* M. 4

我发现,我应该在执行操作后释放它,例如

...
| String CONCAT String { $$ = concat($1,$3); free($1); free($3); }
...
Run Code Online (Sandbox Code Playgroud)

这对我来说很有效。