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

ということで、引き算や割り算や括弧が使える版のcalc.y用の修正パッチ。

--- calc.y      #
+++ #   #
@@ -12,8 +12,8 @@
 %left '+' '-'
 %left '*' '/'
 %left NEG
-%type <val> expr
-%destructor { mpz_clear($$); } <val>
+%type <val> expr uint
+%destructor { mpz_clear($$); } expr
 %%
 stmt:
       /* empty */
@@ -22,7 +22,7 @@
     | error '\n'        { yyerrok; }
     ;
 expr:
-      UINT          { mpz_init($$); mpz_set($$, $1); }
+      uint          { mpz_init($$); mpz_set($$, $1); mpz_clear($1); }
     | expr '+' expr { mpz_init($$); mpz_add($$, $1, $3); mpz_clears($1, $3, NULL); }
     | expr '-' expr { mpz_init($$); mpz_sub($$, $1, $3); mpz_clears($1, $3, NULL); }
     | expr '*' expr { mpz_init($$); mpz_mul($$, $1, $3); mpz_clears($1, $3, NULL); }
@@ -30,6 +30,9 @@
     | '-' expr %prec NEG { mpz_init($$); mpz_neg($$, $2); mpz_clear($2); }
     | '(' expr ')' { mpz_init($$); mpz_set($$, $2); mpz_clear($2); }
     ;
+uint:
+      UINT          { mpz_init($$); mpz_set($$, $1); }
+    ;
 %%
 int main(void)
 {