Changeset 14980
- Timestamp:
- 01/02/07 14:04:48 (23 months ago)
- Location:
- v6/v6-MiniPerl6-MO
- Files:
-
- 1 removed
- 3 modified
-
lib/MiniPerl6/Perl5/Emitter.pm (modified) (6 diffs)
-
lib/MiniPerl6/Perl5MO/Emitter.pm (deleted)
-
lib5/MiniPerl6/Perl5/Emitter.pm (modified) (3 diffs)
-
mp6-perl5-mo.pl (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
v6/v6-MiniPerl6-MO/lib/MiniPerl6/Perl5/Emitter.pm
r14978 r14980 1 1 use v6-alpha; 2 2 3 class CompUnit { 3 # Perl5MO emitter 4 5 class Module { 4 6 has $.name; 5 has %.attributes;6 has %.methods;7 7 has @.body; 8 8 method emit { 9 'package ' ~ $.name ~ "; " ~ 10 'sub new { shift; bless { @_ }, "' ~ $.name ~ '" }' ~ " " ~ 11 (@.body.>>emit).join( "; " ) 9 my $a := @.body; 10 my $item; 11 my $s; 12 $s := $s 13 ~ 'package ' ~ $.name ~ ';' ~ Main::newline(); 14 for @$a -> $item { 15 $s := $s ~ $item.emit ~ ';' ~ Main::newline(); 16 }; 17 return $s; 12 18 } 13 19 } … … 259 265 }; 260 266 261 my $call := '->' ~ $meth ~ '(' ~ (@.arguments.>>emit).join(', ') ~ ')';262 267 if ($.hyper) { 263 '[ map { $_' ~ $call ~ ' } @{ ' ~ $invocant ~ ' } ]'; 268 '[ map { ' 269 ~ 'MO::Run::Aux::method_call( ' 270 ~ '$_' 271 ~ ', q(' ~ $meth ~ '), ' 272 ~ (@.arguments.>>emit).join(', ') 273 ~ ')' 274 ~ ' } @{ ' ~ $invocant ~ ' } ]'; 264 275 } 265 276 else { 266 $invocant ~ $call; 277 'MO::Run::Aux::method_call( ' 278 ~ $invocant 279 ~ ', q(' ~ $meth ~ '), ' 280 ~ (@.arguments.>>emit).join(', ') 281 ~ ')'; 267 282 }; 268 283 … … 316 331 has $.result; 317 332 method emit { 318 return319 #'do { print Main::perl(caller(),' ~ $.result.emit ~ '); return(' ~ $.result.emit ~ ') }';320 333 'return(' ~ $.result.emit ~ ')'; 321 334 } … … 390 403 391 404 my $pos := $sig.positional; 392 my $str := 'my $List__ = \@_; '; # no strict "vars"; '; 393 394 # TODO - follow recursively 395 my $pos := $sig.positional; 396 for @$pos -> $field { 397 $str := $str ~ 'my ' ~ $field.emit ~ '; '; 398 }; 399 405 my $str := 'my $List__ = \@_; no strict "vars"; '; 400 406 my $bind := ::Bind( 401 407 'parameters' => ::Lit::Array( array => $sig.positional ), … … 412 418 # }; 413 419 414 'sub ' ~ $.name ~ '{ ' ~420 'sub { ' ~ 415 421 'my ' ~ $invocant.emit ~ ' = shift; ' ~ 416 422 $str ~ … … 431 437 # say $invocant.emit; 432 438 my $pos := $sig.positional; 433 my $str := 'my $List__ = \@_; '; # no strict "vars"; '; 434 435 # TODO - follow recursively 436 my $pos := $sig.positional; 437 for @$pos -> $field { 438 $str := $str ~ 'my ' ~ $field.emit ~ '; '; 439 }; 439 my $str := 'my $List__ = \@_; no strict "vars"; '; 440 440 441 441 my $bind := ::Bind( -
v6/v6-MiniPerl6-MO/lib5/MiniPerl6/Perl5/Emitter.pm
r14978 r14980 4 4 use MiniPerl6::Perl5::Runtime; 5 5 use MiniPerl6::Perl5::Match; 6 package CompUnit; sub new { shift; bless { @_ }, "CompUnit" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub attributes { @_ == 1 ? ( $_[0]->{attributes} ) : ( $_[0]->{attributes} = $_[1] ) }; sub methods { @_ == 1 ? ( $_[0]->{methods} ) : ( $_[0]->{methods} = $_[1] ) }; sub body { @_ == 1 ? ( $_[0]->{body} ) : ( $_[0]->{body} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ('package ' . ($self->{name} . ('; ' . ('sub new { shift; bless { @_ }, "' . ($self->{name} . ('" }' . (' ' . Main::join([ map { $_->emit() } @{ $self->{body} } ], '; ')))))))) }6 package Module; sub new { shift; bless { @_ }, "Module" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub body { @_ == 1 ? ( $_[0]->{body} ) : ( $_[0]->{body} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my $a = $self->{body}; my $item; my $s; $s = ($s . ('package ' . ($self->{name} . (';' . Main::newline())))); do { for my $item ( @{$a} ) { $s = ($s . ($item->emit() . (';' . Main::newline()))) } }; return($s) } 7 7 ; 8 8 package Val::Int; sub new { shift; bless { @_ }, "Val::Int" } sub int { @_ == 1 ? ( $_[0]->{int} ) : ( $_[0]->{int} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; $self->{int} } … … 38 38 package Proto; sub new { shift; bless { @_ }, "Proto" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ("" . $self->{name}) } 39 39 ; 40 package Call; sub new { shift; bless { @_ }, "Call" } sub invocant { @_ == 1 ? ( $_[0]->{invocant} ) : ( $_[0]->{invocant} = $_[1] ) }; sub hyper { @_ == 1 ? ( $_[0]->{hyper} ) : ( $_[0]->{hyper} = $_[1] ) }; sub method { @_ == 1 ? ( $_[0]->{method} ) : ( $_[0]->{method} = $_[1] ) }; sub arguments { @_ == 1 ? ( $_[0]->{arguments} ) : ( $_[0]->{arguments} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my $invocant = $self->{invocant}->emit(); do { if (($invocant eq 'self')) { $invocant = '$self' } else { } }; do { if ((($self->{method} eq 'perl') || (($self->{method} eq 'yaml') || (($self->{method} eq 'say') || (($self->{method} eq 'join') || (($self->{method} eq 'chars') || ($self->{method} eq 'isa'))))))) { do { if ($self->{hyper}) { return(('[ map { Main::' . ($self->{method} . ('( $_, ' . (', ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . (')' . (' } @{ ' . ($invocant . ' } ]'))))))))) } else { return(('Main::' . ($self->{method} . ('(' . ($invocant . (', ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))))))) } } } else { } }; my $meth = $self->{method}; do { if (($meth eq 'postcircumfix:<( )>')) { $meth = '' } else { } }; my $call = ('->' . ($meth . ('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')')))); do { if ($self->{hyper}) { ('[ map { $_' . ($call . (' } @{ ' . ($invocant . ' } ]')))) } else { ($invocant . $call) } } }40 package Call; sub new { shift; bless { @_ }, "Call" } sub invocant { @_ == 1 ? ( $_[0]->{invocant} ) : ( $_[0]->{invocant} = $_[1] ) }; sub hyper { @_ == 1 ? ( $_[0]->{hyper} ) : ( $_[0]->{hyper} = $_[1] ) }; sub method { @_ == 1 ? ( $_[0]->{method} ) : ( $_[0]->{method} = $_[1] ) }; sub arguments { @_ == 1 ? ( $_[0]->{arguments} ) : ( $_[0]->{arguments} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my $invocant = $self->{invocant}->emit(); do { if (($invocant eq 'self')) { $invocant = '$self' } else { } }; do { if ((($self->{method} eq 'perl') || (($self->{method} eq 'yaml') || (($self->{method} eq 'say') || (($self->{method} eq 'join') || (($self->{method} eq 'chars') || ($self->{method} eq 'isa'))))))) { do { if ($self->{hyper}) { return(('[ map { Main::' . ($self->{method} . ('( $_, ' . (', ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . (')' . (' } @{ ' . ($invocant . ' } ]'))))))))) } else { return(('Main::' . ($self->{method} . ('(' . ($invocant . (', ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))))))) } } } else { } }; my $meth = $self->{method}; do { if (($meth eq 'postcircumfix:<( )>')) { $meth = '' } else { } }; do { if ($self->{hyper}) { ('[ map { ' . ('MO::Run::Aux::method_call( ' . ('$_' . (', q(' . ($meth . ('), ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . (')' . (' } @{ ' . ($invocant . ' } ]')))))))))) } else { ('MO::Run::Aux::method_call( ' . ($invocant . (', q(' . ($meth . ('), ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')')))))) } } } 41 41 ; 42 42 package Apply; sub new { shift; bless { @_ }, "Apply" } sub code { @_ == 1 ? ( $_[0]->{code} ) : ( $_[0]->{code} = $_[1] ) }; sub arguments { @_ == 1 ? ( $_[0]->{arguments} ) : ( $_[0]->{arguments} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my $code = $self->{code}; do { if (($code eq 'say')) { return(('Main::say(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))) } else { } }; do { if (($code eq 'print')) { return(('Main::print(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))) } else { } }; do { if (($code eq 'array')) { return(('@{' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . '}'))) } else { } }; do { if (($code eq 'prefix:<~>')) { return(('("" . ' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . ')'))) } else { } }; do { if (($code eq 'prefix:<!>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . ' ? 0 : 1)'))) } else { } }; do { if (($code eq 'prefix:<?>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . ' ? 1 : 0)'))) } else { } }; do { if (($code eq 'prefix:<$>')) { return(('${' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . '}'))) } else { } }; do { if (($code eq 'prefix:<@>')) { return(('@{' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . '}'))) } else { } }; do { if (($code eq 'prefix:<%>')) { return(('%{' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ') . '}'))) } else { } }; do { if (($code eq 'infix:<~>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' . ') . ')'))) } else { } }; do { if (($code eq 'infix:<+>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' + ') . ')'))) } else { } }; do { if (($code eq 'infix:<->')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' - ') . ')'))) } else { } }; do { if (($code eq 'infix:<&&>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' && ') . ')'))) } else { } }; do { if (($code eq 'infix:<||>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' || ') . ')'))) } else { } }; do { if (($code eq 'infix:<eq>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' eq ') . ')'))) } else { } }; do { if (($code eq 'infix:<ne>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' ne ') . ')'))) } else { } }; do { if (($code eq 'infix:<==>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' == ') . ')'))) } else { } }; do { if (($code eq 'infix:<!=>')) { return(('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ' != ') . ')'))) } else { } }; do { if (($code eq 'ternary:<?? !!>')) { return(('(' . ($self->{arguments}->[0]->emit() . (' ? ' . ($self->{arguments}->[1]->emit() . (' : ' . ($self->{arguments}->[2]->emit() . ')'))))))) } else { } }; ($self->{code} . ('(' . (Main::join([ map { $_->emit() } @{ $self->{arguments} } ], ', ') . ')'))) } 43 43 ; 44 package Return; sub new { shift; bless { @_ }, "Return" } sub result { @_ == 1 ? ( $_[0]->{result} ) : ( $_[0]->{result} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; return(('return(' . ($self->{result}->emit() . ')'))) }44 package Return; sub new { shift; bless { @_ }, "Return" } sub result { @_ == 1 ? ( $_[0]->{result} ) : ( $_[0]->{result} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ('return(' . ($self->{result}->emit() . ')')) } 45 45 ; 46 46 package If; sub new { shift; bless { @_ }, "If" } sub cond { @_ == 1 ? ( $_[0]->{cond} ) : ( $_[0]->{cond} = $_[1] ) }; sub body { @_ == 1 ? ( $_[0]->{body} ) : ( $_[0]->{body} = $_[1] ) }; sub otherwise { @_ == 1 ? ( $_[0]->{otherwise} ) : ( $_[0]->{otherwise} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ('do { if (' . ($self->{cond}->emit() . (') { ' . (Main::join([ map { $_->emit() } @{ $self->{body} } ], ';') . (' } else { ' . (Main::join([ map { $_->emit() } @{ $self->{otherwise} } ], ';') . ' } }')))))) } … … 52 52 package Sig; sub new { shift; bless { @_ }, "Sig" } sub invocant { @_ == 1 ? ( $_[0]->{invocant} ) : ( $_[0]->{invocant} = $_[1] ) }; sub positional { @_ == 1 ? ( $_[0]->{positional} ) : ( $_[0]->{positional} = $_[1] ) }; sub named { @_ == 1 ? ( $_[0]->{named} ) : ( $_[0]->{named} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ' print \'Signature - TODO\'; die \'Signature - TODO\'; ' }; sub invocant { my $self = shift; my $List__ = \@_; do { [] }; $self->{invocant} }; sub positional { my $self = shift; my $List__ = \@_; do { [] }; $self->{positional} } 53 53 ; 54 package Method; sub new { shift; bless { @_ }, "Method" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub sig { @_ == 1 ? ( $_[0]->{sig} ) : ( $_[0]->{sig} = $_[1] ) }; sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my $sig = $self->{sig}; my $invocant = $sig->invocant(); my $pos = $sig->positional(); my $str = 'my $List__ = \@_; '; my $pos = $sig->positional(); do { for my $field ( @{$pos} ) { $str = ($str . ('my ' . ($field->emit() . '; '))) } }; my $bind = Bind->new( 'parameters' => Lit::Array->new( 'array' => $sig->positional(), ),'arguments' => Var->new( 'sigil' => '@','twigil' => '','name' => '_', ), ); $str = ($str . ($bind->emit() . '; ')); ('sub ' . ($self->{name} . (' { ' . ('my ' . ($invocant->emit() . (' = shift; ' . ($str . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }')))))))) }54 package Method; sub new { shift; bless { @_ }, "Method" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub sig { @_ == 1 ? ( $_[0]->{sig} ) : ( $_[0]->{sig} = $_[1] ) }; sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my $sig = $self->{sig}; my $invocant = $sig->invocant(); my $pos = $sig->positional(); my $str = 'my $List__ = \@_; no strict "vars"; '; my $bind = Bind->new( 'parameters' => Lit::Array->new( 'array' => $sig->positional(), ),'arguments' => Var->new( 'sigil' => '@','twigil' => '','name' => '_', ), ); $str = ($str . ($bind->emit() . '; ')); ('sub { ' . ('my ' . ($invocant->emit() . (' = shift; ' . ($str . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }')))))) } 55 55 ; 56 package Sub; sub new { shift; bless { @_ }, "Sub" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub sig { @_ == 1 ? ( $_[0]->{sig} ) : ( $_[0]->{sig} = $_[1] ) }; sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my $sig = $self->{sig}; my $pos = $sig->positional(); my $str = 'my $List__ = \@_; '; my $pos = $sig->positional(); do { for my $field ( @{$pos} ) { $str = ($str . ('my ' . ($field->emit() . '; '))) } }; my $bind = Bind->new( 'parameters' => Lit::Array->new( 'array' => $sig->positional(), ),'arguments' => Var->new( 'sigil' => '@','twigil' => '','name' => '_', ), ); $str = ($str . ($bind->emit() . '; ')); ('sub ' . ($self->{name} . (' { ' . ($str . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }'))))) }56 package Sub; sub new { shift; bless { @_ }, "Sub" } sub name { @_ == 1 ? ( $_[0]->{name} ) : ( $_[0]->{name} = $_[1] ) }; sub sig { @_ == 1 ? ( $_[0]->{sig} ) : ( $_[0]->{sig} = $_[1] ) }; sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; my $sig = $self->{sig}; my $pos = $sig->positional(); my $str = 'my $List__ = \@_; no strict "vars"; '; my $bind = Bind->new( 'parameters' => Lit::Array->new( 'array' => $sig->positional(), ),'arguments' => Var->new( 'sigil' => '@','twigil' => '','name' => '_', ), ); $str = ($str . ($bind->emit() . '; ')); ('sub ' . ($self->{name} . (' { ' . ($str . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }'))))) } 57 57 ; 58 58 package Do; sub new { shift; bless { @_ }, "Do" } sub block { @_ == 1 ? ( $_[0]->{block} ) : ( $_[0]->{block} = $_[1] ) }; sub emit { my $self = shift; my $List__ = \@_; do { [] }; ('do { ' . (Main::join([ map { $_->emit() } @{ $self->{block} } ], '; ') . ' }')) } -
v6/v6-MiniPerl6-MO/mp6-perl5-mo.pl
r14978 r14980 14 14 package Main; 15 15 use MiniPerl6::Grammar; 16 use MiniPerl6::Perl5 MO::Emitter;16 use MiniPerl6::Perl5::Emitter; 17 17 use MiniPerl6::Grammar::Regex; 18 18 use MiniPerl6::Emitter::Token; … … 27 27 say( "use MiniPerl6::Perl5::Match;" ); 28 28 29 #say( "use MO::Run::Aux;" ); 30 #say( "BEGIN { $MO::Run::Aux::MO_NATIVE_RUNTIME = 1 }"); 31 29 32 while ( $pos < length( $source ) ) { 30 33 #say( "Source code:", $source );
