Когда% Деструктор вызывается в BISON?
Когда% Деструктор вызывается в 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 ответа
Я понял, что я должен освободить его после выполнения действия, например,
...
| String CONCAT String { $$ = concat($1,$3); free($1); free($3); }
...
Это помогло мне.
Отбрасываются следующие символы:
- сложенные символы выскочили во время первой фазы восстановления после ошибок,
- входящие терминалы во время второго этапа устранения ошибок,
- текущий прогноз и весь стек (кроме текущих символов правой стороны), когда синтаксический анализатор немедленно возвращает результат, и
- начальный символ, когда синтаксический анализатор завершается успешно.
Так что, если вы не нажмете ошибку, %destructor
будет вызван в стеке, если вы вернетесь немедленно ( вызов YYABORT
или же YYACCEPT
), или это вызовет его на начальном символе, если синтаксический анализ завершится успешно.