Changeset 2910


Ignore:
Timestamp:
Feb 15, 2013, 1:29:14 PM (6 years ago)
Author:
cameron
Message:

Parallel prescanning in Parse_CommentsLiteralStrings

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/PDF/pdf.py

    r2667 r2910  
    200200        even_final = pablo.ScanThru(even_start, lex.Backslash)
    201201        escape = even_final & odd
    202         escape_char = even & pablo.SpanUpTo(even_start, even_final)
     202        escaped_Char = even & pablo.SpanUpTo(even_start, even_final)
    203203       
    204204        odd_start = start & odd
     
    207207
    208208        escape = escape | (odd_final & even)
    209         escape_char |= odd & odd_sut
    210        
    211         escaped_Callouts.escapes = escape_char
     209        escaped_Char |= odd & odd_sut
     210       
     211        escaped_Callouts.escapes = escaped_Char
    212212        escaped_Callouts.UELParen = lex.LParen &~ escape
    213213        escaped_Callouts.UERParen = lex.RParen &~ escape
     
    264264        literalStrings_Callouts.ends = 0
    265265
    266         scan_characters = escaped_Callouts.UELParen | escaped_Callouts.UERParen | lex.Percent
     266        parens = escaped_Callouts.UELParen | escaped_Callouts.UERParen
     267
     268        #
     269        # Try parallel methods first, to handle normal cases.
     270        #
     271       
     272        # Comments begin with lex.Percent (%) and extend to end of line,
     273        # except that % marks in strings do not mark comments.
     274        # Observation: no % mark found within the scope of a left paren can
     275        # be a comment start delimiter: it is either a % within a string or
     276        # an interior % mark within the comment.
     277        pscan = pablo.AdvanceThenScanTo(escaped_Callouts.UELParen, parens)
     278        instring = pablo.ExclusiveSpan(escaped_Callouts.UELParen, pscan)
     279        CtCand = lex.Percent &~ instring
     280        qscan = pablo.AdvanceThenScanTo(escaped_Callouts.UERParen & knownNonCtReg, parens & knownNonCtReg)             
     281        unmatched = pscan & escaped_Callouts.UELParen | qscan & escaped_Callouts.UERParen
     282        if CtCand:
     283                line_start = ~pablo.Advance(~lex.EOL)
     284                comment1 = pablo.ScanTo(line_start, lex.EOL | CtCand)
     285                knownNonCtReg = pablo.SpanUpTo(line_start, comment1)
     286                pscan = pscan & knownNonCtReg
     287                instring = instring & knownNonCtReg
     288        #
     289
     290        scan_characters = unmatched | CtCand
     291
     292        #scan_characters = escaped_Callouts.UELParen | escaped_Callouts.UERParen | lex.Percent
    267293        cursor = pablo.ScanToFirst(scan_characters)
    268294        while pablo.inFile(cursor) :
    269295                comment_cursor = cursor & lex.Percent
    270                 string_cursor = cursor & (escaped_Callouts.UELParen|escaped_Callouts.UERParen)
     296                string_cursor = cursor & parens
    271297                if comment_cursor :
    272298                        comment_starts |=comment_cursor
    273299                        comment_cursor = pablo.ScanTo(comment_cursor, lex.EOL)
    274300                        comment_ends |=comment_cursor
    275                         cursor = pablo.ScanTo(pablo.Advance(comment_cursor), scan_characters)
     301                        cursor = pablo.AdvanceThenScanTo(comment_cursor, scan_characters)
    276302               
    277303                if string_cursor :
    278304                        #There should be a better way to do this
    279305                        if (string_cursor & escaped_Callouts.UELParen) :
    280                                 if is_zero():
    281                                         literalStrings_Callouts.starts|=string_cursor
    282306
    283307                                inc()
    284308                        if (string_cursor & escaped_Callouts.UELParen) :
    285                                 cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
     309                                cursor = pablo.AdvanceThenScanTo(string_cursor, parens)
     310                                instring |= pablo.SpanUpTo(string_cursor, parens)
     311
    286312                        if (string_cursor & escaped_Callouts.UERParen) :
    287313                                dec()
    288314                        if (string_cursor & escaped_Callouts.UERParen) :
    289315                                if is_zero():
    290                                         literalStrings_Callouts.ends|=string_cursor
    291                                         cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
     316                                        cursor = pablo.AdvanceThenScanTo(string_cursor, scan_characters)
    292317                                if lt_zero():
    293318                                        literalStrings_Callouts.error|=string_cursor
    294                                         cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
     319                                        cursor = pablo.AdvanceThenScanTo(string_cursor, scan_characters)
    295320                                if ~(is_zero() | lt_zero()):
    296                                         cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
     321                                        cursor = pablo.AdvanceThenScanTo(string_cursor, parens)
    297322                                       
    298323
    299324        comments_Callouts.mask = pablo.SpanUpTo(comment_starts, comment_ends)
     325        outerParens = parens &~ instring &~ comments_Callouts.mask
     326        literalStrings_Callouts.starts = outerParens & escaped_Callouts.UELParen
     327        literalStrings_Callouts.ends = outerParens & escaped_Callouts.UERParen
    300328        literalStrings_Callouts.mask = pablo.InclusiveSpan(literalStrings_Callouts.starts,literalStrings_Callouts.ends)
    301329        literalStrings_Callouts.escapes = escaped_Callouts.escapes & literalStrings_Callouts.mask
Note: See TracChangeset for help on using the changeset viewer.