Changeset 22986 for src

Show
Ignore:
Timestamp:
11/12/08 03:17:12 (8 weeks ago)
Author:
lwall
Message:

[Cursor] factor out fate linked list generation from "ch2" code so we can

refer to fates by number later when we are more dfa-ish.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/perl6/Cursor.pmc

    r22985 r22986  
    266266        $self->deb("using cached $dir/$file") if $DEBUG & DEBUG::autolexer; 
    267267 
    268         my @pat = <LEX>; 
    269         chomp(@pat); 
    270         $name = shift @pat; 
     268        chomp($name = <LEX>); 
     269        local $/ = ""; 
     270        my @para = <LEX>; 
    271271        close LEX; 
    272272        my %lexer; 
     
    274274        $lexer{DBA} = $dba; 
    275275        $lexer{FILE} = "$dir/$file"; 
     276        my @pat = split(/\n/, $para[0]); 
    276277        $lexer{PATS} = \@pat; 
     278        my $fates; 
     279        my $i = 0; 
     280        for (@pat) { 
     281            s/\(\?#FATE\d* +(.*?)\)/(?#FATE$i $1)/; 
     282            my $fstr = $1; 
     283            my $fate = $fates->[$i] = [0,0,0,$fstr]; 
     284            while ($fstr =~ s/(\S+)\s+(\S+)\s*//) { 
     285                $fate->[0] = $1; 
     286                $fate->[1] = $2; 
     287                $fate = $fate->[2] = [0,0,0,$fstr] if $fstr ne ''; 
     288            } 
     289            $i++; 
     290        } 
     291        $lexer{FATES} = $fates; 
     292 
     293#       if (@para > 0 and $para[1]) { 
     294#           for (split(/\n/, $para[1])) {} 
     295#       } 
    277296 
    278297        return \%lexer; 
     
    304323                                for my $alt (@alts) { 
    305324                                    $alt .= "\t(?#FATE)" unless $alt =~ /FATE/; 
    306                                     $alt =~ s/\(\?#FATE/(?#FATE $proto ${class}::$method/; 
     325                                    $alt =~ s/\(\?#FATE\d*/(?#FATE $proto ${class}::$method/; 
    307326                                    $altnum++; 
    308327                                } 
     
    321340            s/(\(\?#::\))+/(?#::)/; 
    322341        } 
     342        my $fates; 
     343        my $i = 0; 
     344        for (@pat) { 
     345            my $fstr; 
     346            if ( s/\(\?#FATE\d* +(.*?)\)/(?#FATE$i $1)/) { 
     347                $fstr = $1; 
     348            } 
     349            else { 
     350                $_ .= "\t(?#FATE$i )"; 
     351                $fstr = ""; 
     352            } 
     353            my $fate = $fates->[$i] = [0,0,0,$fstr]; 
     354            while ($fstr =~ s/(\S+)\s+(\S+)\s*//) { 
     355                $fate->[0] = $1; 
     356                $fate->[1] = $2; 
     357                $fate = $fate->[2] = [0,0,0,$fstr] if $fstr ne ''; 
     358            } 
     359            $i++; 
     360        } 
    323361        warn "(null pattern for $key)" unless @pat; 
    324362        my $pat = join("\n", @pat); 
     
    326364        $AUTOLEXED{$key} = $oldfakepos; 
    327365 
    328         $lexer = { "NAME" => $name, "FILE" => "$dir/$file", "PATS" => [@pat], "DBA" => $dba}; 
     366        $lexer = { "NAME" => $name, "FILE" => "$dir/$file", "PATS" => [@pat], "FATES" => $fates, "DBA" => $dba}; 
    329367 
    330368        return $lexer if $lang =~ /ANON/; 
     
    685723            my $i = 0; 
    686724            my $fates = []; 
    687             if (@pats > 500) { 
    688                 print "Too many patterns for $ch2 file $file\n"; 
    689             } 
    690             for (@pats) { 
    691                 s/\(\?#FATE +(.*?)\)/(?#$i FATE $1)/; 
    692                 my $fstr = $1; 
    693                 my $fate = $fates->[$i] = [0,0,0,$fstr]; 
    694                 while ($fstr =~ s/(\S+)\s+(\S+)\s*//) { 
    695                     $fate->[0] = $1; 
    696                     $fate->[1] = $2; 
    697                     $fate = $fate->[2] = [0,0,0,$fstr] if $fstr ne ''; 
    698                 } 
    699                 $i++; 
    700             } 
     725            my $FATES = $lexer->{FATES}; 
    701726 
    702727            for my $pat (@pats) { 
    703                 $pat =~ s/\(\?#.*?\)//g; 
    704                 $pat =~ s/\s+//g; 
    705                 $pat =~ s/:://g; 
     728                $pat =~ s/\t\(\?#FATE(\d+).*?\)// or die "Malformed fate"; 
     729                $fates->[$i++] = $FATES->[$1]; 
    706730            } 
    707731 
     
    21512175            if ($PREFIX) { 
    21522176                for (@pat) { 
    2153                     s/(\t\(\?#FATE) *(.*?\))(.*)/$3$1$PREFIX $2/g; 
     2177                    s/(\t\(\?#FATE)\d* *(.*?\))(.*)/$3$1$PREFIX $2/g; 
    21542178                } 
    21552179            } 
     
    23162340                        my $newold = $oldalt; 
    23172341                        my $newnew = $newalt; 
    2318                         $newnew =~ s/\t\(\?#FATE *(.*?)\)//; 
     2342                        $newnew =~ s/\t\(\?#FATE\d* *(.*?)\)//; 
    23192343                        my $morefate = $1; 
    23202344                        $newold =~ s/(FATE.*?)\)/$1 $morefate)/;