数式の評価を便利な道具で #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するコードが呼ばれる。