Ignore:
Timestamp:
Nov 8, 2010, 6:13:39 PM (8 years ago)
Author:
ksherdy
Message:

Add JSON string handling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/JSON/json_prototype.py

    r690 r698  
    2323debug = False
    2424filename = "json_prototype.py"
     25
     26# NOTE
     27#
     28# Spans - Do not include the final character.
     29#
     30
    2531
    2632# Globals
     
    119125        (bit, EOF_mask) = bitutil.transpose_streams(u8data)
    120126        (u8, Lex, Ctrl) = byteclass.classify_bytes(bit)
    121         Parity = parallel_prefix_parity(Lex.DQuote,lgth)
     127        ParityMask = parallel_prefix_parity(Lex.DQuote,lgth)
    122128       
    123129        bitutil.print_aligned_streams([('Input Data', u8data),
    124130                              ('Lex.DQuote', bitutil.bitstream2string(Lex.DQuote, lgth)),
    125                               ('Parity', bitutil.bitstream2string(Parity, lgth)),       
     131                              ('Parity', bitutil.bitstream2string(ParityMask, lgth)),   
    126132                              ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1))])
    127133        return
    128134
    129 #def all_starts(u8data):
    130 #       r"""
    131 #       
    132 #       This function returns multi-cursor start positions for each JSON value type.
    133 #       
    134 #       """
    135 #       return (StringStarts, NumberStarts, ArrayStarts, ObjectStarts, TrueStarts, FalseStarts, NullStarts, )
     135def value_starts(Lex,StringMask,EscapeChars,lgth):
     136        r"""
     137        This function returns multi-cursor start positions for each JSON value type.
     138        """
     139        ValueStartsMask = (StringMask | EscapeChars)
     140       
     141        ObjectStarts = Lex.LCurlyBrace &~ ValueStartsMask
     142        ArrayStarts = Lex.LSquareBracket &~ ValueStartsMask
     143       
     144        Comma = Lex.Comma &~ ValueStartsMask
     145        Colon = Lex.Colon &~ ValueStartsMask
     146       
     147        NonStringSyncPoint = (ArrayStarts | Comma | Colon)
     148        StringSyncPoint = (ObjectStarts | NonStringSyncPoint)
     149       
     150        StringSyncPointFollows = bitutil.Advance(StringSyncPoint)
     151        StringStarts = (StringSyncPointFollows | bitutil.ScanThru(StringSyncPointFollows,Lex.WS)) & (Lex.DQuote &~ ValueStartsMask)
     152
     153        NonStringSyncPointFollows = bitutil.Advance(NonStringSyncPoint)
     154        ValueCursors = (StringSyncPointFollows | bitutil.ScanThru(StringSyncPointFollows,Lex.WS))
     155       
     156        NumberStarts = ValueCursors & ((Lex.Minus|Lex.Digit0_9) &~ ValueStartsMask)
     157        TrueStarts = ValueCursors & (Lex.t &~ ValueStartsMask)
     158        FalseStarts = ValueCursors & (Lex.f &~ ValueStartsMask)
     159        NullStarts = ValueCursors & (Lex.n &~ ValueStartsMask)
     160       
     161        if debug:
     162                bitutil.print_aligned_streams([('Input Data', u8data),
     163                              ('ValueStartsMask', bitutil.bitstream2string(ValueStartsMask, lgth)),
     164                              ('Comma', bitutil.bitstream2string(Comma, lgth)),
     165                              ('Colon', bitutil.bitstream2string(Colon, lgth)),
     166                              ('Lex.DQuote &~ ValueStartsMask', bitutil.bitstream2string((Lex.DQuote &~ ValueStartsMask), lgth)),
     167                              ('NonStringSyncPoint', bitutil.bitstream2string(NonStringSyncPoint, lgth)),
     168                              ('StringSyncPoint', bitutil.bitstream2string(StringSyncPoint, lgth)),
     169                              ('StringSyncPointFollows', bitutil.bitstream2string(StringSyncPointFollows, lgth)),
     170                              ('StringStarts', bitutil.bitstream2string(StringStarts, lgth)),
     171                              ('NonStringSyncPointFollows', bitutil.bitstream2string(NonStringSyncPointFollows, lgth)),
     172                              ('ValueCursors', bitutil.bitstream2string(ValueCursors, lgth))])
     173       
     174        return (ObjectStarts, ArrayStarts, StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts)
     175
     176
     177def demo_value_starts(u8data):
     178        global lgth
     179        lgth = len(u8data)
     180               
     181        (bit, EOF_mask) = bitutil.transpose_streams(u8data)
     182        (u8, Lex, Ctrl) = byteclass.classify_bytes(bit)
     183       
     184        EscapeChars = parse_escape(Lex, EOF_mask)
     185       
     186        UnescapedDQuotes = (Lex.DQuote &~ EscapeChars)
     187       
     188        ParityMask = parallel_prefix_parity(UnescapedDQuotes, lgth) & EOF_mask # TODO - Solve EOF_mask problem
     189        StringMask = ParityMask & bitutil.Advance(ParityMask)   
     190       
     191        (ObjectStarts, ArrayStarts, StringStarts, NumberStarts,TrueStarts, FalseStarts, NullStarts) = value_starts(Lex, StringMask,EscapeChars,lgth)
     192        bitutil.print_aligned_streams([('Input Data', u8data),
     193                              ('ObjectStarts', bitutil.bitstream2string(ObjectStarts, lgth)),
     194                              ('ArrayStarts', bitutil.bitstream2string(ArrayStarts, lgth)),
     195                              ('StringStarts', bitutil.bitstream2string(StringStarts, lgth)),
     196                              ('NumberStarts', bitutil.bitstream2string(NumberStarts, lgth)),
     197                              ('TrueStarts', bitutil.bitstream2string(TrueStarts, lgth)),
     198                              ('FalseStarts', bitutil.bitstream2string(FalseStarts, lgth)),
     199                              ('NullStarts', bitutil.bitstream2string(NullStarts, lgth)),
     200                              ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1))])       
     201        return
     202
    136203
    137204def validate_true_false_null(Lex, EOF_mask):
     
    311378                              ('Errors', bitutil.bitstream2string(Errors, lgth+1))])
    312379
    313 def validate_string(Lex,Ctrl,StringMask,EscapeChars,UnescapedDQuotes, lgth):
     380def validate_string(StringStarts, Lex,Ctrl,StringMask,EscapeChars,UnescapedDQuotes, lgth):
    314381        r"""
    315382        RFC 4627 - JavaScript Object Notation (JSON) 
     
    362429       
    363430        # (3) Validate all strings are terminated with an unescaped "
    364         StringStarts = StringMask &~ bitutil.Advance(StringMask)
    365         StringEnds = bitutil.ScanThru(StringStarts, StringMask)
     431        StringCursor = bitutil.Advance(StringStarts)
     432        StringEnds = bitutil.ScanThru(StringCursor, StringMask)
    366433        Errors |= StringEnds &~ UnescapedDQuotes
     434        StringSpans = StringEnds - StringStarts
    367435       
    368436        if debug:
     
    376444                              ('uScope4', bitutil.bitstream2string(uScope4, lgth)),
    377445                              ('StringNotEscapedChars', bitutil.bitstream2string(StringNotEscapedChars, lgth)),
     446                              ('StringStarts', bitutil.bitstream2string(StringStarts, lgth)),
     447                              ('StringEnds', bitutil.bitstream2string(StringEnds, lgth)),
     448                              ('StringSpans', bitutil.bitstream2string(StringSpans, lgth)),
    378449                              ('Errors', bitutil.bitstream2string(Errors, lgth+1))])     
    379         return Errors
     450        return (Errors, StringSpans)
    380451
    381452def demo_validate_string(u8data):
    382453        r"""
    383         >>> demo_validate_string('"\u abcd" "\u1___" "\u12__" "\u123_"')
    384         Input Data      : "\u abcd" "\u1___" "\u12__" "\u123_"
    385         EscapeChars     : __1_________1________1________1_____
    386         UnescapedDQuotes: 1_______1_1______1_1______1_1______1
    387         ParityMask      : 11111111__1111111__1111111__1111111_
    388         StringMask      : _1111111___111111___111111___111111_
    389         EOF_Mask        : 111111111111111111111111111111111111_
    390         Errors          : ___1__________111_______11________1__
     454        >>> demo_validate_string('{"\u abcd", "\u1___", "\u12__", "\u123_"}')
     455        Input Data      : {"\u abcd", "\u1___", "\u12__", "\u123_"}
     456        EscapeChars     : ___1__________1_________1_________1______
     457        UnescapedDQuotes: _1_______1__1______1__1______1__1______1_
     458        ParityMask      : _11111111___1111111___1111111___1111111__
     459        StringMask      : __1111111____111111____111111____111111__
     460        StringStarts    : _1__________1_________1_________1________
     461        StringSpans     : _11111111___1111111___1111111___1111111__
     462        EOF_Mask        : 11111111111111111111111111111111111111111_
     463        Errors          : ____1___________111________11_________1___
    391464        <BLANKLINE>
    392465        """ 
     
    408481        StringMask = ParityMask & bitutil.Advance(ParityMask)
    409482                               
    410         Errors = validate_string(Lex,Ctrl,StringMask,EscapeChars, UnescapedDQuotes, lgth)
     483        (ObjectStarts, ArrayStarts, StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts) = value_starts(Lex, StringMask, EscapeChars,lgth)                         
     484                               
     485        (Errors, StringSpans) = validate_string(StringStarts, Lex,Ctrl,StringMask,EscapeChars,UnescapedDQuotes,lgth)
    411486       
    412487        bitutil.print_aligned_streams([('Input Data', u8data),
     
    415490                              ('ParityMask', bitutil.bitstream2string(ParityMask, lgth)),
    416491                              ('StringMask', bitutil.bitstream2string(StringMask, lgth)),
    417 #                             ('StringCursorEnd', bitutil.bitstream2string(StringCursorEnd, lgth+1)),
     492                              ('StringStarts', bitutil.bitstream2string(StringStarts, lgth)),
     493                              ('StringSpans', bitutil.bitstream2string(StringSpans, lgth)),
    418494                              ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1)),
    419495                              ('Errors', bitutil.bitstream2string(Errors, lgth+1))])   
     
    421497        return
    422498
    423 def parse_json(u8data):
     499def validate_json(u8data,lgth):
     500               
     501        Errors = 0       
     502               
     503        (bit, EOF_mask) = bitutil.transpose_streams(u8data)
     504       
     505        (u8, Lex, Ctrl) = byteclass.classify_bytes(bit)
     506       
     507        EscapeChars = parse_escape(Lex, EOF_mask)
     508       
     509        UnescapedDQuotes = (Lex.DQuote &~ EscapeChars)
     510       
     511        ParityMask = parallel_prefix_parity(UnescapedDQuotes, lgth) & EOF_mask # TODO - Solve EOF_mask problem
     512        StringMask = ParityMask & bitutil.Advance(ParityMask)   
     513       
     514        (ObjectStarts, ArrayStarts, StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts) = value_starts(Lex, StringMask, EscapeChars,lgth)
     515       
     516        (StringErrors, StringSpans) = validate_string(StringStarts, Lex, Ctrl, StringMask, EscapeChars, UnescapedDQuotes, lgth)
     517       
     518        return (ObjectStarts, ArrayStarts, StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts, StringErrors, StringSpans)
    424519 
    425         # Transpose to parallel bit streams and prepare an EOF mask.
    426         (bit, EOF_mask) = bitutil.transpose_streams(u8data)
    427        
    428         # Classify bytes for UTF-8 processing, whitespace, control and JSON lexical analysis.
    429         (u8, Lex, Ctrl) = byteclass.classify_bytes(bit)
    430        
    431         # Validate UTF-8 multibyte sequences and determine the UTF-8 scope streams.
    432         u8 = u8u16.validate_utf8(u8) 
    433        
    434         # Mark escape characters
    435         escape = parse_escape(Lex, EOF_mask)
    436        
    437         return
     520def demo_validate_json(u8data):
    438521 
    439 def demo_parse_json(u8data):
    440  
    441         global lgth
    442         lgth = len(u8data)
    443        
    444         parse_json(u8data)
    445  
     522        global lgth
     523        lgth = len(u8data)
     524       
     525        (ObjectStarts, ArrayStarts, StringStarts, NumberStarts,TrueStarts, FalseStarts, NullStarts, StringErrors, StringSpans) = validate_json(u8data,lgth)
     526
     527        bitutil.print_aligned_streams([('Input Data', u8data),
     528                              ('ObjectStarts', bitutil.bitstream2string(ObjectStarts, lgth)),
     529                              ('ArrayStarts', bitutil.bitstream2string(ArrayStarts, lgth)),
     530                              ('StringStarts', bitutil.bitstream2string(StringStarts, lgth)),
     531                              ('NumberStarts', bitutil.bitstream2string(NumberStarts, lgth)),
     532                              ('TrueStarts', bitutil.bitstream2string(TrueStarts, lgth)),
     533                              ('FalseStarts', bitutil.bitstream2string(FalseStarts, lgth)),
     534                              ('NullStarts', bitutil.bitstream2string(NullStarts, lgth)),
     535                              ('StringErrors', bitutil.bitstream2string(StringErrors, lgth)),
     536                              ('StringSpans', bitutil.bitstream2string(StringSpans, lgth))])
     537
    446538        return
    447539
     
    457549#       demo_parse_escape(u8data)
    458550#       demo_parallel_prefix_parity(u8data)
     551#       demo_value_starts(u8data)
    459552#       demo_validate_number(u8data)
    460         demo_validate_string(u8data)
    461 #       demo_parse_json(u8data)
     553#       demo_validate_string(u8data)
    462554#       demo_validate_true_false_null(u8data)
     555        demo_validate_json(u8data)
Note: See TracChangeset for help on using the changeset viewer.