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 )