Changeset 2568 for proto/PDF/pdf.py


Ignore:
Timestamp:
Oct 26, 2012, 4:32:05 PM (7 years ago)
Author:
bhull
Message:

Changes to template

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/PDF/pdf.py

    r2560 r2568  
    11import sys
    22import pablo
     3
    34
    45class Basis_bits():     
     
    2122        Backslash = 0
    2223        Percent = 0
    23         Slash = 0
    24         Regular = 0
    25         Delimiter = 0
    26         LAngle = 0
    27         RAngle = 0
    28         Hex = 0
    29         WS = 0
    30         Digit = 0
    31         Sign = 0
    32         Period = 0
    33         EOL = 0
    34         RBracket = 0
    35         LBracket = 0
     24        Slash=0
     25        Regular=0
     26        Delimiter=0
     27        LAngle=0
     28        RAngle=0
     29        Hex=0
     30        WS=0
     31        Digit=0
     32        Sign=0
     33        Period=0
     34        EOL=0
     35        RBracket=0
     36        LBracket=0
    3637       
    3738class Escaped_Callouts ():
     
    4041
    4142class Comments_Callouts() :
    42         mask = 0
    43 
     43        mask=0
    4444class LiteralStrings_Callouts() :
    45         starts = 0
    46         follows = 0
    47         mask = 0
     45        starts=0
     46        ends=0
     47        mask=0
    4848        error = 0
    4949
     
    5757class HexStrings_Callouts() :
    5858        starts = 0
     59        ends = 0
     60        error = 0
     61
     62class Numeric_Callouts() :
     63        starts = 0
    5964        follows = 0
    6065        error = 0
    6166
    62 class Numeric_Callouts() :
    63         starts = 0
    64         follows = 0
    65         error = 0
    66 
    6767class Keywords_Callouts() :
    6868        starts = 0
    69         follows = 0
     69        ends = 0
    7070       
    7171class Arrays_Callouts() :
    7272        starts = 0
    73         follows = 0
     73        ends = 0
     74
    7475
    7576def Classify_bytes(basis_bits, lex): 
     
    163164        lex.Regular = ~lex.Delimiter&~lex.WS
    164165
    165 # Demo Only
    166 #       
    167 # def simd_const_4(hexdigit, EOF_mask):
    168 #       lgth = bitutil.count_leading_zeroes(~EOF_mask)/4
    169 #       return int(hexdigit*(lgth+1),16)&EOF_mask
    170 
    171 
    172 def Parse_Escaped(lex, parity, escaped_Callouts):
    173 
    174   # Demo Only
    175   #
    176         # odd = simd_const_4('a',EOF_mask) 
    177         # even = simd_const_4('5',EOF_mask)
    178 
    179         odd = parity.odd
    180         even = parity.even
    181    
     166
     167
     168def simd_const_4(hexdigit, EOF_mask):
     169        lgth = pablo.count_leading_zeroes(~EOF_mask)/4
     170        return int(hexdigit*(lgth+1),16)&EOF_mask
     171
     172
     173def Parse_Escaped(lex, escaped_Callouts):
     174
     175        odd = simd_const_4('a',pablo.EOF_mask) 
     176        even = simd_const_4('5',pablo.EOF_mask)
     177
    182178        start = lex.Backslash &~ pablo.Advance(lex.Backslash)
    183179        even_start = start & even
     
    192188        escaped_Callouts.UELParen = lex.LParen &~ escape
    193189        escaped_Callouts.UERParen = lex.RParen &~ escape
    194        
     190
     191def inc() :
     192        global depth
     193        depth+=1
     194
     195def dec() :
     196        global depth
     197        depth-=1
     198
     199def lt_zero() :
     200        global depth
     201        return depth < 0
     202
     203def gt_zero() :
     204        global depth
     205        return depth > 0
     206
     207def is_zero() :
     208        global depth
     209        return depth==0
     210               
    195211# Parallel version
    196 # def Parse_LiteralStrings(LParen, RParen, literalStrings_Callouts):
     212# def Parse_LiteralStrings(LParen, RParen, LiteralStrings_Callouts):
    197213        # unmatched = RParen
    198214        # pscan = {}
    199215        # qscan = {}
    200         # literalStrings_Callouts.closed={}
     216        # LiteralStrings_Callouts.closed={}
    201217        # i = 0
    202218        # pscan[0] = pablo.ScanTo(pablo.Advance(LParen), LParen | RParen)
    203219        # qscan[0] = pablo.ScanTo(pablo.Advance(RParen), LParen | RParen)
    204         # literalStrings_Callouts.mask = (pscan[0] - (LParen)) | pscan[0]
    205        
    206         # literalStrings_Callouts.closed[i] = pscan[i] & RParen
     220        # LiteralStrings_Callouts.mask = (pscan[0] - (LParen)) | pscan[0]
     221       
     222        # LiteralStrings_Callouts.closed[i] = pscan[i] & RParen
    207223        # unclosed = pscan[i] & LParen | qscan[i] & RParen
    208         # literalStrings_Callouts.error = pscan[i] &~ EOF_mask
    209         # all_closed = literalStrings_Callouts.closed[i]
     224        # LiteralStrings_Callouts.error = pscan[i] &~ pablo.EOF_mask
     225        # all_closed = LiteralStrings_Callouts.closed[i]
    210226        # while unclosed:
    211227                # i += 1
    212228                # pscan[i] = pablo.ScanTo(pablo.Advance(unclosed & LParen), unclosed)
    213229                # qscan[i] = pablo.ScanTo(pablo.Advance(unclosed & RParen), unclosed)
    214                 # literalStrings_Callouts.mask|=(pscan[i]-(unclosed & LParen)) | pscan[i]
    215                 # literalStrings_Callouts.closed[i] = pscan[i] & RParen #| qscan[i] & LParen
     230                # LiteralStrings_Callouts.mask|=(pscan[i]-(unclosed & LParen)) | pscan[i]
     231                # LiteralStrings_Callouts.closed[i] = pscan[i] & RParen #| qscan[i] & LParen
    216232                # unclosed = pscan[i] & LParen | qscan[i] & RParen
    217                 # all_closed |= literalStrings_Callouts.closed[i]
    218                 # literalStrings_Callouts.error |= pscan[i] &~ EOF_mask #| ~pablo.atEOF(qscan[i])
    219        
    220         # literalStrings_Callouts.error |= RParen &~ all_closed
    221 # def Parse_Comments(Percent, lex, comments_Callouts) :
     233                # all_closed |= LiteralStrings_Callouts.closed[i]
     234                # LiteralStrings_Callouts.error |= pscan[i] &~ pablo.EOF_mask #| ~pablo.atEOF(qscan[i])
     235       
     236        # LiteralStrings_Callouts.error |= RParen &~ all_closed
     237# def Parse_Comments(Percent, lex, Comments_Callouts) :
    222238        # end = Pablo.ScanTo(Percent, lex.EOL)
    223         # comments_Callouts.mask = end-Percent
    224 # def Parse_CommentsLiteralStrings(lex, escaped_Callouts, marker, comments_Callouts, literalStrings_Callouts) :
    225         # Parse_LiteralStrings(escaped_Callouts.UELParen, escaped_Callouts.UERParen, literalStrings_Callouts)
    226         # while (lex.Percent &~ (literalStrings_Callouts.mask | comments_Callouts.mask)) :
    227                 # Parse_Comments(lex.Percent&~literalStrings_Callouts.mask, lex, comments_Callouts)
    228                 # if (literalStrings_Callouts.mask & comments_Callouts.mask) :
    229                         # Parse_LiteralStrings(escaped_Callouts.UELP &~ comments_Callouts.mask, escaped_Callouts.UERP &~ comments_Callouts.mask, literalStrings_Callouts)
     239        # Comments_Callouts.mask = end-Percent
     240# def Parse_CommentsLiteralStrings(lex, Escaped_Callouts, Marker, Comments_Callouts, LiteralStrings_Callouts) :
     241        # Parse_LiteralStrings(Escaped_Callouts.UELParen, Escaped_Callouts.UERParen, LiteralStrings_Callouts)
     242        # while (lex.Percent &~ (LiteralStrings_Callouts.mask | Comments_Callouts.mask)) :
     243                # Parse_Comments(lex.Percent&~LiteralStrings_Callouts.mask, lex, Comments_Callouts)
     244                # if (LiteralStrings_Callouts.mask & Comments_Callouts.mask) :
     245                        # Parse_LiteralStrings(Escaped_Callouts.UELP &~ Comments_Callouts.mask, Escaped_Callouts.UERP &~ Comments_Callouts.mask, LiteralStrings_Callouts)
    230246                # else :
    231247                        # break
    232         # marker.mask = comments_Callouts.mask | literalStrings_Callouts.mask
     248        # Marker.mask = Comments_Callouts.mask | LiteralStrings_Callouts.mask
    233249
    234250
     
    238254        depth = 0
    239255        comment_starts=0
    240         comment_follows=0
     256        comment_ends=0
    241257        scan_characters = escaped_Callouts.UELParen |escaped_Callouts.UERParen | lex.Percent
    242258        cursor = pablo.ScanToFirst(scan_characters)
    243         while cursor & EOF_mask :
     259        while pablo.inFile(cursor) :
    244260                comment_cursor = cursor & lex.Percent
    245261                string_cursor = cursor & (escaped_Callouts.UELParen|escaped_Callouts.UERParen)
     
    247263                        comment_starts |=comment_cursor
    248264                        comment_cursor = pablo.ScanTo(comment_cursor, lex.EOL)
    249                         comment_follows |=comment_cursor
     265                        comment_ends |=comment_cursor
    250266                        cursor = pablo.ScanTo(pablo.Advance(comment_cursor), scan_characters)
    251 #   
    252 #   TODO - Add support for depth variable.
    253 #               
    254 #               if string_cursor :
    255 #                       if (string_cursor & escaped_Callouts.UELParen) :
    256 #                               if depth==0:
    257 #                                       literalStrings_Callouts.starts|=string_cursor
    258 #
    259 #                               depth+=1
    260 #
    261 #                               cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
    262 #                       if (string_cursor & escaped_Callouts.UERParen) :
    263 #
    264 #                               depth-=1
    265 #
    266 #                               if depth==0:
    267 #                                       literalStrings_Callouts.follows|=string_cursor
    268 #                                       cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
    269 #                               elif depth==-1:
    270 #                                       literalStrings_Callouts.error|=string_cursor
    271 #                                       cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
    272 #                               else:
    273 #                                       cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
     267   
     268
     269               
     270                if string_cursor :
     271                        if (string_cursor & escaped_Callouts.UELParen) :
     272                                if is_zero():
     273                                        literalStrings_Callouts.starts|=string_cursor
     274
     275                                inc()
     276
     277                                cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
     278                        if (string_cursor & escaped_Callouts.UERParen) :
     279
     280                                dec()
     281
     282                                if is_zero():
     283                                        literalStrings_Callouts.ends|=string_cursor
     284                                        cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
     285                                elif lt_zero():
     286                                        literalStrings_Callouts.error|=string_cursor
     287                                        cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
     288                                else:
     289                                        cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
    274290                                       
    275291               
     
    277293        #if (depth>0):
    278294                #error
    279         comments_Callouts.mask = (comment_follows - comment_starts) | comment_follows
    280         literalStrings_Callouts.mask = (literalStrings_Callouts.follows-literalStrings_Callouts.starts) | literalStrings_Callouts.follows
     295        comments_Callouts.mask = pablo.SpanUpTo(comment_starts, comment_ends)
     296        literalStrings_Callouts.mask = pablo.SpanUpTo(literalStrings_Callouts.starts,literalStrings_Callouts.ends)
    281297        marker.mask = comments_Callouts.mask | literalStrings_Callouts.mask
    282298
     
    290306        #Haven't confirmed that this is the correct behaviour with bad input
    291307        hexStrings_Callouts.starts = lex.LAngle &~marker.mask
    292         hexStrings_Callouts.follows = pablo.ScanThru(pablo.Advance(hexStrings_Callouts.starts),lex.Hex|lex.WS)
    293         hexStrings_Callouts.error = hexStrings_Callouts.follows &~ lex.RAngle
    294         marker.mask |= hexStrings_Callouts.follows - hexStrings_Callouts.starts
     308        hexStrings_Callouts.ends = pablo.ScanThru(pablo.Advance(hexStrings_Callouts.starts),lex.Hex|lex.WS)
     309        hexStrings_Callouts.error = hexStrings_Callouts.ends &~ lex.RAngle
     310        marker.mask |= pablo.SpanUpTo(hexStrings_Callouts.starts,hexStrings_Callouts.ends)
    295311
    296312def Parse_Numeric(lex, marker, numeric_Callouts) :
     
    298314        numeric_Callouts.starts =(numeric_characters &~ pablo.Advance(lex.Regular)) &~ marker.mask
    299315        numeric_Callouts.follows =pablo.ScanThru(numeric_Callouts.starts, lex.Regular)
    300        
     316        marker.mask |= numeric_Callouts.starts
     317
    301318        # aftersign = pablo.Advance(numeric_Callouts.starts & lex.Sign) | (numeric_Callouts.starts &~ lex.Sign)
    302319        # temp = pablo.ScanThru(aftersign, lex.Digit)
     
    311328       
    312329def Parse_Arrays(lex, marker, arrays_Callouts) :
    313         arrays_Callouts.starts = lex.LBracket &~ marker.mask
    314         arrays_Callouts.follows = lex.RBracket &~ marker.mask
     330        arrays_Callouts.starts =  lex.LBracket &~ marker.mask
     331        arrays_Callouts.ends = lex.RBracket &~ marker.mask
     332
    315333       
    316334def Main(basis_bits, lex, parity, escaped_Callouts):
Note: See TracChangeset for help on using the changeset viewer.