Perlito5

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

- JavaScript:
-- console.log() is the default "print"
-- reverse() bugfix, add tests
- Command line "perlito5"
-- better switch handling: -Cperl5 / -C perl5 / -C'perl5'
-- compile-only switch '-c'
-- multiple '-e' switches
-- '-E' switches
-- show %ENV, @INC in '-V'
-- set $0
-- execute UNITCHECK blocks

9.014 cpan:Perlito5  2015-11-24
- Parser:
-- AUTOLOAD and DESTROY don't need a 'sub' prefix.
-- ${...} and @{...} are "do-block"-ish
-- $x->{s} doesn't try to parse "s///"
-- set ${^GLOBAL_PHASE}
- JavaScript:
-- implement '-p' operator in nodejs
- Command line "perlito5"

lib/Perlito5/Grammar/Block.pm  view on Meta::CPAN


{
    package main;
    package Perlito5::Grammar::Block;
    use Perlito5::Grammar::Expression ;
    use Perlito5::Grammar::Scope ;
    use Perlito5::AST::BeginScratchpad ;
    use Perlito5::AST::Captures ;
    use Perlito5::FoldConstant ;
    use strict ;
    our %Named_block = ("BEGIN", 1, "UNITCHECK", 1, "CHECK", 1, "INIT", 1, "END", 1, "AUTOLOAD", 1, "DESTROY", 1);
    sub Perlito5::Grammar::Block::block {
        my $str = $_[0];
        my $pos = $_[1];
        my $m = Perlito5::Grammar::Space::opt_ws($str, $pos);
        $pos = $m->{"to"};
        if ($str->[$pos] ne "{") {;
            return
        }
        $pos++;
        Perlito5::Grammar::Scope::check_variable_declarations();

lib/Perlito5/Grammar/Block.pm  view on Meta::CPAN

            $m->{"capture"} = Perlito5::Grammar::Block::ast_nop()
        }
        elsif ($block_name eq "END") {
            unshift(@Perlito5::END_BLOCK, Perlito5::Grammar::Block::eval_end_block($block, "END"));
            $m->{"capture"} = Perlito5::Grammar::Block::ast_nop()
        }
        elsif ($block_name eq "CHECK") {
            unshift(@Perlito5::CHECK_BLOCK, Perlito5::Grammar::Block::eval_end_block($block, "CHECK"));
            $m->{"capture"} = Perlito5::Grammar::Block::ast_nop()
        }
        elsif ($block_name eq "UNITCHECK") {
            unshift(@Perlito5::UNITCHECK_BLOCK, Perlito5::Grammar::Block::eval_end_block($block, "UNITCHECK"));
            $m->{"capture"} = Perlito5::Grammar::Block::ast_nop()
        }
        elsif ($block_name eq "BEGIN") {
            local $Perlito5::PHASE = "BEGIN";
            Perlito5::Grammar::Block::eval_begin_block($block);
            $m->{"capture"} = Perlito5::Grammar::Block::ast_nop()
        }
        elsif ($block_name eq "AUTOLOAD" || $block_name eq "DESTROY") {
            my $sub = Perlito5::AST::Sub::->new("attributes", [], "block", $block, "name", $block_name, "namespace", $Perlito5::PKG_NAME, "sig", undef, "pos", Perlito5::Compiler::compiler_pos());
            my $full_name = ($sub->{"namespace"}) . "::" . ($sub->{"name"});

lib/Perlito5/Java/Runtime.pm  view on Meta::CPAN

    my ($source, $namespace, $want, $scope_java) = @_;

    # say "source: [" . $source . "]";

    local $_;
    local ${^GLOBAL_PHASE};
    local @Perlito5::BASE_SCOPE = ($scope_java);  # ->[0];
    local @Perlito5::SCOPE_STMT;
    local $Perlito5::CLOSURE_SCOPE = 0;
    local $Perlito5::PKG_NAME = $namespace;
    local @Perlito5::UNITCHECK_BLOCK;
    local @Perlito5::Java::Java_constants;
    local %Perlito5::Java::Java_constant_seen;

    # warn "in eval enter\n";
    # warn "External scope ", Perlito5::Dumper::Dumper($scope_java);
    # warn "BASE_SCOPE ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);
    # warn "SCOPE_STMT ", Perlito5::Dumper::Dumper(\@Perlito5::SCOPE_STMT);

    my $match = Perlito5::Grammar::exp_stmts( $source, 0 );

lib/Perlito5/Java/Runtime.pm  view on Meta::CPAN

          #   )
          . "public class " . $className . " {\n";
    for my $s ( @Perlito5::Java::Java_constants ) {
        # say "s: [[$s]] ", ref($s), "\n";
        $constants .= "    " . $s . ";\n";
    }
    $constants .= 
            "    public " . $className . "() {\n"
          . "    }\n";

    Perlito5::set_global_phase("UNITCHECK");
    $_->() while $_ = shift @Perlito5::UNITCHECK_BLOCK;

    # warn "in eval BASE_SCOPE exit: ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);

    return ($className, $java_code, $constants);
}

sub eval_ast {
    my ($ast) = @_;
    my $want = 0;

lib/Perlito5/Java/Runtime.pm  view on Meta::CPAN

    }

    # warn "AST:\n" . Perlito5::Dumper::Dumper($ast);

    # use lexicals from BEGIN scratchpad
    $ast = $ast->emit_begin_scratchpad();
    # warn "eval_ast: ", Perlito5::Dumper::Dumper( $ast );

    my $java_code = $ast->emit_java(2, $want);
    # say STDERR "java-source: [" . $java_code . "]";
    Perlito5::set_global_phase("UNITCHECK");
    $_->() while $_ = shift @Perlito5::UNITCHECK_BLOCK;
    # warn "in eval BASE_SCOPE exit: ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);

    my $java_classes = Perlito5::Java::get_java_class_info() // {};
    my $className = "PlEval" . $Perlito5::ID++;
    my $constants = "";
    $constants .= 
            "import org.perlito.Perlito5.*;\n"
          . "import java.util.regex.Pattern;\n"
          # . join("",
          #       # import the Java classes

lib/Perlito5/JavaScript2/Runtime.pm  view on Meta::CPAN

    # say "source: [" . $source . "]";

    local $_;
    local ${^GLOBAL_PHASE};
    local $^H = $scalar_hints;
    local %^H = %$hash_hints;
    local @Perlito5::BASE_SCOPE = ($scope_js->[0]);
    local @Perlito5::SCOPE_STMT;
    local $Perlito5::CLOSURE_SCOPE = 0;
    local $Perlito5::PKG_NAME = $namespace;
    local @Perlito5::UNITCHECK_BLOCK;
    # warn "in eval enter\n";
    # warn "External scope ", Perlito5::Dumper::Dumper($scope_js);
    # warn "BASE_SCOPE ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);
    # warn "SCOPE_STMT ", Perlito5::Dumper::Dumper(\@Perlito5::SCOPE_STMT);

    my $match = Perlito5::Grammar::exp_stmts( $source, 0 );

    if ( !$match || $match->{to} != length($source) ) {
        die "Syntax error in eval near pos ", $match->{to};
    }

lib/Perlito5/JavaScript2/Runtime.pm  view on Meta::CPAN

                            stmts => $match->{capture},
                         ) ],
              );

    # use lexicals from BEGIN scratchpad
    $ast = $ast->emit_begin_scratchpad();

    # say "ast: [" . ast . "]";
    my $js_code = $ast->emit_javascript2(0, $want);

    Perlito5::set_global_phase("UNITCHECK");
    $_->() while $_ = shift @Perlito5::UNITCHECK_BLOCK;

    # warn "in eval BASE_SCOPE exit: ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);
    if ($Perlito5::JavaScript::DEBUG) {
        # "-JS DEBUG" switch in the command line
        print $js_code, "\n\n";
    }
    return $js_code;
}

sub eval_ast {
    my ($ast) = @_;
    my $want = 0;

    # use lexicals from BEGIN scratchpad
    $ast = $ast->emit_begin_scratchpad();

    my $js_code = $ast->emit_javascript2(0, $want);
    # say STDERR "js-source: [" . $js_code . "]";
    Perlito5::set_global_phase("UNITCHECK");
    $_->() while $_ = shift @Perlito5::UNITCHECK_BLOCK;
    # warn "in eval BASE_SCOPE exit: ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);
    if ($Perlito5::JavaScript::DEBUG) {
        # "-JS DEBUG" switch in the command line
        print $js_code, "\n\n";
    }
    $_ = $js_code;
    return JS::inline('eval("(function(){" + p5pkg.main.v__ + "})()")');
}

sub emit_javascript2 {

lib/Perlito5/Perl5/Runtime.pm  view on Meta::CPAN


sub eval_ast {
    my ($ast) = @_;
    my $want = 0;

    my @data = $ast->emit_perl5(0, $want);
    my $out = [];
    Perlito5::Perl5::PrettyPrinter::pretty_print( \@data, 0, $out );
    my $code = "package $Perlito5::PKG_NAME; " . join( '', @$out ) . "\n";
    # say STDERR "source: [" . $code . "]";
    Perlito5::set_global_phase("UNITCHECK");
    $_->() while $_ = shift @Perlito5::UNITCHECK_BLOCK;
    $code = "#line $Perlito5::LINE_NUMBER \"$Perlito5::FILE_NAME\"\n" . $code;
    return eval($code);
}

sub emit_perl5 {
    return <<'EOT';

use v5.10;
use feature 'say';

lib/Perlito5/Runtime.pm  view on Meta::CPAN

our %FORMAT       = ();   # 'format' statements - hash of subs

# information about the current compilation process
our $GLOBAL          = {};
our @BASE_SCOPE      = ( Perlito5::Grammar::Scope->new_base_scope() );
our $CLOSURE_SCOPE   = 0;    # variables that are in scope in the current closure being compiled
our @SCOPE_STMT      = ();
our @END_BLOCK       = ();    # END block LIFO - array of subs
our @INIT_BLOCK      = ();    # INIT block FIFO - array of subs
our @CHECK_BLOCK     = ();    # CHECK block LIFO - array of subs
our @UNITCHECK_BLOCK = ();    # UNITCHECK block LIFO - array of subs
our %BEGIN_SCRATCHPAD = ();   # list of "my" variables captured in BEGIN blocks
our $PROTO           = {};
our %VARS            = ();    # implements "use vars"

# $Perlito5::STRICT_* - See Perlito5X::strict.pm

# the Perl-to-Java compiler uses this syntax for "annotations":
#   package Put { import => 'java.Put' };
# annotations are stored as namespace + AST
our @ANNOTATION;

src/Perlito5/Grammar/Block.pm  view on Meta::CPAN


use Perlito5::Grammar::Expression;
use Perlito5::Grammar::Scope;
use Perlito5::AST::BeginScratchpad;
use Perlito5::AST::Captures;
use Perlito5::FoldConstant;
use strict;

our %Named_block = (
    BEGIN     => 1,
    UNITCHECK => 1,
    CHECK     => 1,
    INIT      => 1,
    END       => 1,
    AUTOLOAD  => 1,
    DESTROY   => 1,
);

sub block {
    my $str = $_[0];
    my $pos = $_[1];

src/Perlito5/Grammar/Block.pm  view on Meta::CPAN

        $m->{capture} = ast_nop();
    }
    elsif ($block_name eq 'END') {
        unshift @Perlito5::END_BLOCK, eval_end_block( $block, 'END' );
        $m->{capture} = ast_nop();
    }
    elsif ($block_name eq 'CHECK') {
        unshift @Perlito5::CHECK_BLOCK, eval_end_block( $block, 'CHECK' );
        $m->{capture} = ast_nop();
    }
    elsif ($block_name eq 'UNITCHECK') {
        unshift @Perlito5::UNITCHECK_BLOCK, eval_end_block( $block, 'UNITCHECK' );
        $m->{capture} = ast_nop();
    }
    elsif ($block_name eq 'BEGIN') {
        # say "BEGIN $block_start ", $m->{to}, "[", substr($str, $block_start, $m->{to} - $block_start), "]";
        # local $Perlito5::PKG_NAME = $Perlito5::PKG_NAME;  # BUG - this doesn't work
        local $Perlito5::PHASE = 'BEGIN';
        eval_begin_block( $block );
        $m->{capture} = ast_nop();
    }
    elsif ($block_name eq 'AUTOLOAD' || $block_name eq 'DESTROY') {



( run in 1.024 second using v1.01-cache-2.11-cpan-748bfb374f4 )