source: proto/xmlschema/parabix2_validation.py @ 3532

Last change on this file since 3532 was 3220, checked in by shiyangy, 6 years ago
File size: 25.3 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# parabix2_compilable.py
4#
5# Parallel XML Parsing with Bitstream Addition
6#
7# - Complete prototype for all bitstream computations in Parabix2
8# - Optimized for compilation
9# - Separate compilation
10
11# Robert D. Cameron
12# July 29, 2010
13#
14
15#import bitutil
16
17class u8 ():
18  unibyte = 0
19  prefix = 0
20  prefix2 = 0
21  prefix3 = 0
22  prefix4 = 0
23  suffix = 0
24  badprefix = 0
25  xE0 = 0
26  xED = 0
27  xF0 = 0
28  xF4 = 0
29  xA0_xBF = 0
30  x80_x9F = 0
31  x90_xBF = 0
32  x80_x8F = 0
33  xEF = 0
34  xBF = 0
35  xBE = 0
36  scope22 = 0
37  scope32 = 0
38  scope33 = 0
39  scope42 = 0
40  scope43 = 0
41  scope44 = 0
42  xE0_scope = 0
43  xED_scope = 0
44  xF0_scope = 0
45  xF4_scope = 0
46  xEF_scope = 0
47
48class Lex ():
49        CR = 0
50        LF = 0
51        HT = 0
52        SP = 0
53        CRLF = 0
54        RefStart = 0
55        Semicolon = 0
56        Colon = 0
57        LAngle = 0
58        RAngle = 0
59        LBracket = 0
60        RBracket = 0
61        Exclam = 0
62        QMark = 0
63        Hyphen = 0
64        Equals = 0
65        SQuote = 0
66        DQuote = 0
67        Slash = 0
68        Hash = 0
69        x = 0
70        ASCII_name_start = 0
71        ASCII_name_char = 0
72        NameScan = 0
73        Digit = 0
74        Hex = 0
75        WS = 0
76
77class Scope1 ():
78        RefStart = 0
79        LAngle = 0
80        Hyphen = 0
81        QMark = 0
82        RBracket = 0
83       
84class Marker ():
85        LAngle_scope = 0
86        Ref_opener = 0
87        CD_closer = 0
88
89class CtCDPI_Callouts():
90        CD_end = 0
91        Ct_starts = 0
92        Ct_ends = 0
93        CD_starts = 0
94        CD_ends = 0
95        PI_starts = 0
96        PI_name_starts = 0
97        PI_name_ends = 0
98        PI_ends = 0
99        CtCDPI_mask = 0
100
101class Ref_Callouts():
102        GenRef_starts = 0
103        GenRef_ends = 0
104        DecRef_starts = 0
105        DecRef_ends = 0
106        HexRef_starts = 0
107        HexRef_ends = 0
108
109class Hash_data():
110        Hash_value = 0
111
112class Tag_Callouts():
113        ElemName_starts = 0
114        ElemName_ends = 0
115        ElemName_ends_1 = 0
116        ElemName_ends_2 = 0
117        ElemName_ends_3 = 0
118        ElemName_ends_4 = 0
119        ElemName_ends_5 = 0
120        ElemName_ends_6 = 0
121        ElemName_ends_7 = 0
122        ElemName_ends_8 = 0
123        ElemName_ends_9 = 0
124        ElemName_ends_10 = 0
125        ElemName_ends_11 = 0
126        ElemName_ends_12 = 0
127        ElemName_ends_13 = 0
128        ElemName_ends_14 = 0
129        ElemName_ends_15 = 0
130        ElemName_ends_16 = 0
131        ElemName_ends_17_and_longer = 0
132        AttName_starts = 0
133        AttName_ends = 0
134        AttVal_starts = 0
135        AttVal_ends = 0
136        AttVal_spans = 0
137        EmptyTag_marks = 0
138        EndTag_marks = 0
139       
140        Tag_closing = 0
141
142class Basis_bits():
143        bit_0 = 0
144        bit_1 = 0
145        bit_2 = 0
146        bit_3 = 0
147        bit_4 = 0
148        bit_5 = 0
149        bit_6 = 0
150        bit_7 = 0
151
152class Check_streams():
153        misc_mask = 0
154        non_ascii_name_starts = 0
155        non_ascii_names = 0
156        tag_marks = 0
157        name_follows = 0
158        att_refs = 0
159
160class Xml_names():
161        namespace_error = 0
162       
163class elem():
164        purchaseOrder = 0
165        shipTo =0
166        name =0
167        street =0
168        city =0
169        state =0
170        zip =0
171        billTo =0
172        comment =0
173        items =0
174        item =0
175        productName =0
176        quantity =0
177        USPrice =0
178        shipDate =0
179
180def Classify_bytes_Validate_utf8(basis_bits, lex, u8):
181        temp1 = (basis_bits.bit_0 | basis_bits.bit_1);
182        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3);
183        temp3 = (temp2 &~ temp1);
184        temp4 = (basis_bits.bit_5 &~ basis_bits.bit_4);
185        temp5 = (basis_bits.bit_6 &~ basis_bits.bit_7);
186        temp6 = (temp4 & temp5);
187        lex.RefStart = (temp3 & temp6);
188        temp7 = (basis_bits.bit_2 & basis_bits.bit_3);
189        temp8 = (temp7 &~ temp1);
190        temp9 = (basis_bits.bit_4 &~ basis_bits.bit_5);
191        temp10 = (basis_bits.bit_6 & basis_bits.bit_7);
192        temp11 = (temp9 & temp10);
193        lex.Semicolon = (temp8 & temp11);
194        temp12 = (basis_bits.bit_4 & basis_bits.bit_5);
195        temp13 = (basis_bits.bit_6 | basis_bits.bit_7);
196        temp14 = (temp12 &~ temp13);
197        lex.LAngle = (temp8 & temp14);
198        temp15 = (temp12 & temp5);
199        lex.RAngle = (temp8 & temp15);
200        temp16 = (basis_bits.bit_1 &~ basis_bits.bit_0);
201        temp17 = (basis_bits.bit_3 &~ basis_bits.bit_2);
202        temp18 = (temp16 & temp17);
203        lex.LBracket = (temp18 & temp11);
204        temp19 = (basis_bits.bit_7 &~ basis_bits.bit_6);
205        temp20 = (temp12 & temp19);
206        lex.RBracket = (temp18 & temp20);
207        temp21 = (basis_bits.bit_4 | basis_bits.bit_5);
208        temp22 = (temp19 &~ temp21);
209        lex.Exclam = (temp3 & temp22);
210        temp23 = (temp12 & temp10);
211        lex.QMark = (temp8 & temp23);
212        lex.Hyphen = (temp3 & temp20);
213        lex.Equals = (temp8 & temp20);
214        temp24 = (temp4 & temp10);
215        lex.SQuote = (temp3 & temp24);
216        temp25 = (temp5 &~ temp21);
217        lex.DQuote = (temp3 & temp25);
218        lex.Slash = (temp3 & temp23);
219        temp26 = (temp10 &~ temp21);
220        lex.Hash = (temp3 & temp26);
221        temp27 = (temp16 & temp7);
222        temp28 = (temp9 &~ temp13);
223        lex.x = (temp27 & temp28);
224        temp29 = (temp9 & temp5);
225        lex.Colon = (temp8 & temp29);
226        temp30 = (temp18 & temp23);
227        temp31 = (temp30 | lex.Colon);
228        temp32 = (temp16 &~ basis_bits.bit_2);
229        temp33 = (basis_bits.bit_5 | temp10);
230        temp34 = (basis_bits.bit_4 & temp33);
231        temp35 = (~temp34);
232        temp36 = (temp21 | temp13);
233        temp37 = ((basis_bits.bit_3 & temp35)|(~(basis_bits.bit_3) & temp36));
234        temp38 = (temp32 & temp37);
235        temp39 = (temp31 | temp38);
236        temp40 = (temp16 & basis_bits.bit_2);
237        temp41 = (temp40 & temp37);
238        lex.ASCII_name_start = (temp39 | temp41);
239        temp42 = (temp30 | lex.Hyphen);
240        temp43 = (temp3 & temp15);
241        temp44 = (temp42 | temp43);
242        temp45 = (temp8 &~ temp34);
243        temp46 = (temp44 | temp45);
244        temp47 = (temp46 | temp38);
245        lex.ASCII_name_char = (temp47 | temp41);
246        lex.NameScan = (lex.ASCII_name_char | basis_bits.bit_0);
247        temp48 = (temp1 | basis_bits.bit_2);
248        x00_x1F = (~temp48);
249        temp49 = (basis_bits.bit_2 | basis_bits.bit_3);
250        temp50 = (temp1 | temp49);
251        lex.CR = (temp20 &~ temp50);
252        lex.LF = (temp29 &~ temp50);
253        temp51 = (temp9 & temp19);
254        lex.HT = (temp51 &~ temp50);
255        lex.SP = (temp3 &~ temp36);
256        temp52 = (temp20 | temp29);
257        temp53 = (temp52 | temp51);
258        temp54 = (temp53 &~ temp50);
259        lex.WS = (temp54 | lex.SP);
260        temp55 = (basis_bits.bit_5 | basis_bits.bit_6);
261        temp56 = (basis_bits.bit_4 & temp55);
262        lex.Digit = (temp8 &~ temp56);
263        temp57 = (temp16 &~ temp49);
264        temp58 = (temp57 &~ basis_bits.bit_4);
265        temp59 = (~temp10);
266        temp60 = ((basis_bits.bit_5 & temp59)|(~(basis_bits.bit_5) & temp13));
267        temp61 = (temp58 & temp60);
268        temp62 = (lex.Digit | temp61);
269        temp63 = (temp16 & temp2);
270        temp64 = (temp63 &~ basis_bits.bit_4);
271        temp65 = (temp64 & temp60);
272        lex.Hex = (temp62 | temp65);
273        lex_error = x00_x1F &~ lex.WS
274        if lex_error & EOF_mask:
275                error_tracker.NoteError("Error: illegal character", lex_error)
276
277
278        ### Validate_utf8(basis_bits, u8):
279        u8.unibyte = (~basis_bits.bit_0);
280        u8.suffix = 0
281        u8_error = 0
282        u8_FFFE_FFFF = 0
283        u8anyscope = 0 #local
284        if basis_bits.bit_0:
285                u8.prefix = (basis_bits.bit_0 & basis_bits.bit_1);
286                u8.prefix2 = (u8.prefix &~ basis_bits.bit_2);
287                u8.prefix3 = (u8.prefix & temp2);
288                u8.prefix4 = (u8.prefix & temp7);
289                u8.suffix = (basis_bits.bit_0 &~ basis_bits.bit_1);
290                temp66 = (u8.prefix &~ temp49);
291                temp67 = (temp21 | basis_bits.bit_6);
292                temp68 = (temp66 &~ temp67);
293                temp69 = (basis_bits.bit_5 & temp13);
294                temp70 = (basis_bits.bit_4 | temp69);
295                temp71 = (u8.prefix4 & temp70);
296                u8.badprefix = (temp68 | temp71);
297                u8_error = u8.badprefix
298                u8.scope22 = pablo.Advance(u8.prefix2)
299                u8anyscope = u8.scope22
300                if u8.prefix3 | u8.prefix4:
301                        xE0 = (u8.prefix3 &~ temp36);
302                        xED = (u8.prefix3 & temp20);
303                        xF0 = (u8.prefix4 &~ temp36);
304                        temp72 = (temp4 &~ temp13);
305                        xF4 = (u8.prefix4 & temp72);
306                        u8.xA0_xBF = (u8.suffix & basis_bits.bit_2);
307                        u8.x80_x9F = (u8.suffix &~ basis_bits.bit_2);
308                        u8.x90_xBF = (u8.suffix & temp49);
309                        u8.x80_x8F = (u8.suffix &~ temp49);
310                        xEF = (u8.prefix3 & temp23);
311                        temp73 = (u8.suffix & temp7);
312                        u8.xBF = (temp73 & temp23);
313                        u8.xBE = (temp73 & temp15);
314                        u8.xE0_scope = pablo.Advance(xE0);
315                        u8.xED_scope = pablo.Advance(xED);
316                        u8.xF0_scope = pablo.Advance(xF0);
317                        u8.xF4_scope = pablo.Advance(xF4);
318                        u8.xEF_scope = pablo.Advance(xEF);
319                        u8.scope32 = pablo.Advance(u8.prefix3)
320                        u8.scope33 = pablo.Advance(u8.scope32)
321                        u8.scope42 = pablo.Advance(u8.prefix4)
322                        u8.scope43 = pablo.Advance(u8.scope42)
323                        u8.scope44 = pablo.Advance(u8.scope43)
324
325                        u8lastscope = u8.scope22 | u8.scope33 | u8.scope44
326                        u8anyscope = u8lastscope | u8.scope32 | u8.scope42 | u8.scope43
327
328                        u8error1 = u8.xE0_scope & u8.x80_x9F
329                        u8error2 = u8.xED_scope & u8.xA0_xBF
330                        u8error3 = u8.xF0_scope & u8.x80_x8F
331                        u8error4 = u8.xF4_scope & u8.x90_xBF
332
333                        u8_error |= u8error1 | u8error2 | u8error3 | u8error4
334
335                        EF_BF_pending = pablo.Advance(u8.xEF_scope & u8.xBF)
336
337                        u8_FFFE_FFFF = (EF_BF_pending & (u8.xBE | u8.xBF))
338                u8mismatch = u8anyscope ^ u8.suffix
339                u8_error |= u8mismatch | u8_FFFE_FFFF
340                if u8_error:
341                        error_tracker.NoteError("UTF-8 error found", (u8_error))
342
343
344def Add_scope_streams(lex, scope1):
345        #scope1.LAngle = pablo.Advance(lex.LAngle)
346        #scope1.Hyphen = pablo.Advance(lex.Hyphen)
347        #scope1.QMark = pablo.Advance(lex.QMark)
348        v = lex.LAngle | lex.Hyphen
349        w = lex.Hyphen | lex.QMark
350        v1 = pablo.Advance(v)
351        w1 = pablo.Advance(w)
352        scope1.LAngle = v1 &~ w1
353        scope1.Hyphen = v1 & w1
354        scope1.QMark = w1 &~ v1
355        scope1.RefStart = 0 # default
356
357def Parse_CtCDPI(lex, marker, ctCDPI_Callouts, check_streams):
358        ctCDPI_Callouts.Ct_starts = 0
359        ctCDPI_Callouts.Ct_ends = 0
360        ctCDPI_Callouts.CD_starts = 0
361        ctCDPI_Callouts.CD_ends = 0
362        ctCDPI_Callouts.PI_starts = 0
363        ctCDPI_Callouts.PI_name_starts = 0
364        ctCDPI_Callouts.PI_name_ends = 0
365        ctCDPI_Callouts.PI_ends = 0
366        CtCDPI_starts = 0
367        CtCDPI_ends = 0
368        ctCDPI_mask = 0
369
370        v = lex.LAngle | lex.Hyphen
371        w = lex.Hyphen | lex.QMark
372        v1 = pablo.Advance(v,1)
373        w1 = pablo.Advance(w,1)
374       
375        LAngle_scope = v1 &~ w1  #pablo.Advance(lex.LAngle)
376        PI_opener = LAngle_scope & lex.QMark
377        CtCD_opener= LAngle_scope & lex.Exclam
378        CtCDPI_opener = PI_opener | CtCD_opener
379
380        #DoubleHyphen = 0
381        CD_closer = 0
382        #PI_closer = 0
383       
384        #if lex.Hyphen: DoubleHyphen = pablo.Advance(lex.Hyphen) & lex.Hyphen
385        DoubleHyphen = v1 & w1 & lex.Hyphen
386        if lex.RBracket:
387                DoubleRBracket = pablo.Advance(lex.RBracket) & lex.RBracket
388                CD_closer = pablo.Advance(DoubleRBracket) & lex.RAngle
389        #if lex.QMark: PI_closer = pablo.Advance(lex.QMark) & lex.RAngle
390        PI_closer = w1 & ~v1 & lex.RAngle
391
392        #
393        # Initiate the scan
394        CtCDPI_Cursor = pablo.ScanToFirst(CtCDPI_opener)
395        while CtCDPI_Cursor:
396                CtCDPI_starts |= CtCDPI_Cursor
397                PI_Cursor = CtCDPI_Cursor & PI_opener
398                CD_Ct_Cursor = pablo.Advance(CtCDPI_Cursor & ~PI_Cursor)
399                CD_Cursor = CD_Ct_Cursor & lex.LBracket
400                Ct_Cursor = CD_Ct_Cursor & lex.Hyphen
401                # PI processing
402                if PI_Cursor:
403                        ctCDPI_Callouts.PI_starts |= PI_Cursor
404                        PI_Cursor = pablo.Advance(PI_Cursor)
405                        ctCDPI_Callouts.PI_name_starts |= PI_Cursor
406                        PI_name_end = pablo.ScanThru(PI_Cursor, lex.NameScan)
407                        PI_error = PI_Cursor & PI_name_end
408                        PI_noWS = PI_name_end & ~ lex.WS
409                        PI_error |= PI_noWS &~ lex.QMark | pablo.Advance(PI_noWS) &~ PI_closer
410                        pablo.assert_0(PI_error, "Error in PI syntax")
411                        ctCDPI_Callouts.PI_name_ends |= PI_name_end
412                        PI_Cursor = pablo.ScanTo(PI_name_end, PI_closer)
413                        ctCDPI_Callouts.PI_ends |= PI_Cursor
414                        CtCDPI_ends |= PI_Cursor
415
416                # CDATA section processing
417                if CD_Cursor:
418                        ctCDPI_Callouts.CD_starts |= CD_Cursor
419                        CD_Cursor = pablo.ScanTo(CD_Cursor, CD_closer)
420                        ctCDPI_Callouts.CD_ends |= CD_Cursor
421                        CtCDPI_ends |= CD_Cursor
422
423                # Comment processing
424                if Ct_Cursor:
425                        ctCDPI_Callouts.Ct_starts |= Ct_Cursor
426                        Ct_Cursor = pablo.Advance(Ct_Cursor) 
427                        Ct_error = Ct_Cursor & ~ lex.Hyphen
428                        # Advance twice past <!--, so that we don't treat <!---
429                        # as being a terminated comment.
430                        Ct_Cursor = pablo.Advance(pablo.Advance(Ct_Cursor))
431                        Ct_Cursor = pablo.Advance(pablo.ScanTo(Ct_Cursor, DoubleHyphen))
432                        pablo.assert_0(Ct_error | Ct_Cursor & ~ lex.RAngle, "Error in comment syntax")
433                        ctCDPI_Callouts.Ct_ends |= Ct_Cursor
434                        CtCDPI_ends |= Ct_Cursor
435
436                # Common processing
437                CtCDPI_Cursor = PI_Cursor | CD_Cursor | Ct_Cursor
438                ctCDPI_mask = pablo.InclusiveSpan(CtCDPI_starts, CtCDPI_ends)
439#               ctCDPI_mask |= (CtCDPI_ends - CtCDPI_starts) | CtCDPI_ends
440                # If any of the Comment, CDATA or PI markups are unterminated, it is an error.
441                pablo.assert_0(pablo.atEOF(ctCDPI_mask), "Error in comment, CDATA or processing instruction syntax")
442                CtCDPI_Cursor = pablo.ScanTo(CtCDPI_Cursor, CtCDPI_opener)     
443               
444#       check_streams.misc_mask = (lex.WS | lex.LAngle | (pablo.Advance(ctCDPI_Callouts.Ct_ends | ctCDPI_Callouts.PI_ends)  -(ctCDPI_Callouts.Ct_starts | ctCDPI_Callouts.PI_starts)) | CtCDPI_starts) & EOF_mask
445#  Following is slow
446        check_streams.misc_mask = (lex.WS | lex.LAngle | pablo.InclusiveSpan(ctCDPI_Callouts.Ct_starts | ctCDPI_Callouts.PI_starts, ctCDPI_Callouts.Ct_ends | ctCDPI_Callouts.PI_ends) | CtCDPI_starts) & EOF_mask
447
448
449        # Identify the remaining significant markers for XML processing.
450        marker.LAngle_scope = LAngle_scope &~ ctCDPI_mask
451        marker.Ref_opener = lex.RefStart &~ ctCDPI_mask
452        marker.CD_closer = CD_closer &~ ctCDPI_mask
453
454def Parse_tags(lex, marker, tag_Callouts):
455       
456        EqExpected = 0
457        AttListEnd = 0
458       
459        # Delimiters for scans.
460        DQuoteDelim = lex.DQuote | lex.LAngle
461        SQuoteDelim = lex.SQuote | lex.LAngle
462        AttListDelim = lex.Slash | lex.RAngle
463       
464        # Start the parallel parsing by inspecting the character
465        # after the opening "<" of a tag.
466        tag_Callouts.ElemName_starts = marker.LAngle_scope & ~lex.Slash
467        tag_Callouts.EndTag_marks = marker.LAngle_scope & lex.Slash
468       
469        # Start Tag/Empty Element Tag Parsing
470
471        # Advance all cursors by scanning through the tag name.
472        tag_Callouts.ElemName_ends = pablo.ScanThru(tag_Callouts.ElemName_starts, lex.NameScan)
473        # Must have at least one name character for a legal start tag.
474        # Mark any occurrences of null names as errors.
475        ParseError = tag_Callouts.ElemName_starts & tag_Callouts.ElemName_ends
476       
477        # Initialize the accumulators for attribute name and value positions.
478        tag_Callouts.AttName_starts = 0 
479        tag_Callouts.AttName_ends = 0
480        tag_Callouts.AttVal_starts = 0
481        tag_Callouts.AttVal_ends = 0
482        # After the element name, there may or may not be an attlist.
483        if tag_Callouts.ElemName_ends & lex.WS:
484                AfterWS = pablo.ScanThru(tag_Callouts.ElemName_ends, lex.WS)
485                AttListEnd = AfterWS & AttListDelim
486                AttNameStart = AfterWS & ~AttListDelim
487                #
488                # The following loop iterates through attributes within a start tag.
489                # Because all start tags are processed in parallel, the number of
490                # iterations is the maximum number of attributes found in any one
491                # start tag, plus one.
492                while AttNameStart:
493                        ParseError |= AttNameStart &~ lex.NameScan
494                        tag_Callouts.AttName_starts |= AttNameStart
495                        AttNameFollow = pablo.ScanThru(AttNameStart, lex.NameScan)
496                        tag_Callouts.AttName_ends |= AttNameFollow
497                        # Scan through WS to the expected '=' delimiter.
498                        # EqExpected = pablo.ScanThru(AttNameFollow, lex.WS)
499                        # But use if test to optimize.
500                        if AttNameFollow & lex.WS: 
501                                EqExpected = pablo.ScanThru(AttNameFollow, lex.WS)
502                        else: EqExpected = AttNameFollow
503                        ParseError |= EqExpected &~ lex.Equals
504                        AttValPos = pablo.AdvanceThenScanThru(EqExpected, lex.WS)
505#                       AttValPos = pablo.ScanThru(EqExpected, EqExpected | lex.WS)
506                        tag_Callouts.AttVal_starts |= AttValPos
507                        DQuoteAttVal = AttValPos & lex.DQuote
508                        SQuoteAttVal = AttValPos & lex.SQuote
509#                       DQuoteAttEnd = pablo.ScanTo(DQuoteAttVal, DQuoteDelim &~ DQuoteAttVal)
510#                       SQuoteAttEnd = pablo.ScanTo(SQuoteAttVal, SQuoteDelim &~ SQuoteAttVal)
511                        DQuoteAttEnd = pablo.AdvanceThenScanTo(DQuoteAttVal, DQuoteDelim)
512                        SQuoteAttEnd = pablo.AdvanceThenScanTo(SQuoteAttVal, SQuoteDelim)
513                        AttValEnd = DQuoteAttEnd | SQuoteAttEnd
514                        ParseError |= (AttValPos | AttValEnd) &~ (lex.DQuote | lex.SQuote)
515                        AttValFollow = pablo.Advance(AttValEnd)
516                        tag_Callouts.AttVal_ends |= AttValFollow
517                        #  AfterWS = pablo.ScanThru(AttValFollow, lex.WS)
518                        if AttValFollow & lex.WS: 
519                                AfterWS = pablo.ScanThru(AttValFollow, lex.WS)
520                                AttListEnd |= AfterWS & AttListDelim
521                                AttNameStart = AfterWS & ~AttListDelim
522                        else: 
523                                AttListEnd |= AttValFollow & AttListDelim       
524                                AttNameStart = AttValFollow & ~AttListDelim
525                        ParseError |= AttValFollow & AttNameStart
526        else:
527                # No WS character after ElemName; must be at the end
528                AttListEnd = tag_Callouts.ElemName_ends & AttListDelim
529                ParseError |= tag_Callouts.ElemName_ends & ~AttListDelim
530
531        STagEnds = AttListEnd & lex.RAngle
532        # Mark any "/" characters found as the ends of empty element tags.
533        tag_Callouts.EmptyTag_marks = pablo.Advance(AttListEnd & lex.Slash)
534       
535        ParseError |= tag_Callouts.EmptyTag_marks & ~lex.RAngle
536
537        # End Tag Parsing
538
539        EndTagEnds = pablo.AdvanceThenScanThru(tag_Callouts.EndTag_marks, lex.NameScan)
540        if EndTagEnds & lex.WS:
541                EndTagEnds = pablo.ScanThru(EndTagEnds, lex.WS)
542        ParseError |= EndTagEnds & ~lex.RAngle
543        pablo.assert_0(ParseError, "Tag parsing error found")
544               
545               
546        # Attribute value spans
547#       tag_Callouts.AttVal_spans = tag_Callouts.AttVal_ends - tag_Callouts.AttVal_starts
548        tag_Callouts.AttVal_spans = pablo.SpanUpTo(tag_Callouts.AttVal_starts, tag_Callouts.AttVal_ends)
549       
550        tag_Callouts.Tag_closing = tag_Callouts.EmptyTag_marks | tag_Callouts.EndTag_marks
551
552def Parse_refs(lex, marker, ref_Callouts):
553        ref_Callouts.GenRef_starts = 0
554        ref_Callouts.GenRef_ends = 0
555        ref_Callouts.DecRef_starts = 0
556        ref_Callouts.DecRef_ends = 0
557        ref_Callouts.HexRef_starts = 0
558        ref_Callouts.HexRef_ends = 0
559        ref_error = 0
560
561        # All remaining "&" must be reference start characters; parse them.
562        if marker.Ref_opener:
563                Ref_scope = pablo.Advance(marker.Ref_opener)
564                NumRef2 = Ref_scope & lex.Hash
565                ref_Callouts.GenRef_starts = Ref_scope &~ lex.Hash
566                NumRef3 = pablo.Advance(NumRef2)
567                HexRef3 = NumRef3 & lex.x
568                ref_Callouts.DecRef_starts = NumRef3 &~ lex.x
569                ref_Callouts.HexRef_starts = pablo.Advance(HexRef3) 
570                ref_Callouts.GenRef_ends = pablo.ScanThru(ref_Callouts.GenRef_starts, lex.NameScan)
571                ref_Callouts.DecRef_ends = pablo.ScanThru(ref_Callouts.DecRef_starts, lex.Digit)
572                ref_Callouts.HexRef_ends = pablo.ScanThru(ref_Callouts.HexRef_starts, lex.Hex)
573                # Error checks
574                # At least one digit required for DecRef, one hex digit for HexRef.
575                ref_error1 = ref_Callouts.DecRef_starts &~ lex.Digit
576                ref_error2 = ref_Callouts.HexRef_starts &~ lex.Hex
577                # Semicolon terminator required (also covers unterminated at EOF).
578                ref_ends = ref_Callouts.GenRef_ends | ref_Callouts.DecRef_ends | ref_Callouts.HexRef_ends
579                ref_error3 = ref_ends &~ lex.Semicolon
580                pablo.assert_0(ref_error1 | ref_error2 | ref_error3, "Reference error found")
581
582
583
584def Validate_xml_names(ctCDPI_Callouts, ref_Callouts, tag_Callouts, lex, u8, check_streams):
585        PI_names = pablo.SpanUpTo(ctCDPI_Callouts.PI_name_starts,ctCDPI_Callouts.PI_name_ends)
586        GenRefs = pablo.SpanUpTo(ref_Callouts.GenRef_starts,ref_Callouts.GenRef_ends)
587        ElemNames = pablo.SpanUpTo(tag_Callouts.ElemName_starts,tag_Callouts.ElemName_ends)
588        AttNames = pablo.SpanUpTo(tag_Callouts.AttName_starts, tag_Callouts.AttName_ends)
589        qname_stream =  ElemNames | AttNames
590        ncname_stream = PI_names | GenRefs
591        name_stream = qname_stream | ncname_stream
592        name_start = name_stream &~ pablo.Advance(name_stream)
593        name_cursor = name_stream & ~pablo.Advance(name_stream)
594        void_prefix_err = name_cursor & lex.Colon
595        namespace_sep = pablo.ScanThru(name_cursor, lex.NameScan &~ lex.Colon) & lex.Colon
596        local_part_start = pablo.Advance(namespace_sep)
597        local_part_err = local_part_start &~ lex.NameScan
598        colon2_err = pablo.ScanThru(local_part_start, lex.NameScan &~ lex.Colon) & lex.Colon
599        ncname_err = ncname_stream & lex.Colon
600        namespace_error = void_prefix_err | local_part_err | colon2_err | ncname_err
601        if namespace_error:
602                error_tracker.NoteError("error found", namespace_error)
603
604
605        check_streams.non_ascii_name_starts = name_start &~lex.ASCII_name_start
606        check_streams.non_ascii_names = (name_stream &~ name_start) & ~lex.ASCII_name_char & ~u8.suffix
607
608   
609def Do_check_streams(marker, tag_Callouts, check_streams):
610        pablo.assert_0(marker.CD_closer & ~tag_Callouts.AttVal_spans, "Error: ]]> in text")
611        check_streams.tag_marks = tag_Callouts.EmptyTag_marks | tag_Callouts.ElemName_starts | tag_Callouts.EndTag_marks | tag_Callouts.AttName_starts
612        check_streams.name_follows = tag_Callouts.ElemName_ends | tag_Callouts.AttName_ends
613        check_streams.att_refs = tag_Callouts.AttVal_spans & marker.Ref_opener
614
615
616def Form_Length_Group_Bitstreams(tag_Callouts):
617
618    remaining_starts = tag_Callouts.ElemName_starts
619    remaining_ends = tag_Callouts.ElemName_ends
620    temp = tag_Callouts.ElemName_starts
621
622    # Group symbols of length 1
623    temp = pablo.Advance(temp)
624    tag_Callouts.ElemName_ends_1 = temp & remaining_ends
625    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_1
626
627    # Group symbols of length 2
628    temp = pablo.Advance(temp)
629    tag_Callouts.ElemName_ends_2 = temp & remaining_ends
630    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_2
631
632    # Group symbols of length 3
633    temp = pablo.Advance(temp)
634    tag_Callouts.ElemName_ends_3 = temp & remaining_ends
635    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_3
636
637    # Group symbols of length 4
638    temp = pablo.Advance(temp)
639    tag_Callouts.ElemName_ends_4 = temp & remaining_ends
640    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_4
641
642    # Group symbols of length 5
643    temp = pablo.Advance(temp)
644    tag_Callouts.ElemName_ends_5 = temp & remaining_ends
645    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_5
646
647    # Group symbols of length 6
648    temp = pablo.Advance(temp)
649    tag_Callouts.ElemName_ends_6 = temp & remaining_ends
650    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_6
651
652    # Group symbols of length 7
653    temp = pablo.Advance(temp)
654    tag_Callouts.ElemName_ends_7 = temp & remaining_ends
655    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_7
656
657    # Group symbols of length 8
658    temp = pablo.Advance(temp)
659    tag_Callouts.ElemName_ends_8 = temp & remaining_ends
660    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_8
661
662    # Group symbols of length 9
663    temp = pablo.Advance(temp)
664    tag_Callouts.ElemName_ends_9 = temp & remaining_ends
665    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_9
666
667    # Group symbols of length 10
668    temp = pablo.Advance(temp)
669    tag_Callouts.ElemName_ends_10 = temp & remaining_ends
670    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_10
671
672    # Group symbols of length 11
673    temp = pablo.Advance(temp)
674    tag_Callouts.ElemName_ends_11 = temp & remaining_ends
675    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_11
676
677    # Group symbols of length 12
678    temp = pablo.Advance(temp)
679    tag_Callouts.ElemName_ends_12 = temp & remaining_ends
680    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_12
681
682    # Group symbols of length 13
683    temp = pablo.Advance(temp)
684    tag_Callouts.ElemName_ends_13 = temp & remaining_ends
685    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_13
686
687    # Group symbols of length 14
688    temp = pablo.Advance(temp)
689    tag_Callouts.ElemName_ends_14 = temp & remaining_ends
690    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_14
691
692    # Group symbols of length 15
693    temp = pablo.Advance(temp)
694    tag_Callouts.ElemName_ends_15 = temp & remaining_ends
695    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_15
696
697    # Group symbols of length 16
698    temp = pablo.Advance(temp)
699    tag_Callouts.ElemName_ends_16 = temp & remaining_ends
700    remaining_ends = remaining_ends & ~tag_Callouts.ElemName_ends_16
701
702    # Group symbols of length 17 and longer
703    tag_Callouts.ElemName_ends_17_and_longer = remaining_ends
704
705
706def Compute_Hash_Value_Bitstream(hash_data, basis_bits):
707    hash_data.Hash_value = basis_bits.bit_2 ^ basis_bits.bit_4 ^ basis_bits.bit_6
708    #hash_data.Hash_value = basis_bits.bit_3 ^ basis_bits.bit_5 ^ basis_bits.bit_7
709   
710def Validate_Elem_Vec(elem,basis_bits):
711        temp1 = (basis_bits.bit_0 | basis_bits.bit_1)
712        temp2 = (basis_bits.bit_2 | basis_bits.bit_3)
713        temp3 = (temp1 | temp2)
714        temp4 = (basis_bits.bit_4 | basis_bits.bit_5)
715        temp5 = (basis_bits.bit_7 &~ basis_bits.bit_6)
716        temp6 = (temp5 &~ temp4)
717        elem.purchaseOrder = (temp6 &~ temp3)
718        temp7 = (basis_bits.bit_6 &~ basis_bits.bit_7)
719        temp8 = (temp7 &~ temp4)
720        elem.shipTo = (temp8 &~ temp3)
721        temp9 = (basis_bits.bit_6 & basis_bits.bit_7)
722        temp10 = (temp9 &~ temp4)
723        elem.name = (temp10 &~ temp3)
724        temp11 = (basis_bits.bit_5 &~ basis_bits.bit_4)
725        temp12 = (basis_bits.bit_6 | basis_bits.bit_7)
726        temp13 = (temp11 &~ temp12)
727        elem.street = (temp13 &~ temp3)
728        temp14 = (temp11 & temp5)
729        elem.city = (temp14 &~ temp3)
730        temp15 = (temp11 & temp7)
731        elem.state = (temp15 &~ temp3)
732        temp16 = (temp11 & temp9)
733        elem.zip = (temp16 &~ temp3)
734        temp17 = (basis_bits.bit_4 &~ basis_bits.bit_5)
735        temp18 = (temp17 &~ temp12)
736        elem.billTo = (temp18 &~ temp3)
737        temp19 = (temp17 & temp5)
738        elem.comment = (temp19 &~ temp3)
739        temp20 = (temp17 & temp7)
740        elem.items = (temp20 &~ temp3)
741        temp21 = (temp17 & temp9)
742        elem.item = (temp21 &~ temp3)
743        temp22 = (basis_bits.bit_4 & basis_bits.bit_5)
744        temp23 = (temp22 &~ temp12)
745        elem.productName = (temp23 &~ temp3)
746        temp24 = (temp22 & temp5)
747        elem.quantity = (temp24 &~ temp3)
748        temp25 = (temp22 & temp7)
749        elem.USPrice = (temp25 &~ temp3)
750        temp26 = (temp22 & temp9)
751        elem.shipDate = (temp26 &~ temp3)
752
753
754def Main(basis_bits, lex, u8, xml_char, scope1, ctCDPI_Callouts, ref_Callouts, tag_Callouts, masks, xml_names, check_streams, hash_data):
755       
756        # Classify bytes for UTF-8 processing, whitespace and control
757        # processing and XML lexical analysis.
758        # Classify_bytes(basis_bits, lex)
759
760        # Validate UTF-8 multibyte sequences and determine the UTF-8 scope streams
761        # Validate_utf8(basis_bits, u8)
762                               
763        Classify_bytes_Validate_utf8(basis_bits, lex, u8)
764
765        Add_scope_streams(lex, scope1)
766   
767        # Parse all comments, CDATA sections and processing instructions.
768        Parse_CtCDPI(lex, marker, ctCDPI_Callouts, check_streams)
769               
770        # All remaining '<' must be tag start characters; parse tags.
771        Parse_tags(lex, marker, tag_Callouts) 
772
773        # All remaining '&' must be reference start characters; parse them.
774        Parse_refs(lex, marker, ref_Callouts)
775       
776        # Validate XML namespaces and generate bit streams to post validate non-ascii range XML names
777        Validate_xml_names(ctCDPI_Callouts, ref_Callouts, tag_Callouts, lex, u8, check_streams)
778   
779        Do_check_streams(marker, tag_Callouts, check_streams)
780        # These methods are needed to do Paralel Bitstream Based Length Sorting
781        Form_Length_Group_Bitstreams(tag_Callouts)
782
783        Compute_Hash_Value_Bitstream(hash_data, basis_bits);
784       
785               
Note: See TracBrowser for help on using the repository browser.