Rc
view release on metacpan or search on metacpan
lib/Rc/Deparse.pm view on Meta::CPAN
use strict;
package Rc::Deparse;
use Rc qw($OutputFH);
use vars qw($level);
$level = 0;
# This is a perl implementation of footobar.c!
sub indent(&) { local $level = $level + 1; shift->() }
sub nl() { "\n" . ' 'x($level*4) }
sub Rc::Node::deparse {
print $OutputFH shift->dp()."\n";
}
sub Rc::Undef::dp { '()' }
sub Rc::Word::dp { shift->string }
sub Rc::Qword::dp {
my $s = shift->string;
$s =~ s/\'/\'\'/g;
"'$s'"
}
sub Rc::Bang::dp { '!' . shift->kid(0)->dp() }
sub Rc::Case::dp { 'case '. shift->kid(0)->dp() }
sub Rc::Nowait::dp { shift->kid(0)->dp() . '&' }
sub Rc::Rmfn::dp { 'fn '.shift->kid(0)->dp() }
sub Rc::Subshell::dp { ' @'.shift->kid(0)->dp() }
sub Rc::Andalso::dp {
my $n = shift;
join(' && ', map { $_->dp } $n->kids);
}
sub Rc::Assign::dp {
my $n = shift;
join('=', map { $_->dp } $n->kids);
}
sub Rc::Concat::dp {
my $n = shift;
join('^', map { $_->dp } $n->kids);
}
sub Rc::Else::dp {
my $n = shift;
'{'.indent { nl.$n->kid(0)->dp }.nl.'} else '.$n->kid(1)->dp
}
sub Rc::Newfn::dp {
my $n = shift;
'fn '.$n->kid(0)->dp.' {'.indent { nl.$n->kid(1)->dp }.nl.'}'
}
sub Rc::If::dp {
my $n=shift;
my $k = $n->kid(1);
'if ('.$n->kid(0)->dp.')'.
($k->isa('Rc::Else')? ' '.$k->dp : indent { nl.$k->dp });
}
sub Rc::Orelse::dp {
my $n=shift;
join(' || ', map { $_->dp } $n->kids);
( run in 3.335 seconds using v1.01-cache-2.11-cpan-364913b4093 )