Acme-AlgebraicToRPN
view release on metacpan or search on metacpan
lib/Acme/AlgebraicToRPN.pm view on Meta::CPAN
#my $tree = Math::Symbolic->parse_from_string($algebraic);
my $tree;
my $rpn;
eval q(
$tree = $.parser->parse($algebraic);
$rpn = $tree->to_string('prefix');
);
if ($@) {
print STDERR "$.Class - equation didn't parse; did you forget ",
"to add a userFunc?\n";
return undef;
}
$rpn =~ s/\s//g;
./_Eval($rpn);
my @result = ./_Cleanup();
# reset, ready for next equation
$.stack = [];
return @result;
lib/Acme/AlgebraicToRPN.pm view on Meta::CPAN
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}) {
t/01-test.t view on Meta::CPAN
$expr = '2*news(a)/2+pi';
test('-sin(box(a,20))', qw(a 20 2 box sin negate));
test('log(a)', qw(a log));
test('atan2(a,b)', qw(a b atan2));
test('a^b', qw(a b exponentiate));
test('a^b3', qw(a b3 exponentiate));
test('a^-1', qw(a 1 negate exponentiate));
test('sin(pi/3)*2/log(2,1.3)', qw(pi 3 divide sin 2 multiply 2 1.3 log divide));
test('4*foo(a,3)', qw(4 a 3 2 foo multiply));
test('4*foo(a,3,55)', qw(4 a 3 55 3 foo multiply));
print STDERR "Shouldn't parse due to 'boo' function, which we don't know\n";
ok(!defined($rpn->rpn('4*boo(a,3,55)')));
#print $rpn->rpn_as_string($expr), "\n";
sub test {
my ($expr, @desired) = @_;
print STDERR "rpn = $expr... ";
my @r = $rpn->rpn($expr);
#print Dumper(\@r);
my $same = $rpn->check(\@desired, @r);
print STDERR "Different lengths\n" unless @r == @desired;
print STDERR $same ? "Ok!\n" : "NOT Ok!\n";
print STDERR "Got: ", Dumper(\@r) unless $same;
print STDERR "Expected: ", Dumper(\@desired) unless $same;
ok($same);
}
( run in 0.821 second using v1.01-cache-2.11-cpan-de7293f3b23 )