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

エラー回復時に機械的にシンボルが捨てられることによってメモリリークが発生していた。
Bison宣言には%destructor宣言がありエラー回復時のこの動作が行われる時に、
シンボルを1個破棄するごとに自動実行されるコードを指定できる。

--- calc.y      #
+++ #   #
@@ -14,6 +14,7 @@
 %left '+'
 %left '*'
 %type <val> expr
+%destructor { CHECK_MPZ("error_recovery_clear", $$); mpz_clear($$); } <val>
 %%
 stmt:
       /* empty */
$ ./calc
[lexer] init(003E24D0)
1+2*3
[lexer] set(003E24D0)
[parser] init(003E2540)
[parser] set(003E2540)
[lexer] set(003E24D0)
[parser] init(003E2550)
[parser] set(003E2550)
[lexer] set(003E24D0)
[parser] init(003E2560)
[parser] set(003E2560)
[parser] init(003E2570)
[parser] mul(003E2570)
[parser] clear(003E2550)
[parser] clear(003E2560)
[parser] init(003E2560)
[parser] add(003E2560)
[parser] clear(003E2540)
[parser] clear(003E2570)
7
[parser] clear(003E2560)

1+2*
[lexer] set(003E24D0)
[parser] init(003E2560)
[parser] set(003E2560)
[lexer] set(003E24D0)
[parser] init(003E2570)
[parser] set(003E2570)
syntax error
[parser] error_recovery_clear(003E2570)
[parser] error_recovery_clear(003E2560)

1+2
[lexer] set(003E24D0)
[parser] init(003E2560)
[parser] set(003E2560)
[lexer] set(003E24D0)
[parser] init(003E2570)
[parser] set(003E2570)
[parser] init(003E2540)
[parser] add(003E2540)
[parser] clear(003E2560)
[parser] clear(003E2570)
3
[parser] clear(003E2540)


[lexer] clear(003E24D0)

$ 

のように入力「1+2*」のエラー回復時にもclearするコードが呼ばれる。