Acme-URM
view release on metacpan or search on metacpan
Any extra modules required for use:
Data::Dumper - output in debug mode
The minimum version of Perl required:
?
If only works on certain operating systems:
Tested undef Linux but must work on any platform.
Installation:
$ perl Makefile.PL
$ make
lib/Acme/URM.pm view on Meta::CPAN
our $VERSION = '0.02';
use constant LAST => -1;
use constant THIS => -2;
use constant MAX_STEPS => -3;
my $DEBUG = 0;
sub import {
foreach (@_) {
if(/^debug$/) {
$DEBUG = 1;
}
}
}
sub new {
my $class = shift;
my $self = {@_};
$self = bless $self, $class;
$self->_init();
lib/Acme/URM.pm view on Meta::CPAN
sub run {
my $self = shift;
$self->{instr_num} = 0;
$self->{steps_num} = 0;
my $run = 1;
do {
my $step = $self->_step();
return $step if MAX_STEPS == $step;
$run = (scalar(@{$self->{program}}) > $step) ? 1 : 0;
} while( $run );
_debug( "program executed",
"registers: " . Dumper([$self->{registers}]),
"",
);
$self->register(0)
}
sub _check_nreg {
my $self = shift;
my $nreg = shift;
die "invalid register index: '$nreg'\n" if $nreg !~ /^\s*\d+\s*$/ || $nreg < 0;
}
sub _step {
my $self = shift;
my $cmd = $self->{program}[ $self->{instr_num} ];
_debug( "running instruction $self->{instr_num}: $cmd",
"registers: " . Dumper($self->{registers}),
"",
);
my $instr_num_save = $self->{instr_num};
if( $cmd =~ /^\s*Z\s*\((.*)\)$/i ) {
my $nreg = $1;
$self->_check_nreg( $nreg );
$self->register( $nreg, 0 );
$self->{instr_num}++;
} elsif( $cmd =~ /^\s*S\s*\((.*)\)$/i ) {
lib/Acme/URM.pm view on Meta::CPAN
} else {
$self->{instr_num}++;
}
} else {
die "invalid instruction: '$cmd'\n";
}
$self->{steps_num}++;
if( 0 < $self->{max_steps} && $self->{max_steps} < $self->{steps_num} ) {
return MAX_STEPS;
}
_debug( "after running instruction $instr_num_save: $cmd",
"registers: " . Dumper($self->{registers}),
"",
);
$self->{instr_num}
}
sub max_steps {
my $self = shift;
my $val = shift;
$self->{max_steps} = $val if defined $val;
$self->{max_steps}
}
sub _debug {
print join("\n",@_),"\n" if $DEBUG;
}
1;
__END__
=head1 NAME
Acme::URM - URM (unlimited register machine) emulation
lib/Acme/URM.pm view on Meta::CPAN
'S(3)',
'J(0,0,7)',
'T(1,0)',
);
$urm->register( 0, 2, 3 );
$urm->run() == 3;
=head1 DEBUG MODE
You can use this module in debug mode, like this:
use Acme::URM qw/debug/;
Which will produce some output while running the program.
=head1 USEFULNESS
I coded this module while checking out TA (theory of algorithms) materials.
=head1 REFERENCES
Russian wiki link:
( run in 0.622 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )