Changeset 22573
Legend:
- Unmodified
- Added
- Removed
-
src/perl6/STD.pm
r22572 r22573 638 638 | $ 639 639 | <?before <[\)\]\}]> > 640 | [<statement>< .eat_terminator> ]*640 | [<statement><eat_terminator> ]* 641 641 ] 642 642 } … … 647 647 [ 648 648 | <?before <[\)\]\}]> > 649 | [<statement>< .eat_terminator> ]*649 | [<statement><eat_terminator> ]* 650 650 ] 651 651 } … … 3410 3410 self.deb("reducing list") if $*DEBUG +& DEBUG::EXPR; 3411 3411 my @list; 3412 my @delims = $op; 3412 3413 push @list, pop(@termstack); 3413 3414 my $s = $op<sym>; … … 3421 3422 self.worry("Missing term in " ~ $s ~ " list"); 3422 3423 } 3423 p op(@opstack);3424 push @delims, pop(@opstack); 3424 3425 } 3425 3426 if @termstack and defined @termstack[0] { … … 3430 3431 } 3431 3432 @list = reverse @list if @list > 1; 3432 $op<list> = [@list]; 3433 $op<_arity> = 'LIST'; 3434 push @termstack, $op._REDUCE('EXPR'); 3433 @delims = reverse @delims if @delims > 1; 3434 my $nop = $op.cursor_fresh(); 3435 $nop<O> = $op<O>; 3436 $nop<list> = [@list]; 3437 $nop<delims> = [@delims]; 3438 $nop<_arity> = 'LIST'; 3439 push @termstack, $nop._REDUCE('EXPR'); 3435 3440 } 3436 3441 when 'unary' { -
src/perl6/viv
r22569 r22573 14 14 my $OPT_pos = 0; 15 15 my $OPT_match = 0; 16 our $ORIG; 17 our $POS; 18 my %did_ws; 19 16 20 17 21 sub MAIN { … … 28 32 elsif ($switch eq '--p6') { 29 33 $output = 'p6'; 34 $OPT_pos = 1; 30 35 } 31 36 elsif ($switch eq '--pos') { … … 63 68 my $self = shift; 64 69 my $match = shift; 70 $ORIG ||= ${$match->{_orig}}; 71 $POS ||= $match->{'_'}; 65 72 my $r = hoist($match); 66 73 (my $class = $AUTOLOAD) =~ s/^Actions/VAST/; … … 93 100 elsif ($k eq '_from') { 94 101 $r{POS} = $v if $OPT_pos; 95 if (exists $ node->{'_'}[$v]{'ws'}) {96 my $wsstart = $ node->{'_'}[$v]{'ws'};102 if (exists $$POS[$v]{'ws'}) { 103 my $wsstart = $$POS[$v]{'ws'}; 97 104 $r{WS} = $v - $wsstart if defined $wsstart and $wsstart < $v 98 105 } … … 133 140 else { 134 141 $r{$k} = $v; 135 $r{TEXT} = $text; 136 } 137 } 138 } 139 $r{TEXT} = $text unless keys %r; 142 } 143 } 144 } 145 $r{TEXT} = $text unless exists $r{zygs}; 140 146 \%r; 141 147 } … … 145 151 my $match = shift; 146 152 my $r = hoist($match); 147 (my $class = $r->{kind} // "STD::TERM") =~ s/^STD/VAST/;153 (my $class = $r->{kind} // ref $r) =~ s/^STD/VAST/; 148 154 gen_class($class); 149 155 $match->{''} = bless $r, $class; … … 165 171 166 172 sub emit_p6 { my $self = shift; 167 my $text ;173 my $text = $self->get_ws; 168 174 my @sym; 169 175 if (exists $self->{sym}) { … … 177 183 } 178 184 if ($self->{zygs}) { 179 my @zyg = $self-> visit_zygs;180 my $arity = $self->{ arity} // '';185 my @zyg = $self->get_zygs; 186 my $arity = $self->{ARITY} // ''; 181 187 if ($arity eq 'BINARY') { 182 $text .= shift @zyg; 183 $text .= shift @sym; 184 $text .= shift @zyg; 188 $text .= $zyg[0] . $zyg[2] . $zyg[1]; 185 189 } 186 190 elsif ($arity eq 'UNARY') { 187 191 if ($self->{post}) { 188 $text .= shift @zyg; 189 $text .= shift @sym; 192 $text .= $zyg[0] . $zyg[1]; 190 193 } 191 194 else { 192 $text .= shift @sym; 193 $text .= shift @zyg; 195 $text .= $zyg[1] . $zyg[0]; 194 196 } 195 197 } 196 198 else { 197 $text .= join('', @zyg);199 $text .= join('', reverse @zyg); 198 200 } 199 201 } 200 202 elsif (exists $self->{TEXT}) { 201 $text = $self->{TEXT};203 $text .= $self->{TEXT}; 202 204 } 203 205 elsif (@sym) { 204 206 $text .= join('', @sym); 205 207 } 206 $text; 207 } 208 209 sub visit_zygs { my $self = shift; 208 $self->ret($text); 209 } 210 211 sub ret { my $self = shift; 212 warn ref $self, " returns ", $_[0], "\n"; 213 $_[0]; 214 } 215 216 sub get_zygs { my $self = shift; 210 217 my @zygs; 211 218 if ($self->{zygs}) { 212 219 my $zygs = $self->{zygs}; 213 220 for my $key (sort {$zygs->{$a} <=> $zygs->{$b}} keys %$zygs) { 214 my $part = $self->{$key}; 215 if (ref $part eq 'ARRAY') { 216 my @kids = @$part; 217 for my $kid (@kids) { 218 push @zygs, $kid->emit_p6 // ''; 219 } 220 } 221 elsif (ref $part) { 222 push @zygs, $part->emit_p6 // ''; 221 push @zygs, $self->get_zyg($key); 222 } 223 } 224 @zygs; 225 } 226 227 sub get_zyg { my $self = shift; 228 my $key = shift; 229 my $part = $self->{$key}; 230 my @zygs; 231 if (ref $part eq 'ARRAY') { 232 my @kids = @$part; 233 for my $kid (@kids) { 234 if (ref $kid) { 235 push @zygs, $kid->emit_p6 // ''; 223 236 } 224 237 else { 225 push @zygs, $key . '=' . $part; 226 } 227 } 238 push @zygs, $kid; 239 } 240 } 241 } 242 elsif (ref $part) { 243 push @zygs, $part->emit_p6 // ''; 244 } 245 else { 246 push @zygs, $key . '=' . $part; 228 247 } 229 248 @zygs; 230 249 } 231 } 232 250 251 sub get_ws { my $self = shift; 252 my $ws = $self->{WS} // 0; 253 my $pos = $self->{POS}; 254 if ($ws and not $did_ws{$pos}++) { 255 substr($ORIG, $pos - $ws, $ws) 256 } 257 else { 258 ''; 259 } 260 } 261 262 } 263 264 { package VAST::sample; our @ISA = 'VAST::Base'; 265 sub emit_p6 { my $self = shift; 266 } 267 } 268 269 { package VAST::AddSym; our @ISA = 'VAST::Base'; 270 sub emit_p6 { my $self = shift; 271 my $text = $self->get_ws; 272 $text .= $self->{sym}; 273 $text .= $self->SUPER::emit_p6(@_); 274 $text; 275 } 276 } 277 278 { package VAST::comp_unit; our @ISA = 'VAST::Base'; 279 sub emit_p6 { my $self = shift; 280 my $text = $self->SUPER::emit_p6(@_); 281 my $finalws = $$POS[-1]{ws}; 282 $text .= substr($ORIG, $finalws, -1) if $finalws; 283 $self->ret($text); 284 } 285 } 286 287 { package VAST::Comma; our @ISA = 'VAST::Base'; 288 sub emit_p6 { my $self = shift; 289 my $text = $self->get_ws; 290 291 my @list = $self->get_zyg('list'); 292 my @delims = $self->get_zyg('delims'); 293 while (@list) { 294 $text .= shift(@list) . (shift(@delims)//''); 295 } 296 $self->ret($text); 297 } 298 } 299 300 { package VAST::statementlist; our @ISA = 'VAST::Base'; 301 sub emit_p6 { my $self = shift; 302 my $text = $self->get_ws; 303 304 my @statement = $self->get_zyg('statement'); 305 my @terminator = $self->get_zyg('eat_terminator'); 306 while (@statement or @terminator) { 307 $text .= shift(@statement) . (shift(@terminator)//''); 308 } 309 $self->ret($text); 310 } 311 } 312 313 { package VAST::nibbler; our @ISA = 'VAST::Base'; 314 sub emit_p6 { my $self = shift; 315 my $text = ''; 316 my @nibbles = $self->get_zyg('nibbles'); 317 for my $nibble (@nibbles) { 318 if (ref $nibble) { 319 $text .= $nibble->emit_p6; 320 } 321 else { 322 $text .= $nibble; 323 } 324 } 325 $self->ret($text); 326 } 327 } 328 329 { package VAST::quibble; our @ISA = 'VAST::Base'; 330 sub emit_p6 { my $self = shift; 331 my $text = $self->get_ws; 332 333 my @babble = @{$self->{babble}{B}}; 334 my @nibble = $self->get_zyg('nibble'); 335 $text .= $babble[0] . $nibble[0] . $babble[1]; 336 $self->ret($text); 337 } 338 } 339 340 { package VAST::quote; our @ISA = 'VAST::Base'; 341 sub emit_p6 { my $self = shift; 342 my $text = $self->get_ws; 343 344 if ($self->{nibble}) { 345 my @nibble = $self->get_zyg('nibble'); 346 $text .= $self->{sym}[0] . $nibble[0] . $self->{sym}[1]; 347 } 348 else { 349 my @quibble = $self->get_zyg('quibble'); 350 $text .= $self->{sym} . $quibble[0]; 351 } 352 $self->ret($text); 353 } 354 } 355 356 { package VAST::statement_control; our @ISA = 'VAST::AddSym'; } 357 { package VAST::version; our @ISA = 'VAST::AddSym'; } 233 358 234 359 if ($0 eq __FILE__) {
