Я пишу упрощенный парсер/интерпретатор Pascal, и теперь я думаю об ошибках сегментации. Я их не получаю, все работает нормально, но поскольку я разрабатываю под Cygwin, я не могу проверить программу через valgrind.Как правильно уничтожить семантические значения токенов (записи символов) и избежать утечек памяти с помощью GNU Bison?
В основном то, что я делаю описано ниже:
typedef struct{
char idType; //Integer (i), Real (r), Char (c), String (s) or Function (f)
union{
int intValue;
double fltValue;
char chrValue;
char *strValue;
}idValue;
}symrec;
.
.
.
%union{
symrec *symbol;
}
.
.
.
%destructor {
if($$->idType == 's'){
free($$->idValue.strValue);
}
free($$);
} tIdentifier tLiteralString tLiteralChar tLiteralInteger tLiteralReal
Конечно, жетоны набран правильно и все. Проблема в том, что, например, отрицание некоторых выражений. Я обычно повторно использую некоторый symrec * вместо malloc новый.
Пример:
pArithmetic: tMinus pExpression { $$ = -$2; }
Конечно, это не действует в моем контексте (в данном примере я просто считать Int или двойной, как тип данных), я разборе symrec * правильно, но в этом сценарий, не приведет деструктор dealloc $ 2, оставив $$ в качестве своего рода висячего указателя?
Что касается написания этого, я думаю, что если это действительно произойдет, и я получу некоторые segfaults, могу ли я просто сделать $ 2 = NULL; и проверьте это в разделе% destructor {}?
PS: Я не являюсь носителем английского языка, и я сделал это довольно долго, поэтому прошу прощения за любые запутанные идеи, которые я быстро объясню.
с каких пор% деструктор был введен в бизон? –
Извините, не могу точно сказать, когда. Этот вопрос появился, когда я разработал домашнюю домашнюю страницу компиляторов, несколько месяцев назад, а затем я даже не понял, что% деструктор был новым синтаксисом. – Spidey