source: proto/JSON/json_pybit_compilable.py @ 4740

Last change on this file since 4740 was 792, checked in by ksherdy, 9 years ago

Add Pybit/Pablo? specific Python compilable files.

File size: 9.8 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# json_compilable.py
4#
5# Parallel JSON validation.
6#
7# RFC 4627 - JavaScript Object Notation (JSON) 
8# RFC 5234 - Augmented BNF for Syntax Specifications: ABNF
9#
10# Ken Herdy
11# November 26, 2010
12#
13       
14def main(u8data):
15        ### Transpose to parallel bit streams and prepare an EOF mask.
16        # (bit, EOF_mask) = bitutil.transpose_streams(u8data)
17
18        ### Classify bytes for UTF-8 processing, whitespace control processing, and JSON lexical analysis.     
19        u8.unibyte = (~bit[0]);
20        u8.prefix = (bit[0] & bit[1]);
21        u8.prefix2 = (u8.prefix &~ bit[2]);
22        temp1 = (bit[2] &~ bit[3]);
23        u8.prefix3 = (u8.prefix & temp1);
24        temp2 = (bit[2] & bit[3]);
25        u8.prefix4 = (u8.prefix & temp2);
26        u8.suffix = (bit[0] &~ bit[1]);
27        temp3 = (bit[2] | bit[3]);
28        temp4 = (u8.prefix &~ temp3);
29        temp5 = (bit[4] | bit[5]);
30        temp6 = (temp5 | bit[6]);
31        temp7 = (temp4 &~ temp6);
32        temp8 = (bit[6] | bit[7]);
33        temp9 = (bit[5] & temp8);
34        temp10 = (bit[4] | temp9);
35        temp11 = (u8.prefix4 & temp10);
36        u8.badprefix = (temp7 | temp11);
37        temp12 = (temp5 | temp8);
38        u8.xE0 = (u8.prefix3 &~ temp12);
39        temp13 = (bit[4] & bit[5]);
40        temp14 = (bit[7] &~ bit[6]);
41        temp15 = (temp13 & temp14);
42        u8.xED = (u8.prefix3 & temp15);
43        u8.xF0 = (u8.prefix4 &~ temp12);
44        temp16 = (bit[5] &~ bit[4]);
45        temp17 = (temp16 &~ temp8);
46        u8.xF4 = (u8.prefix4 & temp17);
47        u8.xA0_xBF = (u8.suffix & bit[2]);
48        u8.x80_x9F = (u8.suffix &~ bit[2]);
49        u8.x90_xBF = (u8.suffix & temp3);
50        u8.x80_x8F = (u8.suffix &~ temp3);
51        temp18 = (bit[0] | bit[1]);
52        temp19 = (temp18 | bit[2]);
53        Ctrl.x00_x1F = (~temp19);
54        temp20 = (temp18 | temp3);
55        Ctrl.CR = (temp15 &~ temp20);
56        temp21 = (bit[4] &~ bit[5]);
57        temp22 = (bit[6] &~ bit[7]);
58        temp23 = (temp21 & temp22);
59        Ctrl.LF = (temp23 &~ temp20);
60        temp24 = (temp21 & temp14);
61        Ctrl.HT = (temp24 &~ temp20);
62        temp25 = (temp1 &~ temp18);
63        Ctrl.SP = (temp25 &~ temp12);
64        temp26 = (bit[1] &~ bit[0]);
65        temp27 = (temp26 & temp2);
66        temp28 = (bit[6] & bit[7]);
67        temp29 = (temp21 & temp28);
68        Lex.LCurlyBrace = (temp27 & temp29);
69        temp30 = (temp2 &~ temp18);
70        Lex.Colon = (temp30 & temp23);
71        temp31 = (temp13 &~ temp8);
72        Lex.Comma = (temp25 & temp31);
73        Lex.RCurlyBrace = (temp27 & temp15);
74        temp32 = (bit[3] &~ bit[2]);
75        temp33 = (temp26 & temp32);
76        Lex.LSquareBracket = (temp33 & temp29);
77        Lex.RSquareBracket = (temp33 & temp15);
78        Lex.Minus = (temp25 & temp15);
79        Lex.Zero = (temp30 &~ temp12);
80        temp34 = (bit[5] | bit[6]);
81        temp35 = (~temp34);
82        temp36 = (bit[5] | temp8);
83        temp37 = ((bit[4] & temp35)|(~(bit[4]) & temp36));
84        Lex.Digit1_9 = (temp30 & temp37);
85        temp38 = (bit[4] & temp34);
86        Lex.Digit0_9 = (temp30 &~ temp38);
87        temp39 = (temp13 & temp22);
88        Lex.DecimalPoint = (temp25 & temp39);
89        temp40 = (temp16 & temp14);
90        temp41 = (temp3 &~ temp1);
91        temp42 = (temp26 &~ temp41);
92        Lex.Ee = (temp40 & temp42);
93        temp43 = (temp29 | temp15);
94        Lex.PlusMinus = (temp25 & temp43);
95        temp44 = (Lex.Minus | Lex.Digit0_9);
96        temp45 = (temp44 | Lex.DecimalPoint);
97        temp46 = (temp26 &~ temp3);
98        temp47 = (temp46 & temp40);
99        temp48 = (temp45 | temp47);
100        temp49 = (temp26 & temp1);
101        temp50 = (temp49 & temp40);
102        temp51 = (temp48 | temp50);
103        temp52 = (temp25 & temp29);
104        temp53 = (temp51 | temp52);
105        Lex.Number = (temp53 | Lex.Minus);
106        temp54 = (temp22 &~ temp5);
107        Lex.DQuote = (temp25 & temp54);
108        Lex.RSolidus = (temp33 & temp31);
109        Lex.u = (temp27 & temp40);
110        temp55 = (Lex.DQuote | Lex.RSolidus);
111        temp56 = (temp13 & temp28);
112        temp57 = (temp25 & temp56);
113        temp58 = (temp55 | temp57);
114        temp59 = (temp49 & temp54);
115        temp60 = (temp58 | temp59);
116        temp61 = (temp16 & temp22);
117        temp62 = (temp49 & temp61);
118        temp63 = (temp60 | temp62);
119        temp64 = (temp49 & temp39);
120        temp65 = (temp63 | temp64);
121        temp66 = (temp27 & temp54);
122        temp67 = (temp65 | temp66);
123        temp68 = (temp27 & temp17);
124        temp69 = (temp67 | temp68);
125        Lex.Escape = (temp69 | Lex.u);
126        temp70 = (temp49 &~ bit[4]);
127        temp71 = (~temp28);
128        temp72 = ((bit[5] & temp71)|(~(bit[5]) & temp8));
129        temp73 = (temp70 & temp72);
130        temp74 = (Lex.Digit0_9 | temp73);
131        temp75 = (temp46 &~ bit[4]);
132        temp76 = (temp75 & temp72);
133        Lex.HexDigit = (temp74 | temp76);
134        temp77 = (temp15 | temp23);
135        temp78 = (temp77 | temp24);
136        temp79 = (temp78 &~ temp20);
137        Lex.WS = (temp79 | Ctrl.SP);
138        Lex.t = (temp27 & temp17);
139        Lex.r = (temp27 & temp54);
140        Lex.e = (temp49 & temp40);
141        temp80 = (temp17 | temp54);
142        temp81 = (temp80 | temp40);
143        temp82 = (temp27 & temp81);
144        Lex.True = (temp82 | Lex.e);
145        Lex.f = (temp49 & temp61);
146        temp83 = (temp14 &~ temp5);
147        Lex.a = (temp49 & temp83);
148        Lex.l = (temp49 & temp31);
149        temp84 = (temp28 &~ temp5);
150        Lex.s = (temp27 & temp84);
151        temp85 = (temp61 | temp83);
152        temp86 = (temp85 | temp31);
153        temp87 = (temp49 & temp86);
154        temp88 = (temp87 | Lex.s);
155        Lex.False = (temp88 | Lex.e);
156        Lex.n = (temp49 & temp39);
157        temp89 = (Lex.n | Lex.u);
158        Lex.Null = (temp89 | Lex.l);
159
160        ### Start parse_escape
161        #
162        # Odd = simd_const_2(1)
163        # Even = simd_const_2(2)
164        Start = Lex.RSolidus &~ bitutil.Advance(Lex.RSolidus)
165       
166        EvenStart = Start & Even
167        EvenFinal = (EvenStart + Lex.RSolidus) & ~Lex.RSolidus
168        EvenEscape = EvenFinal & Odd
169       
170        OddStart = Start & Odd
171        OddFinal = (OddStart + Lex.RSolidus) & ~Lex.RSolidus
172        OddEscape = (OddFinal & Even)
173
174        Escape = (EvenEscape | OddEscape) 
175        UnescapedDQuotes = (Lex.DQuote &~ Escape)
176        #
177        ### End parse_escape
178       
179        ### parallel_prefix_mask() --- we currently manually insert this method into the JSON template.c
180       
181        ### Start Generate String Mask ---
182        #
183        StringMask = ParityMask & bitutil.Advance(ParityMask)
184        StringSpans = StringMask | UnescapedDQuotes
185        #
186        ### End Generate String Mask ---
187
188        ### Start atom_starts   
189        #
190       
191       
192        StringStarts = StringSpans &~ bitutil.Advance(StringSpans)     
193
194        UnmaskedAtomSpans = (Lex.True | Lex.False | Lex.Null | Lex.Number) &~ StringSpans
195        UnmaskedAtomStarts = UnmaskedAtomSpans &~ bitutil.Advance(UnmaskedAtomSpans)
196
197        NumberStarts = UnmaskedAtomStarts & (Lex.Minus|Lex.Digit0_9)
198        TrueStarts = UnmaskedAtomStarts & (Lex.t)
199        FalseStarts = UnmaskedAtomStarts & (Lex.f)
200        NullStarts = UnmaskedAtomStarts & (Lex.n)
201       
202        #
203        ### End atom_starts
204       
205        ### Start validate_string
206        #
207        # (1) Validate escape characters
208        StringEscapeChars = Escape & StringMask
209        StringErrors = (StringEscapeChars &~ Lex.Escape)
210       
211        u = StringEscapeChars & Lex.u
212       
213        uScope1 = bitutil.Advance(u)
214        uScope2 = bitutil.Advance(uScope1)
215        uScope3 = bitutil.Advance(uScope2)
216        uScope4 = bitutil.Advance(uScope3)
217       
218        StringErrors |= uScope1 &~ Lex.HexDigit
219        StringErrors |= uScope2 &~ Lex.HexDigit
220        StringErrors |= uScope3 &~ Lex.HexDigit
221        StringErrors |= uScope4 &~ Lex.HexDigit
222       
223        # (2) Validation of unescaped characters
224        # (2.1) StringMask construction ensures all '"' are escaped.
225        # (2.2) '\' are either correctly escaped or the character following an odd length run is escaped.
226
227        StringNotEscapedChars = (~(Escape | Lex.RSolidus)) & StringMask
228        StringErrors |= (StringNotEscapedChars & Ctrl.x00_x1F)
229       
230        # (3) Validate all strings are terminated with an unescaped "
231        StringCursor = bitutil.Advance(StringStarts)
232        StringEnds = bitutil.ScanThru(StringCursor, StringMask)
233        StringErrors |= StringEnds &~ UnescapedDQuotes
234        #
235        ### End validate_string
236       
237        ### Start validate_number
238        #
239        M0 = NumberStarts                                       # Initialize marker stream     
240       
241        M1 = bitutil.ScanThru(M0, Lex.Minus & M0)               # ? Optional character class [-]
242        E1 = M1 &~(Lex.Zero|Lex.Digit1_9)
243        M1 = M1 &~ E1                                           # Remove cursors at error positions so as to report a single error position
244
245        M1a = M1 & Lex.Zero                                     # Split
246        M1b = M1 & Lex.Digit1_9                         
247        M2a = bitutil.Advance(M1a)
248        M2b = bitutil.Advance(M1b)
249        M3b = bitutil.ScanThru(M2b,Lex.Digit0_9)
250        M4 =  M2a | M3b                                         # Join
251       
252        M4a = M4 &~(Lex.DecimalPoint)                           # Split
253        M4b = M4 & (Lex.DecimalPoint)
254        M5b = bitutil.Advance(M4b)
255        E5b = M5b &~(Lex.Digit0_9)                              # + [0-9]+
256        M5b = M5b &~E5b                                         # Remove cursors at error positions so as to report a single error position
257       
258        M6 = bitutil.ScanThru(M5b,Lex.Digit0_9)
259        M7 = M4a | M6                                           # Join
260       
261        M7a = M7 &~(Lex.Ee)                                     # Split
262        M7b = M7 & (Lex.Ee)
263        M8b = bitutil.Advance(M7b)
264        M9b = bitutil.ScanThru(M8b, Lex.PlusMinus & M8b)        # ? Optional character class [+-]               
265        E9b  = M9b &~(Lex.Digit0_9)                             # + [0-9]+
266        M9b = M9b &~ E9b                                        # Remove cursors at error positions so as to report a single error position
267        M10b = bitutil.ScanThru(M9b,Lex.Digit0_9)
268
269        M11 = E1 | E5b | E9b | M7a | M10b                       # Record final marker positions,
270                                                                # At Advance(M11) this positions is either (1) a known error position or (2) an undetermined position to be checked
271       
272        NumberErrors = E1 | E5b | E9b
273       
274        NumberSpans = M11 - M0
275        #
276        ### End validate_number
277
278        ### Start validate_true
279        #
280        TrueScope1 = bitutil.Advance(TrueStarts)
281        TrueScope2 = bitutil.Advance(TrueScope1)
282        TrueScope3 = bitutil.Advance(TrueScope2)
283       
284        TrueErrors = TrueScope1 &~ Lex.r
285        TrueErrors |= TrueScope2 &~ Lex.u
286        TrueErrors |= TrueScope3 &~ Lex.e
287       
288        TrueFollows = bitutil.Advance(TrueScope3)
289        TrueSpans = TrueFollows - TrueStarts
290        #
291        ### End validate_true
292
293        ### Start validate_false
294        #
295        FalseScope1 = bitutil.Advance(FalseStarts)
296        FalseScope2 = bitutil.Advance(FalseScope1)
297        FalseScope3 = bitutil.Advance(FalseScope2)
298        FalseScope4 = bitutil.Advance(FalseScope3)
299       
300        FalseErrors = FalseScope1 &~ Lex.a
301        FalseErrors |= FalseScope2 &~ Lex.l
302        FalseErrors |= FalseScope3 &~ Lex.s
303        FalseErrors |= FalseScope4 &~ Lex.e
304
305        FalseFollows = bitutil.Advance(FalseScope4)
306        FalseSpans = FalseFollows - FalseStarts
307        #
308        ### End validate_false
309       
310        ### Start validate_null
311        #
312        NullScope1 = bitutil.Advance(NullStarts)
313        NullScope2 = bitutil.Advance(NullScope1)
314        NullScope3 = bitutil.Advance(NullScope2)
315       
316        NullErrors |= NullScope1 &~ Lex.u
317        NullErrors |= NullScope2 &~ Lex.l
318        NullErrors |= NullScope3 &~ Lex.l
319       
320        NullFollows = bitutil.Advance(NullScope3)
321        NullSpans = NullFollows - NullStarts
322        #
323        ### End validate_null
324
325        # AtomSpans & AtomsStarts serve as the basic interface to ANTLR
326        AtomStarts = StringStarts | NumberStarts | TrueStarts | FalseStarts | NullStarts
327        AtomSpans = StringSpans | NumberSpans | TrueSpans | FalseSpans | NullSpans
328
329        # Consolidate errors
330        error_mask = StringErrors | NumberErrors | TrueErrors | FalseErrors | NullErrors
331
332        return (u8,Lex,Ctrl,EOF_mask)
333
Note: See TracBrowser for help on using the repository browser.