数式の評価を便利な道具で #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されることはなくなる。