Когда% Деструктор вызывается в BISON? - PullRequest
5 голосов
/ 19 июня 2011

Когда% деструктор вызывается в BISON ? У меня есть следующий код зубра:

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

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

%destructor { delete $$; } <vval> 
%destructor { delete $$; } Literal 

, где Переменная - это класс. Я думал, что после обработки строки все объекты Variable будут освобождены, но я не вижу вызванного деструктора. И это приведет к утечке памяти ...

Редактировать: чтобы было ясно; Я выделяю новый объект Variable для нового токена, и этот токен помещается в стек BISON. Я хочу удалить переменную , когда она извлечена зубром и сброшена из стека. Я думал, что% деструктор служит этой цели, но я больше не уверен ..

Ответы [ 2 ]

6 голосов
/ 19 июня 2011

Из Руководства зубров:

Сбрасываются следующие символы:

  • сложенные символы вытолкнулись во время первой фазы восстановления после ошибки,
  • входящие терминалы во время второй фазы восстановления после ошибок,
  • текущий прогноз и весь стек (кроме текущего символы правой стороны), когда синтаксический анализатор немедленно возвращается, и
  • начальный символ, когда синтаксический анализатор завершается успешно.

Так что, если вы не нажмете ошибку, %destructor будет вызван в стеке, если вы вернетесь немедленно ( call YYABORT или YYACCEPT), или он вызовет ее на начальный символ, если разбор успешен.

3 голосов
/ 20 июня 2011

Я понял, что должен () освободить его после выполнения действия, например,

...
| String CONCAT String { $$ = concat($1,$3); free($1); free($3); }
...

Это помогло мне.

...