逆波兰表示法计算器
作者:Daniel Carrera
用法
perl6 RPN.pl "5 4 + 3 / 5 3 - *"
源代码:RPN.pl
use v6;
my token Op { '+' || '-' || '*' || '/' };
my token Value { \d+[\.\d+]? };
my token Item { <Value> || <Op> };
my token Expr { [<Item> <ws>]+ };
sub MAIN(Str $expression = "5 4 + 3 / 5 3 - *") {
calculate($expression);
}
sub calculate(Str $str) {
if $str ~~ /^ <Expr> $/ {
my @stack;
for $/<Expr><Item>.list -> $item {
if $item<Value> {
@stack.push($item<Value>);
}
else {
my $v1 = @stack.pop;
my $v0 = @stack.pop;
@stack.push(do_op($v0,$v1,$item<Op>));
}
}
say @stack[0];
}
else {
say "This is not an RPN expression.";
}
}
sub do_op($lhs, $rhs, $op) {
given $op {
when '*' { $lhs * $rhs }
when '+' { $lhs + $rhs }
when '-' { $lhs - $rhs }
when '/' { $lhs / $rhs }
}
}
Perl 6 示例