- Timestamp:
- 11/08/08 12:42:28 (2 months ago)
- Location:
- v6/mildew
- Files:
-
- 2 modified
-
mildew (modified) (11 diffs)
-
src/AST.pm (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
v6/mildew/mildew
r22888 r22929 15 15 use Getopt::Long; 16 16 use Carp 'confess'; 17 use Scalar::Util qw(blessed);18 17 19 18 my ($desugar,$debug,$file,$exec); … … 42 41 } 43 42 44 sub VAST::ws::emit_m0ld { 45 my $m = shift; 46 ( map { 47 warn ' extracting '.$_.' from ws '; 48 $m->{$_}->emit_m0ld 49 } grep { blessed $m->{$_} } keys %{$m} ), 50 ( map { 51 warn ' extracting '.ref($_).' from ws '; 52 $_->emit_m0ld 53 } map { @{$m->{$_}} } grep { ref $m->{$_} eq 'ARRAY' } keys %{$m} ), 54 } 43 sub VAST::ws::emit_m0ld {} 55 44 56 45 sub VAST::longname::canonical { … … 89 78 ), 90 79 ); 91 } else {92 XXX;93 80 } 94 } else {95 XXX;96 81 } 97 82 } else { … … 136 121 if ($name->{morename} and !$name->{identifier}) { 137 122 lookup join '',map {$_->{identifier}[0]{TEXT}} @{$name->{morename}}; 138 } else { 139 XXX; 140 } 141 } else { 142 XXX; 123 124 } 143 125 } 144 126 } … … 223 205 sub VAST::sublongname::canonical { 224 206 my $m = shift; 225 XXX;226 207 } 227 208 sub varname { … … 246 227 sub VAST::Comma::emit_m0ld { 247 228 my $m = shift; 248 AST::List->new( 249 elements => [ map {$_->emit_m0ld} @{$m->{list}} ] 250 ); 229 map {$_->emit_m0ld} @{$m->{list}}; 251 230 } 252 231 sub VAST::nulltermish::emit_m0ld { … … 259 238 if (my $methodop = $m->{dottyop}{methodop}) { 260 239 if ($methodop->{longname}) { 261 my $positional = [ map { map { $_->emit_m0ld } @{$_->{statement}} } @{$methodop->{semilist}} ]; 240 my $positional = $methodop->{semilist}[0]{statement}[0]; 241 my @positional = $positional ? $positional->emit_m0ld : (); 262 242 my $ident = $methodop->{longname}->canonical; 263 243 if ($m->{sym} eq '^!') { … … 266 246 AST::Call->new( 267 247 identifier=>string $ident, 268 capture=>AST::Capture->new(invocant=>FETCH($noun),positional=> $positional),248 capture=>AST::Capture->new(invocant=>FETCH($noun),positional=>[@positional]), 269 249 ); 270 250 } else { … … 273 253 } elsif (my $postop = $m->{dottyop}{postop}) { 274 254 if (my $postcircumfix = $postop->{postcircumfix}) { 275 my $positional = [ map { map { $_->emit_m0ld } @{$_->{statement}} } @{$methodop->{semilist}} ]; 255 my $positional = $methodop->{semilist}[0]{statement}[0]; 256 my @positional = $positional ? $positional->emit_m0ld : (); 276 257 AST::Call->new( 277 258 identifier => string 'postcircumfix:'.$postcircumfix->{FIRST}.' '.$postcircumfix->{LAST}, 278 capture => AST::Capture->new(invocant=>FETCH($noun),positional=> $positional),259 capture => AST::Capture->new(invocant=>FETCH($noun),positional=>[@positional]), 279 260 ); 280 261 } else { … … 313 294 sub VAST::Methodcall::emit_m0ld { 314 295 my $m = shift; 315 $m->{ dotty}->emit_m0ld($m->{arg}{noun}->emit_m0ld);296 $m->{arg}->emit_m0ld; 316 297 } 317 298 sub VAST::List_assignment::emit_m0ld { … … 381 362 print $mold->pretty,"\n" if $desugar; 382 363 exit if $desugar; 383 my $m0ld = <<'BOILERPLATE'.$mold-> m0ld('$main').<<'CALL_MAIN';364 my $m0ld = <<'BOILERPLATE'.$mold->emit_('$main').<<'CALL_MAIN'; 384 365 my $void; 385 366 BOILERPLATE -
v6/mildew/src/AST.pm
r22888 r22929 1 1 { 2 2 package AST; 3 use utf8;4 3 my $id=0; 5 4 sub unique_id { … … 23 22 my $self = shift; 24 23 my $id = AST::unique_id; 25 return $self->m0ld($id); 26 24 $AST::CODE .= do {local $AST::CODE='';$AST::CODE . $self->m0ld($id)}; 25 return $id; 26 27 } 28 sub emit_ { 29 local $AST::CODE = ''; 30 my ($self,$ret) = @_; 31 my $mold = $self->m0ld($ret); 32 $AST::CODE . $mold; 27 33 } 28 34 sub pretty { … … 46 52 my $then = $self->then->m0ld($id_then); 47 53 48 $cond. 54 $cond.$/. 49 55 'my '.$id_cond.'_val = '.$id_cond.'."FETCH"();'.$/. 50 56 'my '.$id_cond.'_bool = '.$id_cond.'_val."bool"();'.$/. … … 64 70 "my $ret = mold {\n" 65 71 . join('',map {'my $'.$_.";\n"} @{$self->regs}) 66 . join("",map { $_-> m0ld('$void') } @{$self->stmts})72 . join("",map { $_->emit_('$void') } @{$self->stmts}) 67 73 . "};\n"; 68 74 } … … 96 102 has 'stmt'; 97 103 98 package AST::List;99 use Moose;100 extends 'AST::Base';101 has 'elements' => (is=>'ro');102 103 sub m0ld {104 my ($self, $ret) = @_;105 my @args;106 my $code;107 for (@{$self->elements}) {108 my $id = AST::unique_id();109 $code .= $_->m0ld($id);110 push @args, $id;111 }112 $code .= 'my '.$ret.' = ?SMOP__S1P__List."new"('.join(',',@args).');'.$/;113 }114 115 104 package AST::Named; 116 105 use Moose; … … 149 138 my ($self,$ret) = @_; 150 139 if ($self->capture->isa("AST::Capture")) { 151 my @args; 152 my $code = ''; 153 for ($self->arguments) { 154 my $id = AST::unique_id(); 155 $code .= $_->m0ld($id); 156 push @args, $id; 157 } 158 my $invocant = AST::unique_id(); 159 $code .= $self->capture->invocant->m0ld($invocant); 160 my $identifier = AST::unique_id(); 161 $code .= $self->identifier->m0ld($identifier); 162 $code .= "my $ret = " 163 . $invocant 164 . "." . $identifier 165 . "(" . join(',', @args) . ")" . ";\n"; 140 "my $ret = " 141 . $self->capture->invocant->emit 142 . "." . $self->identifier->emit 143 . "(" . join(',', map {$_->emit} $self->arguments) . ")" . ";\n"; 166 144 } else { 167 145 die 'unimplemented'; … … 228 206 } 229 207 sub m0ld { 230 my ($self,$ret) = @_; 231 "my $ret = ".$self->name."\n"; 208 die "method m0ld is not supported on AST::Reg, m0ld doesn't support register aliasing\n" 232 209 } 233 210 sub pretty {
