Changeset 22891 for src

Show
Ignore:
Timestamp:
11/06/08 04:36:43 (2 months ago)
Author:
lwall
Message:

[gimme5] more lexer call refactoring to avoid duplication

Location:
src/perl6
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/perl6/Cursor.pmc

    r22890 r22891  
    577577    my $tag; 
    578578    my $try; 
    579     my $relex; 
    580579     
    581580    my $lexer = $self->lexers->{$name} // do { 
     
    600599    my $ch2 = $1; 
    601600 
    602     $relex = $lexer->{$ch2} //= do { 
     601    return $lexer->{$ch2} //= do { 
    603602        my @pats; 
    604603        my $file = $lexer->{FILE} . '__' . ::mangle($ch2); 
     
    831830    }; 
    832831 
    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; 
    843832} 
    844833 
  • src/perl6/gimme5

    r22890 r22891  
    331331    my \@result = eval { 
    332332        my \$trystate; 
    333         my (\$tag, \$try, \$relex); 
     333        my (\$tag, \$try); 
    334334        my \@try; 
     335        my \$relex; 
    335336        if (my \$fate = \$C->{_fate}) { 
    336337            if (\$fate->[0] eq '$name') { 
     
    341342            } 
    342343        } 
    343         else { 
    344             (\$tag, \$try, \$relex) = \$C->cursor_fate('$PKG', '$name:*', \$retree, \$trystate); 
    345             \@try = (\$try,\$relex) if \$tag; 
    346         } 
    347344 
    348345        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; 
    351353     
    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            } 
    366357     
    367358            \$C->deb("$name trying \$tag \$try") if \$::DEBUG & DEBUG::try_processing; 
     
    24902481  my \@result = eval { 
    24912482    my \$trystate; 
    2492     my (\$tag, \$try, \$relex); 
     2483    my (\$tag, \$try); 
    24932484    my \@try; 
     2485    my \$relex; 
     2486 
    24942487    my \$fate; 
    24952488    if (\$fate = \$C->{_fate} and \$fate->[0] eq '$altname') { 
     
    24992492        \@try = (\$try); 
    25002493    } 
    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 
    25302508        \$C->deb("$altname trying \$tag \$try") if \$::DEBUG & DEBUG::try_processing; 
    25312509        push \@gather, ((