Affix-Infix2Postfix
view release on metacpan or search on metacpan
Infix2Postfix.pm view on Meta::CPAN
if ($fn) { # magic type for functions
if ($las) { # left associative
if ($func{$_[0]}) { return ( $self->elist(@_[1..$#_]) , $_[0] ); }
} else { # right associative
if ($func{$_[-1]}) { return ( $self->elist(@_[0..$#_-1]) , $_[-1] ); }
}
} else {
# print "op: $op\n";
if ($las) { # left associative # normal unary ops
if ($_[0] eq $op) { return ( $self->elist(@_[1..$#_]) , $rop ); }
} else { # right associative
if ($func{$_[-1]}) { return ( $self->elist(@_[0..$#_-1]) , $rop ); }
}
}
} else { # binary operator
$bi=$las ? ')':'(';
$bd=$las ? '(':')';
# we only need to inspect the ones not at the since they could only be
# unary ops
@trlist=$las ? (reverse 0..$#_) : (0..$#_);
$b=0; #brace count
for $i(@trlist) {
$_=$_[$i];
# print "item: ",$_,"\n";
($b++,next) if $_ eq $bi;
($b--,next) if $_ eq $bd;
if ($b < 0) { die "Too many ')'\n"; }
next if $b;
next if $i==0 or $i==$#_;
# if we made it here we are outside of braces
if ( $_ eq $op ) { return ( $self->elist(@_[(0..$i-1)]) , $self->elist(@_[$i+1..$#_]) ,$rop ); } # this is the magic line
}
# end of binary
}
}
# print Dumper($cop);
# this is just for parens
if ( $_[0] eq '(' and $_[$#_] eq ')' ) {
if ( $#_<2 ) { die "Empty parens\n"; }
return $self->elist(@_[1..$#_-1]);
}
die "error stack is: @_ error\n";
}
# Preloaded methods go here.
# Autoload methods go after =cut, and are processed by the autosplit program.
1;
__END__
# Below is the stub of documentation for your module. You better edit it!
=head1 NAME
Affix::Infix2Postfix - Perl extension for converting from infix
notation to postfix notation.
=head1 SYNOPSIS
use Affix::Infix2Postfix;
$inst=Affix::Infix2Postfix->new(
'ops'=>[
{op=>'+'},
{op=>'-'},
{op=>'*'},
{op=>'/'},
{op=>'-',type=>'unary',trans=>'u-'},
{op=>'func',type=>'unary'},
],
'grouping'=>[qw( \( \) )],
'func'=>[qw( sin cos exp log )],
'vars'=>[qw( x y z)]
);
$rc=$inst->translate($str)
|| die "Error in '$str': ".$inst->{ERRSTR}."\n";
=head1 DESCRIPTION
Infix2Postfix as the name suggests converts from infix to postfix
notation. The reason why someone would like to do this is that postfix
notation is generally much easier to do in computers. For example take
an expression like: a+b+c*d. For us humans it's pretty easy to do that
calculation. But it's actually much better for computers to get a
string of operations such as: a b + c d * +, where the variable names
mean put variable on stack.
=head1 AUTHOR
addi@umich.edu
=head1 SEE ALSO
perl(1).
=cut
( run in 2.216 seconds using v1.01-cache-2.11-cpan-5735350b133 )