- Timestamp:
- 11/06/08 04:36:43 (2 months ago)
- Location:
- src/perl6
- Files:
-
- 2 modified
-
Cursor.pmc (modified) (3 diffs)
-
gimme5 (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/perl6/Cursor.pmc
r22890 r22891 577 577 my $tag; 578 578 my $try; 579 my $relex;580 579 581 580 my $lexer = $self->lexers->{$name} // do { … … 600 599 my $ch2 = $1; 601 600 602 $relex =$lexer->{$ch2} //= do {601 return $lexer->{$ch2} //= do { 603 602 my @pats; 604 603 my $file = $lexer->{FILE} . '__' . ::mangle($ch2); … … 831 830 }; 832 831 833 if (my $fate = $relex->($self,$_[0])) {834 $self->deb("FATE OF ${pkg}::$name: $$fate[3]") if $DEBUG & DEBUG::fates;835 ($tag, $try, $fate) = @$fate;836 $self->{_fate} = $fate;837 }838 else {839 $self->deb("NO FATE FOR ${pkg}::$name (will probe)") if $DEBUG & DEBUG::fates;840 $tag = '';841 }842 return $tag, $try, $relex;843 832 } 844 833 -
src/perl6/gimme5
r22890 r22891 331 331 my \@result = eval { 332 332 my \$trystate; 333 my (\$tag, \$try , \$relex);333 my (\$tag, \$try); 334 334 my \@try; 335 my \$relex; 335 336 if (my \$fate = \$C->{_fate}) { 336 337 if (\$fate->[0] eq '$name') { … … 341 342 } 342 343 } 343 else {344 (\$tag, \$try, \$relex) = \$C->cursor_fate('$PKG', '$name:*', \$retree, \$trystate);345 \@try = (\$try,\$relex) if \$tag;346 }347 344 348 345 my \@gather = (); 349 while (\@try) { 350 my \$try = shift(\@try) // next; 346 for (;;) { 347 if (not \@try) { 348 \$relex //= \$C->cursor_fate('$PKG', '$name:*', \$retree); 349 \@try = \$relex->(\$C, \$trystate); 350 } 351 last unless \@try; 352 \$try = shift(\@try) // next; 351 353 352 # if first try failed, interrogate lexer for shorter answers 353 if (ref \$try) { 354 if (ref \$try eq 'ARRAY') { 355 (\$tag, \$try, \$C->{_fate}) = \@\$try; # next candidate fate 356 \$C->deb("Retrying with \$tag \$try") if \$::DEBUG & DEBUG::try_processing; 357 } 358 elsif (ref \$try eq 'CODE') { 359 my \@more = \$relex->(\$C, \$trystate); 360 if (\@more) { 361 unshift \@try, \@more, \$relex; # ask relex for more 362 } 363 next; 364 } 365 } 354 if (ref \$try eq 'ARRAY') { 355 (\$tag, \$try, \$C->{_fate}) = \@\$try; # next candidate fate 356 } 366 357 367 358 \$C->deb("$name trying \$tag \$try") if \$::DEBUG & DEBUG::try_processing; … … 2490 2481 my \@result = eval { 2491 2482 my \$trystate; 2492 my (\$tag, \$try , \$relex);2483 my (\$tag, \$try); 2493 2484 my \@try; 2485 my \$relex; 2486 2494 2487 my \$fate; 2495 2488 if (\$fate = \$C->{_fate} and \$fate->[0] eq '$altname') { … … 2499 2492 \@try = (\$try); 2500 2493 } 2501 else { 2502 (\$tag, \$try, \$relex) = \$C->cursor_fate('${PKG}', '$altname', \$retree, \$trystate); 2503 $policy 2504 } 2505 END 2506 2507 $result .= <<'END'; 2508 my @gather = (); 2509 while (@try) { 2510 my $try = shift(@try) // next; 2511 2512 # if first try failed, interrogate lexer for shorter answers 2513 if (ref $try) { 2514 if (ref $try eq 'ARRAY') { 2515 ($tag, $try, $C->{_fate}) = @$try; # next candidate fate 2516 $C->deb("Retrying with $tag $try") if $::DEBUG & DEBUG::try_processing; 2517 } 2518 elsif (ref $try eq 'CODE') { 2519 my @more = $relex->($C, $trystate); 2520 if (@more) { 2521 unshift @try, @more, $relex; # ask relex for more 2522 } 2523 next; 2524 } 2525 } 2526 2527 END 2528 2529 $result .= <<"END"; 2494 2495 my \@gather = (); 2496 for (;;) { 2497 if (not \@try) { 2498 \$relex //= \$C->cursor_fate('$PKG', '$altname', \$retree); 2499 \@try = \$relex->(\$C, \$trystate); 2500 } 2501 last unless \@try; 2502 \$try = shift(\@try) // next; 2503 2504 if (ref \$try eq 'ARRAY') { 2505 (\$tag, \$try, \$C->{_fate}) = \@\$try; # next candidate fate 2506 } 2507 2530 2508 \$C->deb("$altname trying \$tag \$try") if \$::DEBUG & DEBUG::try_processing; 2531 2509 push \@gather, ((
