计算器不考虑操作的优先级

时间:2012-07-12 12:30:15

标签: perl

这是一个简单的代码。必须略微修改它以考虑操作的优先级,但我无法弄清楚要修复的内容。

`

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";

`

我很乐意帮助,谢谢你。

2 个答案:

答案 0 :(得分:3)

如果您决定使用Parse::RecDescent(或任何其他LL解析器),建议您阅读Operator Associativity and Eliminating Left-Recursion in Parse::RecDescent

答案 1 :(得分:2)

您应该考虑将输入转换为某种语法树。它会缓解你的问题。想到了分流码算法。