Changeset 22500
- Timestamp:
- 10/03/08 20:11:15 (7 weeks ago)
- Location:
- v6/mildew
- Files:
-
- 2 modified
-
mildew (modified) (1 diff)
-
src/AST.pm (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
v6/mildew/mildew
r22499 r22500 31 31 } elsif ($m->{value}) { 32 32 value($m->{value}); 33 } elsif ($m->{routine_declarator}) { 34 if ($m->{routine_declarator}{routine_def}) { 35 routine_def($m->{routine_declarator}{routine_def}); 36 } else { 37 XXX; 38 } 39 } else { 40 XXX; 33 41 } 42 } 43 sub routine_def { 44 my $m = shift; 45 AST::Call->new(identifier=>AST::StringConstant->new(value => 'new'), 46 capture => AST::Capture->new( 47 invocant => AST::Reg->new(name=>'Code'), 48 positional => [], 49 named => [ 50 AST::StringConstant->new(value=>'mold') => block($m->{block}), 51 AST::StringConstant->new(value=>'outer') => AST::Reg->new(name=>'$scope') 52 ] 53 ), 54 ); 55 } 56 sub block { 57 my $m = shift; 58 AST::Block->new(regs=>['interpreter','scope'],stmts=>statementlist($m->{in}{statementlist})); 34 59 } 35 60 sub value { -
v6/mildew/src/AST.pm
r22499 r22500 25 25 extends 'AST::Base'; 26 26 has 'stmts' => (is=>'ro'); 27 has 'regs' => (is=>'ro' );27 has 'regs' => (is=>'ro',default=>sub {[]}); 28 28 sub m0ld { 29 29 my ($self,$ret) = @_; 30 use YAML::XS; 30 31 "my $ret = mold {\n" 31 32 . join('',map {'my $'.$_.";\n"} @{$self->regs}) … … 61 62 =cut 62 63 64 package AST::Named; 65 use Moose; 66 extends 'AST::Base'; 67 has 'key' => (is=>'ro'); 68 has 'value' => (is=>'ro'); 69 70 sub emit { 71 my $self = shift; 72 return ":".$self->key->emit."(".$self->value->emit.")"; 73 } 74 sub m0ld { 75 die "method m0ld is not supported on AST::Named\n" 76 } 77 63 78 package AST::Call; 64 79 use Moose; … … 69 84 my ($self,$ret) = @_; 70 85 if ($self->capture->isa("AST::Capture")) { 86 my @args = @{$self->capture->positional}; 87 my @named = @{$self->capture->named}; 88 while (@named) { 89 push (@args,AST::Named->new(key=>shift @named,value=>shift @named)); 90 } 71 91 "my $ret = " 72 92 . $self->capture->invocant->emit 73 93 . "." . $self->identifier->emit 74 . "(" . join('', map {$_->emit} @ {$self->capture->positional}) . ");\n";94 . "(" . join('', map {$_->emit} @args) . ");\n"; 75 95 } else { 76 96 }
