Changeset 700 for proto


Ignore:
Timestamp:
Nov 8, 2010, 7:21:17 PM (9 years ago)
Author:
ksherdy
Message:

Update span logic to include all characters in strings, including ".

Location:
proto/JSON
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • proto/JSON/QA/pass/number.json

    r694 r700  
    1 [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]
     1[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
  • proto/JSON/byteclass.py

    r690 r700  
    5656        Ee = 0
    5757        PlusMinus = 0
    58         NumberFollowSet = 0
    5958       
    6059        #String
     
    9089#       l = 0
    9190#       l = 0
    92        
     91
     92        ValueFollowSet = 0
     93        StringFollowSet = 0     
     94
    9395class control_streams ():
    9496        r"""
     
    181183        temp43 = (temp29 | temp15);
    182184        Lex.PlusMinus = (temp25 & temp43);
    183         temp44 = (Lex.Comma | Lex.RCurlyBrace);
    184         Lex.NumberFollowSet = (temp44 | Lex.RSquareBracket);
    185         temp45 = (temp22 &~ temp5);
    186         Lex.DQuote = (temp25 & temp45);
     185        temp44 = (temp22 &~ temp5);
     186        Lex.DQuote = (temp25 & temp44);
    187187        Lex.RSolidus = (temp33 & temp31);
    188188        Lex.u = (temp27 & temp40);
    189         temp46 = (Lex.DQuote | Lex.RSolidus);
    190         temp47 = (temp13 & temp28);
    191         temp48 = (temp25 & temp47);
    192         temp49 = (temp46 | temp48);
    193         temp50 = (temp26 & temp1);
    194         temp51 = (temp50 & temp45);
    195         temp52 = (temp49 | temp51);
    196         temp53 = (temp16 & temp22);
    197         temp54 = (temp50 & temp53);
    198         temp55 = (temp52 | temp54);
    199         temp56 = (temp50 & temp39);
    200         temp57 = (temp55 | temp56);
    201         temp58 = (temp27 & temp45);
    202         temp59 = (temp57 | temp58);
    203         temp60 = (temp27 & temp17);
    204         temp61 = (temp59 | temp60);
    205         Lex.Escape = (temp61 | Lex.u);
    206         temp62 = (temp50 &~ bit[4]);
    207         temp63 = (~temp28);
    208         temp64 = ((bit[5] & temp63)|(~(bit[5]) & temp8));
    209         temp65 = (temp62 & temp64);
    210         temp66 = (Lex.Digit0_9 | temp65);
    211         temp67 = (temp26 &~ temp3);
    212         temp68 = (temp67 &~ bit[4]);
    213         temp69 = (temp68 & temp64);
    214         Lex.HexDigit = (temp66 | temp69);
    215         temp70 = (temp15 | temp23);
    216         temp71 = (temp70 | temp24);
    217         temp72 = (temp71 &~ temp20);
    218         Lex.WS = (temp72 | Ctrl.SP);
     189        temp45 = (Lex.DQuote | Lex.RSolidus);
     190        temp46 = (temp13 & temp28);
     191        temp47 = (temp25 & temp46);
     192        temp48 = (temp45 | temp47);
     193        temp49 = (temp26 & temp1);
     194        temp50 = (temp49 & temp44);
     195        temp51 = (temp48 | temp50);
     196        temp52 = (temp16 & temp22);
     197        temp53 = (temp49 & temp52);
     198        temp54 = (temp51 | temp53);
     199        temp55 = (temp49 & temp39);
     200        temp56 = (temp54 | temp55);
     201        temp57 = (temp27 & temp44);
     202        temp58 = (temp56 | temp57);
     203        temp59 = (temp27 & temp17);
     204        temp60 = (temp58 | temp59);
     205        Lex.Escape = (temp60 | Lex.u);
     206        temp61 = (temp49 &~ bit[4]);
     207        temp62 = (~temp28);
     208        temp63 = ((bit[5] & temp62)|(~(bit[5]) & temp8));
     209        temp64 = (temp61 & temp63);
     210        temp65 = (Lex.Digit0_9 | temp64);
     211        temp66 = (temp26 &~ temp3);
     212        temp67 = (temp66 &~ bit[4]);
     213        temp68 = (temp67 & temp63);
     214        Lex.HexDigit = (temp65 | temp68);
     215        temp69 = (temp15 | temp23);
     216        temp70 = (temp69 | temp24);
     217        temp71 = (temp70 &~ temp20);
     218        Lex.WS = (temp71 | Ctrl.SP);
    219219        Lex.t = (temp27 & temp17);
    220         Lex.r = (temp27 & temp45);
    221         Lex.e = (temp50 & temp40);
    222         Lex.f = (temp50 & temp53);
    223         temp73 = (temp14 &~ temp5);
    224         Lex.a = (temp50 & temp73);
    225         Lex.l = (temp50 & temp31);
    226         temp74 = (temp28 &~ temp5);
    227         Lex.s = (temp27 & temp74);
    228         Lex.n = (temp50 & temp39);
     220        Lex.r = (temp27 & temp44);
     221        Lex.e = (temp49 & temp40);
     222        Lex.f = (temp49 & temp52);
     223        temp72 = (temp14 &~ temp5);
     224        Lex.a = (temp49 & temp72);
     225        Lex.l = (temp49 & temp31);
     226        temp73 = (temp28 &~ temp5);
     227        Lex.s = (temp27 & temp73);
     228        Lex.n = (temp49 & temp39);
     229        temp74 = (Lex.Comma | Lex.RCurlyBrace);
     230        Lex.ValueFollowSet = (temp74 | Lex.RSquareBracket);
     231        Lex.StringFollowSet = (Lex.ValueFollowSet | Lex.Colon);
    229232        return (u8,Lex,Ctrl)
  • proto/JSON/json_prototype.py

    r698 r700  
    2424filename = "json_prototype.py"
    2525
    26 # NOTE
    27 #
    28 # Spans - Do not include the final character.
    29 #
    30 
    31 
    3226# Globals
    3327#
     
    149143       
    150144        StringSyncPointFollows = bitutil.Advance(StringSyncPoint)
    151         StringStarts = (StringSyncPointFollows | bitutil.ScanThru(StringSyncPointFollows,Lex.WS)) & (Lex.DQuote &~ ValueStartsMask)
     145        StringStarts = (StringSyncPointFollows | bitutil.ScanThru(StringSyncPointFollows, Lex.WS)) & (Lex.DQuote &~ ValueStartsMask)
    152146
    153147        NonStringSyncPointFollows = bitutil.Advance(NonStringSyncPoint)
     
    231225 
    232226
    233 def validate_number(Lex, EOF_mask):
     227def validate_number(NumberStarts, Lex, EOF_mask):
    234228        r"""   
    235229        RFC 4627 - JavaScript Object Notation (JSON) 
     
    248242        """     
    249243        Errors = 0
    250         M0 = 0                                                  # Initialize marker stream     
    251        
    252         # WARNING - A hack to set initial cursor positions.
    253         ColonCommaLSquareBracket = 0
    254         ColonCommaLSquareBracket = Lex.Colon | Lex.Comma | Lex.LSquareBracket
    255         AfterColonCommaLSquareBracket = bitutil.Advance(ColonCommaLSquareBracket)
    256         M0 = bitutil.ScanThru(AfterColonCommaLSquareBracket, Lex.WS)
     244        M0 = NumberStarts                                       # Initialize marker stream     
    257245       
    258246        M1 = bitutil.ScanThru(M0, Lex.Minus & M0)               # ? Optional character class [-]
     
    274262       
    275263        M7a = M7 &~(Lex.Ee)                                     # Split
    276         # NOTE - Number Follow Set logic is to be handled at a higher level     
    277         E7a = M7a &~(Lex.NumberFollowSet)
     264        # NOTE - Number Follow Set logic occurs at the final step after the final cursor join
     265        # E7a = M7a &~(Lex.NumberFollowSet)
    278266        M7b = M7 &(Lex.Ee)
    279267        M8b = bitutil.Advance(M7b)
     
    281269        E9b  = M9b &~(Lex.Digit0_9)                             # + [0-9]+
    282270        M10b = bitutil.ScanThru(M9b,Lex.Digit0_9)
    283         # NOTE - Number Follow Set logic is to be handled at a higher level
     271        # NOTE - Number Follow Set logic occurs at the final step after the final cursor join
    284272        # E10b = M10b &~(Lex.NumberFollowSet)
    285273        M11 = M7a | M10b                                        # Join
    286        
    287         # NOTE - Number Follow Set logic is to be handled at a higher level
    288         FollowSetErrors = M11 &~ Lex.NumberFollowSet
    289        
    290         Errors = E1 | E5b | E9b | FollowSetErrors # E7a | E10b
     274
     275        ValueFollowSetErrors = M11 &~ (Lex.ValueFollowSet | ~EOF_mask)
     276       
     277        Errors = E1 | E5b | E9b | ValueFollowSetErrors # E7a | E10b
     278       
     279        NumberSpans = M11 - NumberStarts
    291280       
    292281        if debug:
     
    307296                              ('M7', bitutil.bitstream2string(M7, lgth)),
    308297                              ('M7a', bitutil.bitstream2string(M7a, lgth)),
    309                               #('E7a', bitutil.bitstream2string(E7a, lgth+1)),                                               
     298                              #('E7a', bitutil.bitstream2string(E7a, lgth+1)),       
    310299                              ('M7b', bitutil.bitstream2string(M7b, lgth)),
    311300                              ('M8b', bitutil.bitstream2string(M8b, lgth)),
     
    315304                              #('E10b', bitutil.bitstream2string(E10b, lgth)),
    316305                              ('M11', bitutil.bitstream2string(M11, lgth)),
    317                               ('FollowSetErrors', bitutil.bitstream2string(FollowSetErrors, lgth+1)),                         
     306                              ('NumberStarts', bitutil.bitstream2string(NumberStarts, lgth)),
     307                              ('NumberSpans', bitutil.bitstream2string(NumberSpans, lgth)),
    318308                              ('Errors', bitutil.bitstream2string(Errors, lgth+1))])           
    319         return Errors
     309       
     310        return (Errors, NumberSpans)
    320311
    321312def demo_validate_number(u8data):
     
    330321        Ee          : _______________________1____1______________________1_______________
    331322        PlusMinus   : _1_11_1_____1___1___1____1_______1_______1______1_____1____________
     323        NumberSpans : _11_11_11__111_1111_1111_1111_1_111111111__11111__1111__1_________1
     324        Errors      : __1_1__1__1___1____1___11___11_1_________1______1_____1__1__________
    332325        EOF_Mask    : 1111111111111111111111111111111111111111111111111111111111111111111_
    333         Errors      : __1_1__1__1___1____1___11___11_1_________1______1_____1__1__________
    334326        <BLANKLINE>
    335327
     
    343335        Ee          : ______________________1_____1___1____1____1_____1_______________________________________1_______________1_______________1___
    344336        PlusMinus   : _________________________________1_________1_____1______________1________________________1_______________1__________________
     337        NumberSpans : _111_1111_11111_1111_111_11111_1111_1111_11111_11111_1111111111_111111111111_111111111111111_111111111111111_11111111111111_
     338        Errors      : _____________________________________________________________________________________________________________________________
    345339        EOF_Mask    : 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111_
    346         Errors      : _____________________________________________________________________________________________________________________________
    347340        <BLANKLINE>
    348341
     
    356349        Ee          : __________________________
    357350        PlusMinus   : ___________________1__1___
     351        NumberSpans : _1_____111111_1_1_111_11_1
     352        Errors      : __1______________1______1__
    358353        EOF_Mask    : 11111111111111111111111111_
    359         Errors      : __1______________1______1__
    360354        <BLANKLINE>
    361355        """ 
     356       
    362357        global lgth
    363358        lgth = len(u8data)
     
    365360        (bit, EOF_mask) = bitutil.transpose_streams(u8data)
    366361        (u8, Lex, Ctrl) = byteclass.classify_bytes(bit)
    367         Errors = validate_number(Lex,EOF_mask)
     362       
     363        EscapeChars = parse_escape(Lex, EOF_mask)
     364        UnescapedDQuotes = (Lex.DQuote &~ EscapeChars)
     365       
     366        ParityMask = parallel_prefix_parity(UnescapedDQuotes, lgth) & EOF_mask
     367        StringMask = ParityMask & bitutil.Advance(ParityMask)   
     368       
     369        (ObjectStarts, ArrayStarts, StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts) = value_starts(Lex, StringMask, EscapeChars,lgth) 
     370       
     371        (Errors, NumberSpans) = validate_number(NumberStarts, Lex, EOF_mask)
    368372
    369373        bitutil.print_aligned_streams([('Input Data', u8data),
     
    375379                              ('Ee', bitutil.bitstream2string(Lex.Ee, lgth)),
    376380                              ('PlusMinus', bitutil.bitstream2string(Lex.PlusMinus, lgth)),
    377                               ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1)),
    378                               ('Errors', bitutil.bitstream2string(Errors, lgth+1))])
     381                              ('NumberSpans', bitutil.bitstream2string(NumberSpans, lgth)),
     382                              ('Errors', bitutil.bitstream2string(Errors, lgth+1)),
     383                              ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1))])
    379384
    380385def validate_string(StringStarts, Lex,Ctrl,StringMask,EscapeChars,UnescapedDQuotes, lgth):
     
    423428        # (2.1) StringMask construction ensures all '"' are escaped.
    424429        # (2.2) '\' are either correctly escaped or the character following an odd length run is escaped.
    425         # (2.3) validate_utf8(u8) ensures valid UTF8 encodings in the code point range U+0000 - U+01FFFF. TODO
     430        # (2.3) validate_utf8(u8) ensures valid UTF8 encodings in the code point range U+0000 - U+01FFFF. TODO - Validate this final large.
    426431
    427432        StringNotEscapedChars = (~(EscapeChars | Lex.RSolidus)) & StringMask # TODO - Verify logic.
     
    432437        StringEnds = bitutil.ScanThru(StringCursor, StringMask)
    433438        Errors |= StringEnds &~ UnescapedDQuotes
    434         StringSpans = StringEnds - StringStarts
     439        StringSpans = (StringEnds - StringStarts) | StringEnds
    435440       
    436441        if debug:
     
    459464        StringMask      : __1111111____111111____111111____111111__
    460465        StringStarts    : _1__________1_________1_________1________
    461         StringSpans     : _11111111___1111111___1111111___1111111__
     466        StringSpans     : _111111111__11111111__11111111__11111111_
     467        Errors          : ____1___________111________11_________1___
    462468        EOF_Mask        : 11111111111111111111111111111111111111111_
    463         Errors          : ____1___________111________11_________1___
    464469        <BLANKLINE>
    465470        """ 
     
    470475        (u8, Lex, Ctrl) = byteclass.classify_bytes(bit)
    471476       
    472         # Construct string interior mask (1),(2),(3)
     477        # Construct string interiors mask (1),(2),(3)
    473478        # (1) Mark all escaped characters
    474479        EscapeChars = parse_escape(Lex, EOF_mask)
     
    477482        UnescapedDQuotes = (Lex.DQuote &~ EscapeChars)
    478483       
    479         # (3) Construct mask
    480         ParityMask = parallel_prefix_parity(UnescapedDQuotes, lgth) & EOF_mask # TODO - Solve EOF_mask problem
     484        # (3) Construct string interiors mask
     485        ParityMask = parallel_prefix_parity(UnescapedDQuotes, lgth) & EOF_mask # TODO - Solve parity EOF_mask problem
    481486        StringMask = ParityMask & bitutil.Advance(ParityMask)
    482487                               
     
    492497                              ('StringStarts', bitutil.bitstream2string(StringStarts, lgth)),
    493498                              ('StringSpans', bitutil.bitstream2string(StringSpans, lgth)),
    494                               ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1)),
    495                               ('Errors', bitutil.bitstream2string(Errors, lgth+1))])   
     499                              ('Errors', bitutil.bitstream2string(Errors, lgth+1)),
     500                              ('EOF_Mask', bitutil.bitstream2string(EOF_mask, lgth+1))])       
    496501                             
    497502        return
     
    506511       
    507512        EscapeChars = parse_escape(Lex, EOF_mask)
    508        
    509513        UnescapedDQuotes = (Lex.DQuote &~ EscapeChars)
    510        
    511         ParityMask = parallel_prefix_parity(UnescapedDQuotes, lgth) & EOF_mask # TODO - Solve EOF_mask problem
     514        ParityMask = parallel_prefix_parity(UnescapedDQuotes, lgth) & EOF_mask # TODO - Solve parity EOF_mask problem
    512515        StringMask = ParityMask & bitutil.Advance(ParityMask)   
    513516       
     
    550553#       demo_parallel_prefix_parity(u8data)
    551554#       demo_value_starts(u8data)
    552 #       demo_validate_number(u8data)
    553 #       demo_validate_string(u8data)
     555        demo_validate_number(u8data)
     556#       demo_validate_string(u8data)
    554557#       demo_validate_true_false_null(u8data)
    555         demo_validate_json(u8data)
     558#       demo_validate_json(u8data)
Note: See TracChangeset for help on using the changeset viewer.