-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 回答