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