Acme-AlgebraicToRPN
view release on metacpan or search on metacpan
lib/Acme/AlgebraicToRPN.pm view on Meta::CPAN
$rpn =~ s/\s//g;
./_Eval($rpn);
my @result = ./_Cleanup();
# reset, ready for next equation
$.stack = [];
return @result;
}
=head2 B<rpn_as_string>
$stack = $al->rpn($expr);
Same as B<rpn>, but returns as a comma-separated list. Split on
commas, and you have your stack to be processed.
=cut
sub rpn_as_string {
my ($self, $algebraic) = @_;
my @result = ./rpn($algebraic);
return join(",", @result);
}
sub _Cleanup {
my ($self) = @_;
my @Stack;
map {
$_ =~ s/^,//;
if ($_ ne '') {
my (@c) = split(',', $_);
if (@c) {
s/\s//g foreach @c;
push(@Stack, @c);
}
else {
push(@Stack, $_);
}
}
} @{$.stack};
return @Stack;
}
sub _Eval {
my ($self, $expr) = @_;
return unless defined $expr;
#print "Evaling $expr\n";
if ($expr =~ /(.+?),(.+)/) {
my $L = $1;
my $R = $2;
if ($L =~ /^\w+$/ && $R =~ /$RE{balanced}{-parens=>'()'}/) {
#print "HERE $L\n";
push(@{$.stack}, $L);
}
}
if ($expr =~ /(\w+)($RE{balanced}{-parens=>'()'})(.*)/) {
my $op = $1;
my $p = $2;
my $r = $3;
my $core = substr($p, 1, length($p)-2);
if (defined $.userFunc && defined $.userFunc{$op}) {
# count # of commas in arg list
my $na = $core =~ tr/,/,/;
# bump by one
$na++;
# add # of aguments on
$core = qq($core,$na);
}
./_Eval($core);
push(@{$.stack}, $core)
unless $core =~ /$RE{balanced}{-parens=>'()'}/;
push(@{$.stack}, $op);
./_Eval($r)
if defined $r && $r =~ /$RE{balanced}{-parens=>'()'}/;
push(@{$.stack}, $r)
if defined $r && !($r =~ /$RE{balanced}{-parens=>'()'}/);
}
}
=head2 B<check>
$ok = $al->check(\@stack, @expected);
Checks result of RPN conversion. @stack is what the B<rpn> function
returned, and @expected is what you expected the result to be. This
is kind of a diagnostic routine for testing.
Returns 1 if both @stack and @expected were the same, 0 if not.
=cut
sub check {
my ($self, $ref, @result) = @_;
my @shouldbe = @$ref;
return 0 unless @shouldbe == @result;
my $same = 1;
map {
my $sb = shift(@shouldbe);
$same = 0 unless $sb eq $_;
} @result;
return $same;
}
1; # End of Acme::AlgebraicToRPN
( run in 1.869 second using v1.01-cache-2.11-cpan-140bd7fdf52 )