flex/bison устраняет утечку памяти с помощью неожиданных токенов

У меня есть гибкое приложение bison. Для некоторых моих токенов я копирую 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. Это синтаксическая ошибка. Деструктор будет вызываться для первого токена IDENT, но не для второго (неожиданного). Я не смог найти способ уничтожить неожиданный токен. Кто-нибудь знает, как мне это сделать?


person jdizzle    schedule 20.07.2010    source источник


Ответы (1)


Я обнаружил, что правильное использование токена «ошибка» во 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;
     }
...
person jdizzle    schedule 20.07.2010