view release on metacpan or search on metacpan
- 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') {