Affix-Infix2Postfix
view release on metacpan or search on metacpan
Infix2Postfix.pm view on Meta::CPAN
# create regular expressions
# combined lists insert defaults etc.
for $op (@{$self->{'ops'}}) {
if (!exists( $op->{'type'} )) { $op->{'type'}='binary'; }
if (!exists( $op->{'assoc'} )) { $op->{'assoc'}='left'; }
if (!exists( $op->{'trans'} )) { $op->{'trans'}=$op->{'op'}; }
}
@{$self->{'opr'}}=map { $_->{'op'} } @{$self->{'ops'}};
@{$self->{'tokens'}}=(@{$self->{'opr'}},@{$self->{'func'}},@{$self->{'vars'}},@{$self->{'grouping'}});
$self->{'varre'}=join('|',map { quotemeta($_) } @{$self->{'vars'}});
$self->{'funcre'}=join('|',map { quotemeta($_) } @{$self->{'func'}});
$self->{'numre'}='[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?';
$self->{'re'}=join('|',(map { quotemeta($_).'(?!'.quotemeta($_).')' } @{$self->{'tokens'}}),$self->{'numre'});
$self->{'ree'}=$self->{'re'}.'|.+?';
$self->{ERRSTR}='';
bless $self,$class;
return $self;
}
sub tokenize {
my $self=shift;
my $str=shift;
my $ree=$self->{'ree'};
Infix2Postfix.pm view on Meta::CPAN
my (@poss,$i,$cop); # possible breaks
my $b=0;
my $numre=$self->{'numre'};
my $varre=$self->{'varre'};
my (%func,@func,@ops,$un,$fn,$as,$rop,$op,$bi,$bd,$las,@trlist);
@func=@{$self->{'func'}};
@func{@func}=1..@func;
@ops=@{$self->{'ops'}};
# print Dumper(\%func);
# print "elist: ",join(" ",map { "$_" } @_ ),"\n";
# the only single elements should be numbers or vars
if ($#_ == 0) {
if ( $_[0] =~ m/^($numre|$varre)$/ ) {
return $_[0];
} else {
die "Single element '$_[0]' wrong\n";
}
}
( run in 0.725 second using v1.01-cache-2.11-cpan-3b35f9de6a3 )