use strict;
package Precedence;
sub precedence_rpn {
my ($self, $expr, $table) = @_;
my $tail = pop @$expr;
for my $elem (@$tail) {
push @$expr, @$elem;
}
my ($out, $ops) = ([], []);
push @$out, shift @$expr;
while (@$expr) {
my $op = shift @$expr;
my ($p, $a) = @{$table->{$op}}{'p', 'a'};
while (@$ops) {
my $p2 = $table->{$ops->[0]}{p};
last if $p > $p2 or $p == $p2 and $a eq 'r';
push @$out, shift @$ops;
}
unshift @$ops, $op;
push @$out, shift @$expr;
}
$self->flatten([@$out, @$ops]);
}
1;