这是一个简单的代码。必须略微修改它以考虑操作的优先级,但我无法弄清楚要修复的内容。
`
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";
`
我很乐意帮助,谢谢你。
答案 0 :(得分:3)
如果您决定使用Parse::RecDescent(或任何其他LL解析器),建议您阅读Operator Associativity and Eliminating Left-Recursion in Parse::RecDescent。
答案 1 :(得分:2)
您应该考虑将输入转换为某种语法树。它会缓解你的问题。想到了分流码算法。