数式の評価を便利な道具で #8

これを回避する素朴な方法は%destructor宣言で後始末をしようとする対象がyylvalであればそれを行わないこと。
デバグプリント版であれば、

...snip
%destructor { if (! isyylval($$)) { CHECK_MPZ("error_recovery_clear", $$); mpz_clear($$); } } <val>
%%
...snip
%%
...snip
int isyylval(mpz_t v)
{
    return v == yylval.val;
}
$ ./calc
[lexer] init(003E24D0)
1 2
[lexer] set(003E24D0)
[parser] init(003E2540)
[parser] set(003E2540)
[lexer] set(003E24D0)
syntax error
[parser] error_recovery_clear(003E2540)


[lexer] clear(003E24D0)

$ 

これでyylvalがclearされることはなくなる。