You seem to also want indentation with "\t", which means you need to keep count of the loop levels.
Here a much easier to maintain code, looping over a split and keeping track of indentation.
And you can easily adapt this code to emit other languages - like Perl° - too, without worrying about polluted input.
use strict;
use warnings;
#use Data::Dump qw/pp dd/;
#use feature qw/say/;
my @table = split /\n/, <<'__TABLE__';
> ++k;
< --k;
+ ++*k;
- --*k;
. putchar(*k);
, *k = getchar();
[ while (*k) {
] }
__TABLE__
my %trans = map { split/\s+/, $_, 2 } @table;
#pp \%trans;
my $bfs = '+[--[--]->+++<]>+.---';
my $level = 0;
for my $atom ( split //, $bfs ) {
$level-- if $atom eq "]";
print "\t" x $level;
$level++ if $atom eq "[";
print $trans{$atom};
#print "\t\t\t// was '$atom'"; # debug
print "\n";
}
++*k;
while (*k) {
--*k;
--*k;
while (*k) {
--*k;
--*k;
}
--*k;
++k;
++*k;
++*k;
++*k;
--k;
}
++k;
++*k;
putchar(*k);
--*k;
--*k;
--*k;
update
°) which would allow you to use the perldebugger to step thru BF code.
update
changed code to improve readability |