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_demo.py

    r3738 r3739  
    114114       
    115115def Match(lex, output):
    116         m0 = lex.a
    117         m1 = pablo.Advance(m0) & lex.p
    118         m2 = pablo.Advance(m1) & lex.p
    119         m3 = pablo.Advance(m2) & lex.l
    120         m4 = pablo.Advance(m3) & lex.e
    121         output.matches = m4
     116#   Mark '_follows'
     117        cursor = pablo.Advance(lex.a)
     118        cursor = pablo.Advance(cursor & lex.p)
     119        cursor = pablo.Advance(cursor & lex.p)
     120        cursor = pablo.Advance(cursor & lex.l)
     121        cursor = pablo.Advance(cursor & lex.e)
     122        output.matches = cursor
     123
     124#   Mark '_ends'
     125#       m0 = lex.a
     126#       m1 = pablo.Advance(m0) & lex.p
     127#       m2 = pablo.Advance(m1) & lex.p
     128#       m3 = pablo.Advance(m2) & lex.l
     129#       m4 = pablo.Advance(m3) & lex.e
     130#       output.matches = m4
    122131
    123132def MatchLines(lex, output):
    124         crt_line_start  = pablo.Advance(~0) ^ ~0 # line_start == pablo.First()
    125         cursor                  = crt_line_start
    126 
    127         LF_or_match     = lex.LF | output.matches
     133
     134        all_line_starts   = pablo.ScanToFirst(~lex.LF) | (pablo.Advance(lex.LF) &~ lex.LF)
     135        output.all_starts = all_line_starts
     136        all_line_ends     = lex.LF
     137
     138        last_line_start   = pablo.ScanToFirst(all_line_starts) 
     139        cursor            = last_line_start
    128140
    129141        while(pablo.inFile(cursor)):
    130                 cursor = pablo.ScanTo(cursor, LF_or_match)
    131                 if(cursor & lex.LF):
    132                         crt_line_start = pablo.Advance(cursor)
    133                         cursor = crt_line_start
     142               
     143                if(cursor & all_line_starts):
     144                        last_line_start = cursor
     145                       
    134146                if(cursor & output.matches):
    135 
    136                         output.line_starts  |= crt_line_start
    137                         output.line_ends    |= pablo.AdvanceThenScanTo(cursor, lex.LF)
    138 
    139                         output.lines |= pablo.InclusiveSpan(output.line_starts, output.line_ends) # LF
    140                         # output.lines |= pablo.SpanUpTo(line_start, cursor) &~ lex.LF                          # no LF
    141                         cursor = pablo.Advance(cursor)
    142 
    143 def MatchLines2(lex, output): # verbose with temporary streams
    144         line_start      = 0
    145         line_end        = 0
    146         line_start      = pablo.Advance(~line_start) ^ ~line_start # line_start == pablo.First()
    147         output.line_starts = line_start
    148 
    149         LF_or_match     = lex.LF | output.matches
    150         cursor                  = pablo.ScanToFirst(LF_or_match)
     147                        cursor = pablo.ScanTo(cursor, lex.LF)
     148                        output.lines |= pablo.InclusiveSpan(last_line_start, cursor) # LF | match
     149               
     150                cursor = pablo.AdvanceThenScanTo(cursor, all_line_starts | output.matches)
     151
     152        output.line_starts = output.lines & all_line_starts
     153        output.line_ends   = pablo.ScanTo(output.line_starts, output.lines & all_line_ends)
     154
     155###
     156###  KH: Fails to compile. Root cause not yet found.
     157###
     158def MatchLines2(lex, output):
     159
     160        all_line_starts   = pablo.ScanToFirst(~lex.LF) | (pablo.Advance(lex.LF) &~ lex.LF)
     161        output.all_starts = all_line_starts
     162        all_line_ends     = lex.LF
     163
     164        last_line_start   = pablo.ScanToFirst(all_line_starts) 
     165        cursor            = last_line_start
    151166
    152167        while(pablo.inFile(cursor)):
    153                 if(cursor & lex.LF):
    154                         line_start = pablo.Advance(cursor)
    155                         cursor = line_start
     168               
     169                if(cursor & all_line_starts):
     170                        last_line_start = cursor
     171                       
    156172                if(cursor & output.matches):
    157                         line_end = pablo.AdvanceThenScanTo(cursor, lex.LF)
    158                         output.line_starts  |= line_start
    159                         output.line_ends    |= line_end
    160 
    161                         output.lines |= pablo.InclusiveSpan(line_start, line_end) | line_end    # LF
    162                         # output.lines |= pablo.SpanUpTo(line_start, cursor) &~ lex.LF                  # no LF
    163                         cursor = line_end
    164                         cursor = pablo.ScanTo(cursor, LF_or_match)
    165                         # cursor = next_end
    166                                
     173                        output.line_starts |= last_line_start                   
     174                        cursor = pablo.ScanTo(cursor, lex.LF)
     175                        output.line_ends |= cursor
     176                        output.lines |= pablo.InclusiveSpan(last_line_start, cursor) # LF | match
     177               
     178                cursor = pablo.AdvanceThenScanTo(cursor, all_line_starts | output.matches)
     179               
    167180def FilterMatchLines(data, output):
    168181        output.byte_data = pablo.filter_bytes(data, ~output.lines)
     
    175188
    176189basis_bits      = Basis()
    177 lex             = Lex()
     190lex                 = Lex()
    178191output          = Output()
    179192
Note: See TracChangeset for help on using the changeset viewer.