Changeset 22853 for src

Show
Ignore:
Timestamp:
11/02/08 01:37:21 (2 months ago)
Author:
lwall
Message:

[Cursor] some prep work for matching against NFG integer arrays

Location:
src/perl6
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • src/perl6/Cursor.pmc

    r22848 r22853  
    1919    $::DEPTH = 0; 
    2020    $::ORIG = ''; 
     21    @::ORIG = (); 
    2122    @::MEMOS = (); 
    2223    %::LEXERS = (); 
     
    103104    my $class = shift; 
    104105    $::ORIG = shift() . "\n";           # original string 
    105     $::MEMOS[length $::ORIG] = undef;   # memos kept by position 
     106    @::ORIG = unpack("U*", $::ORIG); 
     107    $::MEMOS[@::ORIG] = undef;  # memos kept by position 
    106108    my %args = ('_pos' => 0, '_from' => 0); 
    107109    while (@_) { 
     
    242244    $file =~ s/:\*$//; 
    243245    my $name = $key; 
    244     $name =~ s/_01//; 
     246    my $dba = $retree->{$key}{dba}; 
     247    if (not $dba) { 
     248        $dba = $name; 
     249        $dba =~ s/_0[01]$//; 
     250        $dba =~ s/_(\d\d)$/ (alt $1)/; 
     251        $dba =~ s/:\*$//; 
     252    } 
    245253 
    246254    if (open(LEX, "$dir/$file")) { 
     
    254262        my %lexer; 
    255263        $lexer{NAME} = $name; 
    256         $lexer{DBA} = $retree->{$key}{dba} // $name; 
     264        $lexer{DBA} = $dba; 
    257265        $lexer{FILE} = "$dir/$file"; 
    258266        $lexer{PATS} = \@pat; 
     
    307315        $AUTOLEXED{$key} = $oldfakepos; 
    308316 
    309         $lexer = { "NAME" => $name, "FILE" => "$dir/$file", "PATS" => [@pat], "DBA" => $retree->{$key}{dba} // $name}; 
     317        $lexer = { "NAME" => $name, "FILE" => "$dir/$file", "PATS" => [@pat], "DBA" => $dba}; 
    310318 
    311319        return $lexer if $lang =~ /ANON/; 
     
    431439        $self->_AUTOLEXpeek($key,$retree); 
    432440    }; 
    433     $self->highwater($lexer->{DBA}) if $self->{_pos} >= $::HIGHWATER; 
     441    if ($self->{_pos} >= $::HIGHWATER) { 
     442        if ($self->{_pos} > $::HIGHWATER) { 
     443            %$::HIGHEXPECT = (); 
     444            $::HIGHMESS = ''; 
     445        } 
     446        $::HIGHEXPECT->{$lexer->{DBA}}++; 
     447        $::HIGHWATER = $self->{_pos}; 
     448    } 
     449 
    434450    my $P = $self->{_pos}; 
    435     if ($P == length($::ORIG)) { 
     451    if ($P >= @::ORIG) { 
    436452        return sub { return }; 
    437453    } 
     
    530546            sub { 
    531547                my $C = shift; 
    532  
    533                 # die "orig disappeared!!!" unless length($::ORIG); 
    534548 
    535549                return unless $lexer; 
     
    674688} 
    675689 
    676 sub highwater { 
    677     my $self = shift; 
    678     if ($self->{_pos} > $::HIGHWATER) { 
    679         %$::HIGHEXPECT = (); 
    680         $::HIGHMESS = ''; 
    681     } 
    682     for (@_) { 
    683         my $name = $_; 
    684         $name =~ s/_0[01]$//; 
    685         $name =~ s/_(\d\d)$/ (alt $1)/; 
    686         $name =~ s/:\*$//; 
    687         $::HIGHEXPECT->{$name}++; 
    688     } 
    689     $::HIGHWATER = $self->{_pos}; 
    690 } 
    691  
    692690sub delete { 
    693691    my $self = shift; 
     
    11131111    local $CTX = $self->callm if $DEBUG & DEBUG::trace_call; 
    11141112    my $pos = $self->{_pos}; 
    1115     my $eos = length(${\$::ORIG}); 
     1113    my $eos = @::ORIG; 
    11161114 
    11171115    lazymap( sub { $self->cursor($_[0])->retm() }, LazyRange->new($pos,$eos) ); 
     
    11221120    local $CTX = $self->callm if $DEBUG & DEBUG::trace_call; 
    11231121    my $pos = $self->{_pos}; 
    1124     my $eos = length(${\$::ORIG}); 
     1122    my $eos = @::ORIG; 
    11251123 
    11261124    lazymap( sub { $self->cursor($_[0])->retm() }, LazyRangeRev->new($eos,$pos) ); 
     
    11561154    my $prev_pos = $pos->{_pos} // 0; 
    11571155    my @all; 
    1158     my $eos = length(${\$::ORIG}); 
     1156    my $eos = @::ORIG; 
    11591157    for (;;) { 
    11601158      last if $pos->{_pos} == $eos; 
     
    11781176 
    11791177    # don't go beyond end of string 
    1180     return () if $self->{_pos} == length(${\$::ORIG}); 
     1178    return () if $self->{_pos} == @::ORIG; 
    11811179    lazymap( 
    11821180        sub { 
     
    12051203    my $to = $self; 
    12061204    my @all; 
    1207     my $eos = length(${\$::ORIG}); 
     1205    my $eos = @::ORIG; 
    12081206    for (;;) { 
    12091207      last if $to->{_pos} == $eos; 
     
    12291227    my @result; 
    12301228    # don't go beyond end of string 
    1231     return () if $self->{_pos} == length(${\$::ORIG}); 
     1229    return () if $self->{_pos} == @::ORIG; 
    12321230    do { 
    12331231        for my $x ($block->($self)) { 
     
    12561254    my $to = $self; 
    12571255    my @all; 
    1258     my $eos = length(${\$::ORIG}); 
     1256    my $eos = @::ORIG; 
    12591257    for (;;) { 
    12601258      last if $to->{_pos} == $eos; 
     
    14561454} 
    14571455 
     1456sub _EXACT_rev { my $self = shift; 
     1457    my $s = shift() // ''; 
     1458    my @ints = unpack("U*", $s); 
     1459 
     1460    local $CTX = $self->callm($s) if $DEBUG & DEBUG::trace_call; 
     1461    my $P = $self->{_pos} // 0; 
     1462    while (@ints) { 
     1463        return () unless ($::ORIG[--$P]//-1) == pop @ints; 
     1464    } 
     1465    return $self->cursor($P)->retm(); 
     1466} 
     1467 
    14581468sub _EXACT { my $self = shift; 
    14591469    my $s = shift() // ''; 
     1470    my @ints = unpack("U*", $s); 
    14601471 
    14611472    local $CTX = $self->callm($s) if $DEBUG & DEBUG::trace_call; 
    14621473    my $P = $self->{_pos} // 0; 
    1463     my $len = length($s); 
    1464     if (substr($::ORIG, $P, $len) eq $s) { 
    1465         $self->deb("EXACT $s matched @{[substr($::ORIG,$P,$len)]} at $P $len") if $DEBUG & DEBUG::matchers; 
    1466         my $r = $self->cursor($P+$len); 
    1467         $r->retm(); 
    1468     } 
    1469     else { 
    1470         $self->deb("EXACT $s didn't match @{[substr($::ORIG,$P,$len)]} at $P $len") if $DEBUG & DEBUG::matchers; 
    1471         return (); 
    1472     } 
     1474    while (@ints) { 
     1475        return () unless ($::ORIG[$P++]//-1) == shift @ints; 
     1476    } 
     1477    return $self->cursor($P)->retm(); 
     1478#    if (substr($::ORIG, $P, $len) eq $s) { 
     1479#        $self->deb("EXACT $s matched @{[substr($::ORIG,$P,$len)]} at $P $len") if $DEBUG & DEBUG::matchers; 
     1480#        my $r = $self->cursor($P+$len); 
     1481#        $r->retm(); 
     1482#    } 
     1483#    else { 
     1484#        $self->deb("EXACT $s didn't match @{[substr($::ORIG,$P,$len)]} at $P $len") if $DEBUG & DEBUG::matchers; 
     1485#        return (); 
     1486#    } 
    14731487} 
    14741488 
     
    15331547} 
    15341548 
    1535 sub _EXACT_rev { my $self = shift; 
    1536     my $s = shift; 
    1537  
    1538     local $CTX = $self->callm if $DEBUG & DEBUG::trace_call; 
    1539     my $len = length($s); 
    1540     my $from = $self->{_pos} - $len; 
    1541     if ($from >= 0 and substr($::ORIG, $from, $len) eq $s) { 
    1542         my $r = $self->cursor_rev($from); 
    1543         $r->retm(); 
    1544     } 
    1545     else { 
    1546 #        say "EXACT_rev $s didn't match @{[substr($!orig,$from,$len)]} at $from $len"; 
    1547         return (); 
    1548     } 
    1549 } 
     1549#sub _EXACT_rev { my $self = shift; 
     1550#    my $s = shift; 
     1551# 
     1552#    local $CTX = $self->callm if $DEBUG & DEBUG::trace_call; 
     1553#    my $len = length($s); 
     1554#    my $from = $self->{_pos} - $len; 
     1555#    if ($from >= 0 and substr($::ORIG, $from, $len) eq $s) { 
     1556#        my $r = $self->cursor_rev($from); 
     1557#        $r->retm(); 
     1558#    } 
     1559#    else { 
     1560##        say "EXACT_rev $s didn't match @{[substr($!orig,$from,$len)]} at $from $len"; 
     1561#        return (); 
     1562#    } 
     1563#} 
    15501564 
    15511565sub _ARRAY { my $self = shift; 
     
    18101824    local $CTX = $self->callm if $DEBUG & DEBUG::trace_call; 
    18111825    my $P = $self->{_pos}; 
    1812     if ($P < length($::ORIG)) { 
     1826    if ($P < @::ORIG) { 
    18131827        $self->cursor($P+1)->retm(); 
    18141828    } 
     
    18551869    local $CTX = $self->callm if $DEBUG & DEBUG::trace_call; 
    18561870    my $P = $self->{_pos}; 
    1857     if ($P == length($::ORIG)) { 
     1871    if ($P == @::ORIG) { 
    18581872        $self->cursor($P)->retm(); 
    18591873    } 
     
    18671881    local $CTX = $self->callm if $DEBUG & DEBUG::trace_call; 
    18681882    my $P = $self->{_pos}; 
    1869     if ($P == length($::ORIG) or substr($::ORIG, $P, 1) =~ /^(?:\r\n|[\n\f\x0b\x{2028}\x{2029}])$/) { 
     1883    if ($P == @::ORIG or substr($::ORIG, $P, 1) =~ /^(?:\r\n|[\n\f\x0b\x{2028}\x{2029}])$/) { 
    18701884        $self->cursor($P)->retm(); 
    18711885    } 
  • src/perl6/gimme5

    r22836 r22853  
    17601760    sub walk { 
    17611761        my $self = shift; 
    1762         my $text = quotemeta($$self{text}); 
    1763         $text = "(?<=$text)" if $REV; 
    17641762        if ($$self{i}) { 
     1763            my $text = quotemeta($$self{text}); 
     1764            $text = "(?<=$text)" if $REV; 
    17651765            '$C->_PATTERN(qr/\\G(?i:' . $text . ')/)'; 
    17661766        } 
    17671767        else { 
    1768             "\$C->_PATTERN(qr/\\G$text/)"; 
     1768            my $text = $$self{text}; 
     1769            $text =~ s/([\\'])/\\$1/g; 
     1770            "\$C->_EXACT$REV('$text')"; 
     1771    #       "\$C->_PATTERN(qr/\\G$text/)"; 
    17691772#           my $l = length($text); 
    17701773#           "(substr(\$\$buf, \$C->{_pos}, $l) eq '" . $text .  "' ? \$C->cursor(\$C->{_pos} + $l) : ())" 
  • src/perl6/tryfile

    r22848 r22853  
    77 
    88for my $file (@ARGV) { 
    9     warn $file,"\n"; 
     9    warn $file,"\n" if @ARGV > 1; 
    1010    eval { 
    1111        STD->parsefile($file);