2009-07-08 2 views
2

Я пишу упрощенный парсер/интерпретатор 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: Я не являюсь носителем английского языка, и я сделал это довольно долго, поэтому прошу прощения за любые запутанные идеи, которые я быстро объясню.

+0

с каких пор% деструктор был введен в бизон? –

+0

Извините, не могу точно сказать, когда. Этот вопрос появился, когда я разработал домашнюю домашнюю страницу компиляторов, несколько месяцев назад, а затем я даже не понял, что% деструктор был новым синтаксисом. – Spidey

ответ

1

No, %destructor s вызывается только тогда, когда синтаксический анализатор отбрасывает символы как часть восстановления ошибок.

Когда правило соответствует, владение символами должно быть передано, как правило, до $$ или уничтожено в правиле. Таким образом, ваш унарный минус-пример не содержит свисающих указателей.

Чтобы найти ваши segfaults, я предлагаю вам запустить код под gdb.

+0

Я точно не знаю, в какой момент, но segfaults ушли! Итак, я могу использовать одно и то же общее правило для% деструкторов как нормальное уничтожение, но за исключением того, что они будут вызваны системой восстановления ошибок. Спасибо за уточнение. – Spidey