Ignore:
Timestamp:
Nov 8, 2010, 12:36:07 PM (9 years ago)
Author:
ksherdy
Message:

Minor milestones.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/JSON/json_prototype.py

    r687 r690  
    116116        global lgth
    117117        lgth = len(u8data)
    118 
     118       
    119119        (bit, EOF_mask) = bitutil.transpose_streams(u8data)
    120120        (u8, Lex, Ctrl) = byteclass.classify_bytes(bit)
    121121        Parity = parallel_prefix_parity(Lex.DQuote,lgth)
    122 
     122       
    123123        bitutil.print_aligned_streams([('Input Data', u8data),
    124124                              ('Lex.DQuote', bitutil.bitstream2string(Lex.DQuote, lgth)),
     
    127127        return
    128128
     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, )
     136
     137def validate_true_false_null(Lex, EOF_mask):
     138        r"""
     139        RFC 4627 - JavaScript Object Notation (JSON) 
     140
     141        true  = %x74.72.75.65      ; true
     142        false = %x66.61.6c.73.65   ; false
     143        null  = %x6e.75.6c.6c      ; null
     144       
     145        global lgth
     146        lgth = len(u8data)
     147        """
     148        Errors = 0
     149       
     150        return Errors
     151 
     152def demo_true_false_null(u8date):
     153        global lgth
     154        lgth = len(u8data)
     155               
     156        (bit, EOF_mask) = bitutil.transpose_streams(u8data)
     157        (u8, Lex, Ctrl) = byteclass.classify_bytes(bit)
     158        Errors = validate_true_false_null(Lex, EOF_mask)
     159       
     160        bitutil.print_aligned_streams([('Input Data', u8data),
     161                              ('Errors', bitutil.bitstream2string(Errors, lgth)),
     162                              ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1))])       
     163        return
     164 
    129165
    130166def validate_number(Lex, EOF_mask):
     
    145181        """     
    146182        Errors = 0
    147         M0 = 0                                                  # Assume the cursor is at the first Minus, Zero, or Digit_1_9 character
    148         M0 = bitutil.Advance(Lex.Comma)                         # WARNING - A hack to set initial cursor postions and ease testing. The 'lexical' FIRST SET for the JSON number production is {-,0,1,..,9} .     
    149 
     183        M0 = 0                                                  # Initialize marker stream     
     184       
     185        # WARNING - A hack to set initial cursor positions.
     186        ColonCommaLSquareBracket = 0
     187        ColonCommaLSquareBracket = Lex.Colon | Lex.Comma | Lex.LSquareBracket
     188        AfterColonCommaLSquareBracket = bitutil.Advance(ColonCommaLSquareBracket)
     189        M0 = bitutil.ScanThru(AfterColonCommaLSquareBracket, Lex.WS)
     190       
    150191        M1 = bitutil.ScanThru(M0, Lex.Minus & M0)               # ? Optional character class [-]
    151192        E1 = M1 &~(Lex.Zero|Lex.Digit1_9)
     
    166207       
    167208        M7a = M7 &~(Lex.Ee)                                     # Split
     209        # NOTE - Number Follow Set logic is to be handled at a higher level     
    168210        E7a = M7a &~(Lex.NumberFollowSet)
    169211        M7b = M7 &(Lex.Ee)
     
    172214        E9b  = M9b &~(Lex.Digit0_9)                             # + [0-9]+
    173215        M10b = bitutil.ScanThru(M9b,Lex.Digit0_9)
    174         E10b = M10b &~(Lex.NumberFollowSet)
     216        # NOTE - Number Follow Set logic is to be handled at a higher level
     217        # E10b = M10b &~(Lex.NumberFollowSet)
    175218        M11 = M7a | M10b                                        # Join
    176219       
    177         Errors = E1 | E5b | E7a | E9b | E10b
     220        # NOTE - Number Follow Set logic is to be handled at a higher level
     221        FollowSetErrors = M11 &~ Lex.NumberFollowSet
     222       
     223        Errors = E1 | E5b | E9b | FollowSetErrors # E7a | E10b
    178224       
    179225        if debug:
     
    181227                              ('M0', bitutil.bitstream2string(M0, lgth)),
    182228                              ('M1', bitutil.bitstream2string(M1, lgth)),
    183                               ('E1', bitutil.bitstream2string(E1, lgth)),
     229                              ('E1', bitutil.bitstream2string(E1, lgth+1)),
    184230                              ('M1a', bitutil.bitstream2string(M1a, lgth)),
    185231                              ('M2a', bitutil.bitstream2string(M2a, lgth)),
     
    190236                              ('M4b', bitutil.bitstream2string(M4b, lgth)),
    191237                              ('M5b', bitutil.bitstream2string(M5b, lgth)),
    192                               ('E5b', bitutil.bitstream2string(E5b, lgth)),           
     238                              ('E5b', bitutil.bitstream2string(E5b, lgth+1)),         
    193239                              ('M6', bitutil.bitstream2string(M6, lgth)),
    194240                              ('M7', bitutil.bitstream2string(M7, lgth)),
    195241                              ('M7a', bitutil.bitstream2string(M7a, lgth)),
    196                               ('E7a', bitutil.bitstream2string(E7a, lgth)),                                                   
     242                              #('E7a', bitutil.bitstream2string(E7a, lgth+1)),                                               
    197243                              ('M7b', bitutil.bitstream2string(M7b, lgth)),
    198244                              ('M8b', bitutil.bitstream2string(M8b, lgth)),
    199245                              ('M9b', bitutil.bitstream2string(M9b, lgth)),           
    200                               ('E9b', bitutil.bitstream2string(E9b, lgth)),           
    201                               ('M10b', bitutil.bitstream2string(M10b, lgth)),                         
    202                               ('M11', bitutil.bitstream2string(M11, lgth)),                                                   
     246                              ('E9b', bitutil.bitstream2string(E9b, lgth+1)),         
     247                              ('M10b', bitutil.bitstream2string(M10b, lgth)),
     248                              #('E10b', bitutil.bitstream2string(E10b, lgth)),
     249                              ('M11', bitutil.bitstream2string(M11, lgth)),
     250                              ('FollowSetErrors', bitutil.bitstream2string(FollowSetErrors, lgth+1)),                         
    203251                              ('Errors', bitutil.bitstream2string(Errors, lgth+1))])           
    204252        return Errors
     
    206254def demo_validate_number(u8data):
    207255        r"""
    208         >>> demo_validate_number(',-,--,-a,00,-00,-0.,-0.e,-0.E,00,-123.456-,0.456+,0e10+,0123456789,')
    209         Input Data  : ,-,--,-a,00,-00,-0.,-0.e,-0.E,00,-123.456-,0.456+,0e10+,0123456789,
     256        >>> demo_validate_number('[-,--,-a,00,-00,-0.,-0.e,-0.E,00,-123.456-,0.456+,0e10+,0123456789]')
     257        Input Data  : [-,--,-a,00,-00,-0.,-0.e,-0.E,00,-123.456-,0.456+,0e10+,0123456789]
    210258        Minus       : _1_11_1_____1___1___1____1_______1_______1_________________________
    211259        Zero        : _________11__11__1___1____1___11___________1______1__1__1__________
     
    216264        PlusMinus   : _1_11_1_____1___1___1____1_______1_______1______1_____1____________
    217265        EOF_Mask    : 1111111111111111111111111111111111111111111111111111111111111111111_
    218         Errors      : __1_1__1__1___1____1___1____1__1_________1______1_____1__1_________
     266        Errors      : __1_1__1__1___1____1___11___11_1_________1______1_____1__1__________
    219267        <BLANKLINE>
    220         """
    221         r"""
    222         >>> demo_validate_number(',-,--,-a,00,-00,-0.,-0.e,-0.E,00,-123.456-,0.456+,0e10+,0123456789,')
    223         Input Data  : ,0.5,98.6,99.44,1066,1e1,0.1e1,1e-1,1e00,2e+00,2e-00,1234567890,-9876.543210,0.123456789e-12,1.234567890E+34,23456789012E66,
     268
     269        >>> demo_validate_number('[0.5,98.6,99.44,1066,1e1,0.1e1,1e-1,1e00,2e+00,2e-00,1234567890,-9876.543210,0.123456789e-12,1.234567890E+34,23456789012E66]')
     270        Input Data  : [0.5,98.6,99.44,1066,1e1,0.1e1,1e-1,1e00,2e+00,2e-00,1234567890,-9876.543210,0.123456789e-12,1.234567890E+34,23456789012E66]
    224271        Minus       : _________________________________1_______________1______________1________________________1__________________________________
    225272        Zero        : _1_______________1_______1____________11____11____11__________1____________1_1_________________________1_____________1______
    226273        Digit1_9    : ___1_11_1_11_11_1_11_1_1___1_1_1__1_1____1_____1_____111111111___1111_11111____111111111__11_1_11111111___11_11111111_11_11_
    227         Digit0_9    : ___1_11_1_11_11_1_11_1_1___1_1_1__1_1____1_____1_____111111111___1111_11111____111111111__11_1_11111111___11_11111111_11_11_
     274        Digit0_9    : _1_1_11_1_11_11_1111_1_1_1_1_1_1__1_1_11_1__11_1__11_1111111111__1111_111111_1_111111111__11_1_111111111__11_11111111111_11_
    228275        DecimalPoint: __1____1____1_____________1__________________________________________1________1_______________1_____________________________
    229276        Ee          : ______________________1_____1___1____1____1_____1_______________________________________1_______________1_______________1___
    230277        PlusMinus   : _________________________________1_________1_____1______________1________________________1_______________1__________________
    231278        EOF_Mask    : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111_
    232         Errors      : ____________________________________________________________________________________________________________________________
     279        Errors      : _____________________________________________________________________________________________________________________________
    233280        <BLANKLINE>
    234         """
    235         r"""
    236         >>> demo_validate_number(',012345,12345,0,00,-0,-00')
    237         Input Data  : ,012345,12345,0,00,-0,-00
    238         Minus       : ___________________1__1__
    239         Zero        : _1____________1_11__1__11
    240         Digit1_9    : __11111_11111____________
    241         Digit0_9    : __11111_11111____________
    242         DecimalPoint: _________________________
    243         Ee          : _________________________
    244         PlusMinus   : ___________________1__1__
    245         EOF_Mask    : 1111111111111111111111111_
    246         Errors      : __1______________1______1
     281
     282        >>> demo_validate_number('[012345,12345,0,00,-0,-00]')
     283        Input Data  : [012345,12345,0,00,-0,-00]
     284        Minus       : ___________________1__1___
     285        Zero        : _1____________1_11__1__11_
     286        Digit1_9    : __11111_11111_____________
     287        Digit0_9    : _111111_11111_1_11__1__11_
     288        DecimalPoint: __________________________
     289        Ee          : __________________________
     290        PlusMinus   : ___________________1__1___
     291        EOF_Mask    : 11111111111111111111111111_
     292        Errors      : __1______________1______1__
    247293        <BLANKLINE>
    248294        """ 
     
    265311                              ('Errors', bitutil.bitstream2string(Errors, lgth+1))])
    266312
    267 def validate_string(Lex,Ctrl,StringMask,EscapeChars,EOF_mask,lgth):
     313def validate_string(Lex,Ctrl,StringMask,EscapeChars,UnescapedDQuotes, lgth):
    268314        r"""
    269315        RFC 4627 - JavaScript Object Notation (JSON) 
     
    314360        StringNotEscapedChars = (~(EscapeChars | Lex.RSolidus)) & StringMask # TODO - Verify logic.
    315361        Errors |= (StringNotEscapedChars & Ctrl.x00_x1F)
    316                
     362       
     363        # (3) Validate all strings are terminated with an unescaped "
     364        StringStarts = StringMask &~ bitutil.Advance(StringMask)
     365        StringEnds = bitutil.ScanThru(StringStarts, StringMask)
     366        Errors |= StringEnds &~ UnescapedDQuotes
     367       
    317368        if debug:
    318369                bitutil.print_aligned_streams([('Input Data', u8data),
     
    336387        ParityMask      : 11111111__1111111__1111111__1111111_
    337388        StringMask      : _1111111___111111___111111___111111_
    338         StringCursorEnd : ________1________1________1________1_
    339389        EOF_Mask        : 111111111111111111111111111111111111_
    340390        Errors          : ___1__________111_______11________1__
     
    358408        StringMask = ParityMask & bitutil.Advance(ParityMask)
    359409                               
    360         Errors = validate_string(Lex,Ctrl,StringMask,EscapeChars,EOF_mask,lgth)
    361        
    362         # Validate all strings are terminated with an unescaped "
    363         StringCursor = ParityMask &~ bitutil.Advance(ParityMask)
    364         StringCursorEnd = bitutil.ScanThru(StringCursor, ParityMask)
    365         Errors |= StringCursorEnd &~ EOF_mask
    366 
     410        Errors = validate_string(Lex,Ctrl,StringMask,EscapeChars, UnescapedDQuotes, lgth)
     411       
    367412        bitutil.print_aligned_streams([('Input Data', u8data),
    368413                              ('EscapeChars', bitutil.bitstream2string(EscapeChars, lgth)),
     
    370415                              ('ParityMask', bitutil.bitstream2string(ParityMask, lgth)),
    371416                              ('StringMask', bitutil.bitstream2string(StringMask, lgth)),
    372                               ('StringCursorEnd', bitutil.bitstream2string(StringCursorEnd, lgth+1)),
     417#                             ('StringCursorEnd', bitutil.bitstream2string(StringCursorEnd, lgth+1)),
    373418                              ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1)),
    374419                              ('Errors', bitutil.bitstream2string(Errors, lgth+1))])   
     
    405450        doctest.testmod()
    406451
    407         if len(sys.argv) < 1:
    408                 sys.stderr.write("Usage: " + filename + "\n")
     452        if len(sys.argv) < 2:
     453                sys.stderr.write("Usage: python " + filename + " <filename>" "\n")
    409454                sys.exit(2)
    410455
     
    412457#       demo_parse_escape(u8data)
    413458#       demo_parallel_prefix_parity(u8data)
    414         demo_validate_number(u8data)
    415 #       demo_validate_string(u8data)
     459#       demo_validate_number(u8data)
     460        demo_validate_string(u8data)
    416461#       demo_parse_json(u8data)
     462#       demo_validate_true_false_null(u8data)
Note: See TracChangeset for help on using the changeset viewer.