флекс / бизон исправляет утечки памяти неожиданными токенами - PullRequest
1 голос
/ 20 июля 2010

У меня есть флекс зубров. Для некоторых из моих токенов я копирую yytext из flex, используя strdup. Это прекрасно работает, за исключением случаев, когда возникает ошибка неожиданного токена.

простой пример

flex.l:
...
[a-zA-Z0-9]+ { lval.string = strdup(yytext); return IDENT };
[\{\}]       { return yytext[0] };
...

и

parse.y
...
%destructor { free($$); } IDENT
%destructor { free($$->name); free($$->type); free($$); } tag
...
tag: IDENT '{' IDENT '}'
     {
         struct tag *mytag = malloc(sizeof(struct tag));
         mytag->name = $1;
         mytag->type = $3;
         $<tag>$ = mytag;
      }
...

Теперь предположим, что я передал ему:

blah blah blah

Лексер отправит первый токен IDENT, который помещается в стек. После первого токена он ожидает токен-скобку, но вместо этого получает еще один токен IDENT. Это синтаксическая ошибка. Деструктор будет вызываться на первом ИДЕНТИФИКАТЕЛЕ, но не на втором (неожиданном) Я не смог найти способ уничтожить неожиданный жетон. Кто-нибудь знает, как мне это сделать?

1 Ответ

3 голосов
/ 20 июля 2010

Я обнаружил, что правильное использование токена error в flex заставляет его правильно вызывать функцию деструктора.Иди ко мне!

parse.y
...
%destructor { free($$); } IDENT
%destructor { free($$->name); free($$->type); free($$); } tag
...
tags: tag tags | error tags | ;

tag: IDENT '{' IDENT '}'
     {
         struct tag *mytag = malloc(sizeof(struct tag));
         mytag->name = $1;
         mytag->type = $3;
         $<tag>$ = mytag;
     }
...
...