-5

ここに簡単なコードがあります。操作の優先度を考慮して少し変更する必要がありますが、何を修正すればよいかわかりません。

`

print "\nEnter the expression: ";

chomp($_ = <>);

print "\n";

sub mul {return $1*$2;}
sub div {return $1/$2;}
sub sum {return $1+$2;}
sub dif {return $1-$2;}

while(
     s/([+-]?\d+)\s*[*]\s*([+-]?\d+)/mul($1,$2)/e  || 
     s/([+-]?\d+)\s*[\/]\s*([+-]?\d+)/div($1,$2)/e || 
     s/([+-]?\d+)\s*[+]\s*([+-]?\d+)/sum($1,$2)/e  || 
     s/([+-]?\d+)\s*[-]\s*([+-]?\d+)/dif($1,$2)/e  || 
     s/\(\s*([+-]?\d+)\s*\)/$1/e
      )

{print "$_\n";}

print "\nThe ansver = $_\n";

`

お役に立てて光栄です、ありがとうございました。

4

2 に答える 2

3

Parse::RecDescent (またはその他の LL パーサー)を使用することにした場合は、演算子の結合性と Parse::RecDescent での左再帰の排除を読むことをお勧めします。

于 2012-07-12T15:48:41.470 に答える
2

入力をある種の構文ツリーに変換することを本当に検討する必要があります。それはあなたの問題を緩和します。シャント・ヤード・アルゴリズムが思い浮かびます。

于 2012-07-12T15:42:30.417 に答える