Changeset 3739 for proto/RE/demo/grep.py


Ignore:
Timestamp:
Mar 23, 2014, 11:53:07 PM (4 years ago)
Author:
ksherdy
Message:

Added support for segment-at-a-time processing. Match strings at follows position.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/RE/demo/grep.py

    r3736 r3739  
    7474        e  = 0
    7575        LF = 0
    76        
     76
    7777class Output():
    7878        matches                 = 0
    7979        lines                   = 0
    80         line_starts     = 0
     80        line_starts             = 0
    8181        line_ends               = 0
    82         byte_data               = 0
    83 
     82        all_starts              = 0
     83       
    8484def ClassifyBytes(basis_bits, lex): 
    8585        temp1 = (basis_bits.bit_1 &~ basis_bits.bit_0)
     
    110110       
    111111def Match(lex, output):
    112         m0 = lex.a
    113         m1 = pablo.Advance(m0) & lex.p
    114         m2 = pablo.Advance(m1) & lex.p
    115         m3 = pablo.Advance(m2) & lex.l
    116         m4 = pablo.Advance(m3) & lex.e
    117         output.matches = m4
     112    # Mark _follows.
     113        cursor = pablo.Advance(lex.a)
     114        cursor = pablo.Advance(cursor & lex.p)
     115        cursor = pablo.Advance(cursor & lex.p)
     116        cursor = pablo.Advance(cursor & lex.l)
     117        cursor = pablo.Advance(cursor & lex.e)
     118        output.matches = cursor
    118119
    119120def MatchLines(lex, output):
     121       
     122        all_line_starts   = pablo.ScanToFirst(~lex.LF) | (pablo.Advance(lex.LF) &~ lex.LF)
     123        output.all_starts = all_line_starts
     124        all_line_ends     = lex.LF
    120125
    121         line_start      = pablo.Advance(~0) ^ ~0 # pablo.First()
    122         cursor                  = line_start
     126        last_line_start   = pablo.ScanToFirst(all_line_starts) 
     127        cursor            = last_line_start
    123128
    124129        while(pablo.inFile(cursor)):
    125                 cursor = pablo.ScanTo(cursor, (lex.LF | output.matches))
    126                 if(cursor & lex.LF):
    127                         line_start = pablo.Advance(cursor)
    128                         cursor = line_start
     130               
     131                if(cursor & all_line_starts):
     132                        last_line_start = cursor
     133                       
    129134                if(cursor & output.matches):
    130                         output.line_starts  |= line_start
    131                         output.line_ends    |= pablo.AdvanceThenScanTo(cursor, lex.LF)
    132                         output.lines |= pablo.InclusiveSpan(output.line_starts, output.line_ends) # LF
    133                         cursor = pablo.Advance(cursor)
     135                        cursor = pablo.ScanTo(cursor, lex.LF)
     136                        output.lines |= pablo.InclusiveSpan(last_line_start, cursor) # LF | match
     137               
     138                cursor = pablo.AdvanceThenScanTo(cursor, all_line_starts | output.matches)
     139
     140        output.line_starts = output.lines & all_line_starts
     141        output.line_ends   = pablo.ScanTo(output.line_starts, output.lines & all_line_ends)
     142
     143
    134144
    135145###
     
    154164        MatchLines(lex, output)
    155165
    156         ### FilterMatchLines(data, output)
    157         ### WriteStreamOutput(Output)
     166    ### FilterMatchLines(data, output)
     167    ### WriteStreamOutput(Output)
    158168
    159169        ### if(options.count):
Note: See TracChangeset for help on using the changeset viewer.