Ignore:
Timestamp:
Nov 19, 2010, 5:26:42 PM (9 years ago)
Author:
ksherdy
Message:

Update character set defs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/JSON/json_prototype.py

    r713 r714  
    2121import sys
    2222
    23 debug = True
     23debug = False
    2424filename = "json_prototype.py"
    2525
     
    133133        return
    134134
    135 
    136 #TODO - Review this function.
    137 def atom_starts(Lex,StringMask,EscapeChars):
     135def atom_starts(Lex,StringSpans):
    138136        r"""
    139137        This function returns multi-cursor start positions for each JSON value type.
    140138       
    141139        Define JSON atoms as 'String', 'Number', 'true', 'false', and 'null' types.
    142         """
    143         global lgth
    144         StringEscapeCharMask = (StringMask | EscapeChars)               
    145        
    146         ObjectStarts = Lex.LCurlyBrace &~ StringEscapeCharMask
    147         ArrayStarts = Lex.LSquareBracket &~ StringEscapeCharMask
     140       
     141        Error cases are postponed for the post-processing stage as expect() cases in
     142        a recursive descent parser.
     143        """
     144        global lgth
     145       
     146        AtomSpans = (Lex.True | Lex.False | Lex.Null | Lex.Number | StringSpans)
     147        AtomStarts = AtomSpans &~ bitutil.Advance(AtomSpans)
    148148               
    149         Comma = Lex.Comma &~ StringEscapeCharMask
    150         Colon = Lex.Colon &~ StringEscapeCharMask
    151        
    152         NonStringSyncPoint = (ArrayStarts | Comma | Colon)
    153         StringSyncPoint = (ObjectStarts | NonStringSyncPoint)
    154        
    155         StringSyncPointFollows = bitutil.Advance(StringSyncPoint)
    156         StringStarts = (StringSyncPointFollows | bitutil.ScanThru(StringSyncPointFollows, Lex.WS)) & (Lex.DQuote &~ StringEscapeCharMask)
    157 
    158         NonStringSyncPointFollows = bitutil.Advance(NonStringSyncPoint)
    159         ValueCursors = (StringSyncPointFollows | bitutil.ScanThru(StringSyncPointFollows,Lex.WS))
    160        
    161         NumberStarts = ValueCursors & ((Lex.Minus|Lex.Digit0_9) &~ StringEscapeCharMask)
    162         TrueStarts = ValueCursors & (Lex.t &~ StringEscapeCharMask)
    163         FalseStarts = ValueCursors & (Lex.f &~ StringEscapeCharMask)
    164         NullStarts = ValueCursors & (Lex.n &~ StringEscapeCharMask)
    165         ValueStarts = ValueCursors & (Lex.ValueStartsSet &~ StringEscapeCharMask)
     149        StringStarts = AtomStarts & (Lex.DQuote)       
     150        NumberStarts = AtomStarts & (Lex.Minus|Lex.Digit0_9)
     151        TrueStarts = AtomStarts & (Lex.t)
     152        FalseStarts = AtomStarts & (Lex.f)
     153        NullStarts = AtomStarts & (Lex.n)
    166154
    167155        if debug:
    168156                bitutil.print_aligned_streams([('Input Data', u8data),
    169                               ('StringEscapeCharMask', bitutil.bitstream2string(StringEscapeCharMask, lgth)),
    170                               ('ObjectStarts', bitutil.bitstream2string(ObjectStarts, lgth)),
    171                               ('ArrayStarts', bitutil.bitstream2string(ArrayStarts, lgth))])
    172        
    173         return (StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts, ValueStarts)
     157                              ('AtomSpans', bitutil.bitstream2string(AtomSpans, lgth)),
     158                              ('AtomStarts', bitutil.bitstream2string(AtomStarts, lgth)),
     159                              ('StringSpans', bitutil.bitstream2string(StringSpans, lgth)),
     160                              ('StringStarts', bitutil.bitstream2string(StringStarts, lgth)),
     161                              ('Lex.True', bitutil.bitstream2string(Lex.True, lgth)),
     162                              ('TrueStarts', bitutil.bitstream2string(TrueStarts, lgth)),
     163                              ('Lex.False', bitutil.bitstream2string(Lex.False, lgth)),
     164                              ('FalseStarts', bitutil.bitstream2string(FalseStarts, lgth)),
     165                              ('Lex.Null', bitutil.bitstream2string(Lex.Null, lgth)),
     166                              ('NullStarts', bitutil.bitstream2string(NullStarts, lgth)),
     167                              ('Lex.Number', bitutil.bitstream2string(Lex.Number, lgth)),
     168                              ('NumberStarts', bitutil.bitstream2string(NumberStarts, lgth))])
     169
     170        return (StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts)
    174171
    175172
     
    187184        ParityMask = parallel_prefix_parity(UnescapedDQuotes) & EOF_mask # TODO - Solve EOF_mask problem
    188185        StringMask = ParityMask & bitutil.Advance(ParityMask)   
    189        
    190         (StringStarts, NumberStarts,TrueStarts, FalseStarts, NullStarts, ValueStarts) = atom_starts(Lex, StringMask, EscapeChars)
     186        StringSpans = StringMask | UnescapedDQuotes
     187       
     188        (StringStarts, NumberStarts,TrueStarts, FalseStarts, NullStarts) = atom_starts(Lex, StringSpans)
    191189        bitutil.print_aligned_streams([('Input Data', u8data),
    192190                              ('StringStarts', bitutil.bitstream2string(StringStarts, lgth)),
     
    286284       
    287285        Errors = 0
    288         M0 = Starts                                     # Initialize marker stream     
     286        M0 = Starts                                             # Initialize marker stream     
    289287       
    290288        M1 = bitutil.ScanThru(M0, Lex.Minus & M0)               # ? Optional character class [-]
    291289        E1 = M1 &~(Lex.Zero|Lex.Digit1_9)
     290        M1 = M1 &~ E1                                           # Remove cursors at error positions so as to report a single error position
    292291
    293292        M1a = M1 & Lex.Zero                                     # Split
    294         M1b = M1 & Lex.Digit0_9                         
     293        M1b = M1 & Lex.Digit1_9                         
    295294        M2a = bitutil.Advance(M1a)
    296295        M2b = bitutil.Advance(M1b)
    297296        M3b = bitutil.ScanThru(M2b,Lex.Digit0_9)
    298         M4 = M2a | M3b                                          # Join
     297        M4 =  M2a | M3b                                         # Join
    299298       
    300299        M4a = M4 &~(Lex.DecimalPoint)                           # Split
     
    302301        M5b = bitutil.Advance(M4b)
    303302        E5b = M5b &~(Lex.Digit0_9)                              # + [0-9]+
     303        M5b = M5b &~E5b                                         # Remove cursors at error positions so as to report a single error position
     304       
    304305        M6 = bitutil.ScanThru(M5b,Lex.Digit0_9)
    305306        M7 = M4a | M6                                           # Join
    306307       
    307308        M7a = M7 &~(Lex.Ee)                                     # Split
    308         # NOTE - Number Follow Set logic occurs at the final step after the final cursor join
    309         # E7a = M7a &~(Lex.NumberFollowSet)
    310309        M7b = M7 &(Lex.Ee)
    311310        M8b = bitutil.Advance(M7b)
    312311        M9b = bitutil.ScanThru(M8b, Lex.PlusMinus & M8b)        # ? Optional character class [+-]               
    313312        E9b  = M9b &~(Lex.Digit0_9)                             # + [0-9]+
     313        M9b = M9b &~ E9b                                        # Remove cursors at error positions so as to report a single error position
    314314        M10b = bitutil.ScanThru(M9b,Lex.Digit0_9)
    315         # NOTE - Number Follow Set logic occurs at the final step after the final cursor join
    316         # E10b = M10b &~(Lex.NumberFollowSet)
    317         M11 = M7a | M10b                                        # Join
    318 
    319         ValueFollowSetErrors = M11 &~ (Lex.ValueFollowsSet | Lex.WS)
    320         ValueFollowSetErrors |= M11 &~ EOF_mask
    321        
    322         Errors = E1 | E5b | E9b | ValueFollowSetErrors # E7a | E10b
     315
     316        M11 = M7a | M10b                                       
     317       
     318        # NOTE - Number Follow Set logic occurs at the final step after the final cursor join   
     319        NumberFollowErrors = (M7a | M10b) &~(Lex.RSquareBracket | Lex.RCurlyBrace | Lex.Comma | Lex.WS)
     320       
     321        Errors = E1 | E5b | E9b | NumberFollowErrors
    323322       
    324323        NumberSpans = M11 - Starts
     
    348347                              ('M10b', bitutil.bitstream2string(M10b, lgth)),
    349348                              #('E10b', bitutil.bitstream2string(E10b, lgth)),
    350                               ('M11', bitutil.bitstream2string(M11, lgth)),
     349                              ('M11', bitutil.bitstream2string(M11, lgth+1)),
    351350                              ('Starts', bitutil.bitstream2string(Starts, lgth)),
    352351                              ('NumberSpans', bitutil.bitstream2string(NumberSpans, lgth)),
     
    366365        Ee          : _______________________1____1______________________1_______________
    367366        PlusMinus   : _1_11_1_____1___1___1____1_______1_______1______1_____1____________
    368         NumberSpans : _11_11_11__111_1111_1111_1111_1_111111111__11111__1111__1_________1
    369         Errors      : __1_1__1__1___1____1___11___11_1_________1______1_____1__1__________
     367        NumberSpans : _11_11_11___11__1111_1111_1111___11111111__11111__1111__1__________
     368        Errors      : __1_1__1__1___1____1___1____1__1_________1______1_____1__1__________
    370369        EOF_Mask    : 1111111111111111111111111111111111111111111111111111111111111111111_
    371370        <BLANKLINE>
     
    394393        Ee          : __________________________
    395394        PlusMinus   : ___________________1__1___
    396         NumberSpans : _1_____111111_1_1_111_11_1
     395        NumberSpans : _1______11111_1_1__11_11__
    397396        Errors      : __1______________1______1__
    398397        EOF_Mask    : 11111111111111111111111111_
     
    410409        ParityMask = parallel_prefix_parity(UnescapedDQuotes) & EOF_mask
    411410        StringMask = ParityMask & bitutil.Advance(ParityMask)   
    412        
    413         (StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts, ValueStarts) = atom_starts(Lex, StringMask, EscapeChars)     
     411        StringSpans = StringMask | UnescapedDQuotes
     412       
     413        (StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts) = atom_starts(Lex, StringSpans)       
    414414       
    415415        (Errors, NumberSpans) = validate_number(NumberStarts, Lex, EOF_mask)
     
    530530        ParityMask = parallel_prefix_parity(UnescapedDQuotes) & EOF_mask # TODO - Solve parity EOF_mask problem
    531531        StringMask = ParityMask & bitutil.Advance(ParityMask)
    532 
    533         (StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts, ValueStarts) = atom_starts(Lex, StringMask, EscapeChars)                             
     532        StringSpans = StringMask | UnescapedDQuotes
     533
     534        (StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts) = atom_starts(Lex, StringSpans)                               
    534535       
    535536        (Errors, StringSpans) = validate_string(StringStarts, Lex,Ctrl,StringMask,EscapeChars,UnescapedDQuotes)
     
    559560        ParityMask = parallel_prefix_parity(UnescapedDQuotes) & EOF_mask # TODO - Solve parity EOF_mask problem
    560561        StringMask = ParityMask & bitutil.Advance(ParityMask)   
    561        
    562         (StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts, ValueStarts) = atom_starts(Lex, StringMask, EscapeChars)
     562        StringSpans = StringMask | UnescapedDQuotes
     563       
     564        (StringStarts, NumberStarts, TrueStarts, FalseStarts, NullStarts) = atom_starts(Lex, StringSpans)
    563565       
    564566        (StringErrors, StringSpans) = validate_string(StringStarts, Lex, Ctrl, StringMask, EscapeChars, UnescapedDQuotes)
     
    582584        lgth = len(u8data)
    583585
    584         (StringStarts, StringSpans, StringErrors, 
     586        (StringStarts, StringSpans, StringErrors,
    585587        NumberStarts, NumberSpans, NumberErrors,
    586588        TrueStarts, TrueSpans, TrueErrors,
     
    619621#       demo_parse_escape(u8data)
    620622#       demo_parallel_prefix_parity(u8data)
    621 #       demo_atom_starts(u8data)
     623        demo_atom_starts(u8data)
    622624#       demo_validate_number(u8data)
    623625#       demo_validate_string(u8data)
    624         demo_validate_json_atoms(u8data)
     626#       demo_validate_json_atoms(u8data)
Note: See TracChangeset for help on using the changeset viewer.