2010-09-21 4 views
1

Я работаю над комбинацией лексера/парсера с Bison и Flex, и я немного обеспокоен утечками памяти.Когда освободить память?

грамматика довольно проста, и (до сих пор), я смог уйти со следующим определением:

#define YYSTYPE char const * 

В Flex, когда я прочитал строки, я выделить достаточно памяти для эту строку, а затем скопируйте ее в yylval. Насколько я знаю, это вполне стандартная практика.

Однако я не могу найти какие-либо документы в любом месте, которые скажут мне, когда я должен освободить память в yylval.

Использует ли Bison это автоматически для меня? Должен ли я сделать это в конце моего действия? Или когда еще я должен это делать?

ответ

4

Каждый раз, когда правая сторона оценивается, элементы RHS на стеке (то есть, $1, $2 и т.д.) должны быть высвобождены или скопировать в $$.

После выполнения действия уменьшения указатель стека уменьшается на количество символов в RHS, а $$ становится самым верхним элементом, поэтому все оставленные в стеке будут потеряны или сбиты путем последующих сдвигов в стек.

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

+0

Не забывайте, что: 'non_terminal: nt1 {frag1} nt2 {frag2};' хранит $ 2 как результат frag1, доступного для frag2. –

+0

Я фактически не разбираю много (если есть) целых чисел - это все цитируемые строки. –

+0

Да, но внутренне синтаксический анализатор хранит каждый токен и нетерминальный символ как целое число в стеке разбора. Lexer ('yylex') возвращает целочисленный токен код, даже если есть дополнительная информация для каждого токена (т. Е. Токена). –

Смежные вопросы