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