source: proto/xmlschema/parabix2_validation.py @ 3592

Last change on this file since 3592 was 3557, checked in by shiyangy, 6 years ago
File size: 28.4 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        tag_closing = 0
77        cc0 = 0
78        Caret = 0
79        Dot = 0
80        P_H_sign = 0
81        E_and_e = 0
82        content_end = 0
83        Neg = 0
84        cc1 = 0
85        cc2 = 0
86        cc3 = 0
87        cc4 = 0
88        cc5 = 0
89        cc6 = 0
90        cc7 = 0
91        cc8 = 0
92        cc9 = 0
93        cc10 = 0
94        cc11 = 0
95
96
97class Scope1 ():
98        RefStart = 0
99        LAngle = 0
100        Hyphen = 0
101        QMark = 0
102        RBracket = 0
103       
104class Marker ():
105        LAngle_scope = 0
106        Ref_opener = 0
107        CD_closer = 0
108
109class CtCDPI_Callouts():
110        CD_end = 0
111        Ct_starts = 0
112        Ct_ends = 0
113        CD_starts = 0
114        CD_ends = 0
115        PI_starts = 0
116        PI_name_starts = 0
117        PI_name_ends = 0
118        PI_ends = 0
119        CtCDPI_mask = 0
120
121class Ref_Callouts():
122        GenRef_starts = 0
123        GenRef_ends = 0
124        DecRef_starts = 0
125        DecRef_ends = 0
126        HexRef_starts = 0
127        HexRef_ends = 0
128
129class Hash_data():
130        Hash_value = 0
131
132class Tag_Callouts():
133        ElemName_starts = 0
134        ElemName_ends = 0
135        ElemName_ends_1 = 0
136        ElemName_ends_2 = 0
137        ElemName_ends_3 = 0
138        ElemName_ends_4 = 0
139        ElemName_ends_5 = 0
140        ElemName_ends_6 = 0
141        ElemName_ends_7 = 0
142        ElemName_ends_8 = 0
143        ElemName_ends_9 = 0
144        ElemName_ends_10 = 0
145        ElemName_ends_11 = 0
146        ElemName_ends_12 = 0
147        ElemName_ends_13 = 0
148        ElemName_ends_14 = 0
149        ElemName_ends_15 = 0
150        ElemName_ends_16 = 0
151        ElemName_ends_17_and_longer = 0
152        AttName_starts = 0
153        AttName_ends = 0
154        AttVal_starts = 0
155        AttVal_ends = 0
156        AttVal_spans = 0
157        EmptyTag_marks = 0
158        EndTag_marks = 0
159       
160        Content_starts = 0
161        Tag_closing = 0
162
163class Basis_bits():
164        bit_0 = 0
165        bit_1 = 0
166        bit_2 = 0
167        bit_3 = 0
168        bit_4 = 0
169        bit_5 = 0
170        bit_6 = 0
171        bit_7 = 0
172
173class Check_streams():
174        misc_mask = 0
175        non_ascii_name_starts = 0
176        non_ascii_names = 0
177        tag_marks = 0
178        name_follows = 0
179        att_refs = 0
180
181class Xml_names():
182        namespace_error = 0
183       
184class elem():
185        purchaseOrder = 0
186        shipTo =0
187        name =0
188        street =0
189        city =0
190        state =0
191        zip =0
192        billTo =0
193        comment =0
194        items =0
195        item =0
196        productName =0
197        quantity =0
198        USPrice =0
199        shipDate =0
200       
201class Output():
202        matches = 0
203        tem = 0
204
205def Classify_bytes_Validate_utf8(basis_bits, lex, u8):
206        temp1 = (basis_bits.bit_0 | basis_bits.bit_1);
207        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3);
208        temp3 = (temp2 &~ temp1);
209        temp4 = (basis_bits.bit_5 &~ basis_bits.bit_4);
210        temp5 = (basis_bits.bit_6 &~ basis_bits.bit_7);
211        temp6 = (temp4 & temp5);
212        lex.RefStart = (temp3 & temp6);
213        temp7 = (basis_bits.bit_2 & basis_bits.bit_3);
214        temp8 = (temp7 &~ temp1);
215        temp9 = (basis_bits.bit_4 &~ basis_bits.bit_5);
216        temp10 = (basis_bits.bit_6 & basis_bits.bit_7);
217        temp11 = (temp9 & temp10);
218        lex.Semicolon = (temp8 & temp11);
219        temp12 = (basis_bits.bit_4 & basis_bits.bit_5);
220        temp13 = (basis_bits.bit_6 | basis_bits.bit_7);
221        temp14 = (temp12 &~ temp13);
222        lex.LAngle = (temp8 & temp14);
223        temp15 = (temp12 & temp5);
224        lex.RAngle = (temp8 & temp15);
225        temp16 = (basis_bits.bit_1 &~ basis_bits.bit_0);
226        temp17 = (basis_bits.bit_3 &~ basis_bits.bit_2);
227        temp18 = (temp16 & temp17);
228        lex.LBracket = (temp18 & temp11);
229        temp19 = (basis_bits.bit_7 &~ basis_bits.bit_6);
230        temp20 = (temp12 & temp19);
231        lex.RBracket = (temp18 & temp20);
232        temp21 = (basis_bits.bit_4 | basis_bits.bit_5);
233        temp22 = (temp19 &~ temp21);
234        lex.Exclam = (temp3 & temp22);
235        temp23 = (temp12 & temp10);
236        lex.QMark = (temp8 & temp23);
237        lex.Hyphen = (temp3 & temp20);
238        lex.Equals = (temp8 & temp20);
239        temp24 = (temp4 & temp10);
240        lex.SQuote = (temp3 & temp24);
241        temp25 = (temp5 &~ temp21);
242        lex.DQuote = (temp3 & temp25);
243        lex.Slash = (temp3 & temp23);
244        temp26 = (temp10 &~ temp21);
245        lex.Hash = (temp3 & temp26);
246        temp27 = (temp16 & temp7);
247        temp28 = (temp9 &~ temp13);
248        lex.x = (temp27 & temp28);
249        temp29 = (temp9 & temp5);
250        lex.Colon = (temp8 & temp29);
251        temp30 = (temp18 & temp23);
252        temp31 = (temp30 | lex.Colon);
253        temp32 = (temp16 &~ basis_bits.bit_2);
254        temp33 = (basis_bits.bit_5 | temp10);
255        temp34 = (basis_bits.bit_4 & temp33);
256        temp35 = (~temp34);
257        temp36 = (temp21 | temp13);
258        temp37 = ((basis_bits.bit_3 & temp35)|(~(basis_bits.bit_3) & temp36));
259        temp38 = (temp32 & temp37);
260        temp39 = (temp31 | temp38);
261        temp40 = (temp16 & basis_bits.bit_2);
262        temp41 = (temp40 & temp37);
263        lex.ASCII_name_start = (temp39 | temp41);
264        temp42 = (temp30 | lex.Hyphen);
265        temp43 = (temp3 & temp15);
266        temp44 = (temp42 | temp43);
267        temp45 = (temp8 &~ temp34);
268        temp46 = (temp44 | temp45);
269        temp47 = (temp46 | temp38);
270        lex.ASCII_name_char = (temp47 | temp41);
271        lex.NameScan = (lex.ASCII_name_char | basis_bits.bit_0);
272        temp48 = (temp1 | basis_bits.bit_2);
273        x00_x1F = (~temp48);
274        temp49 = (basis_bits.bit_2 | basis_bits.bit_3);
275        temp50 = (temp1 | temp49);
276        lex.CR = (temp20 &~ temp50);
277        lex.LF = (temp29 &~ temp50);
278        temp51 = (temp9 & temp19);
279        lex.HT = (temp51 &~ temp50);
280        lex.SP = (temp3 &~ temp36);
281        temp52 = (temp20 | temp29);
282        temp53 = (temp52 | temp51);
283        temp54 = (temp53 &~ temp50);
284        lex.WS = (temp54 | lex.SP);
285        temp55 = (basis_bits.bit_5 | basis_bits.bit_6);
286        temp56 = (basis_bits.bit_4 & temp55);
287        lex.Digit = (temp8 &~ temp56);
288        temp57 = (temp16 &~ temp49);
289        temp58 = (temp57 &~ basis_bits.bit_4);
290        temp59 = (~temp10);
291        temp60 = ((basis_bits.bit_5 & temp59)|(~(basis_bits.bit_5) & temp13));
292        temp61 = (temp58 & temp60);
293        temp62 = (lex.Digit | temp61);
294        temp63 = (temp16 & temp2);
295        temp64 = (temp63 &~ basis_bits.bit_4);
296        temp65 = (temp64 & temp60);
297        lex.Hex = (temp62 | temp65);
298        lex_error = x00_x1F &~ lex.WS
299        if lex_error & EOF_mask:
300                error_tracker.NoteError("Error: illegal character", lex_error)
301
302
303        ### Validate_utf8(basis_bits, u8):
304        u8.unibyte = (~basis_bits.bit_0);
305        u8.suffix = 0
306        u8_error = 0
307        u8_FFFE_FFFF = 0
308        u8anyscope = 0 #local
309        if basis_bits.bit_0:
310                u8.prefix = (basis_bits.bit_0 & basis_bits.bit_1);
311                u8.prefix2 = (u8.prefix &~ basis_bits.bit_2);
312                u8.prefix3 = (u8.prefix & temp2);
313                u8.prefix4 = (u8.prefix & temp7);
314                u8.suffix = (basis_bits.bit_0 &~ basis_bits.bit_1);
315                temp66 = (u8.prefix &~ temp49);
316                temp67 = (temp21 | basis_bits.bit_6);
317                temp68 = (temp66 &~ temp67);
318                temp69 = (basis_bits.bit_5 & temp13);
319                temp70 = (basis_bits.bit_4 | temp69);
320                temp71 = (u8.prefix4 & temp70);
321                u8.badprefix = (temp68 | temp71);
322                u8_error = u8.badprefix
323                u8.scope22 = pablo.Advance(u8.prefix2)
324                u8anyscope = u8.scope22
325                if u8.prefix3 | u8.prefix4:
326                        xE0 = (u8.prefix3 &~ temp36);
327                        xED = (u8.prefix3 & temp20);
328                        xF0 = (u8.prefix4 &~ temp36);
329                        temp72 = (temp4 &~ temp13);
330                        xF4 = (u8.prefix4 & temp72);
331                        u8.xA0_xBF = (u8.suffix & basis_bits.bit_2);
332                        u8.x80_x9F = (u8.suffix &~ basis_bits.bit_2);
333                        u8.x90_xBF = (u8.suffix & temp49);
334                        u8.x80_x8F = (u8.suffix &~ temp49);
335                        xEF = (u8.prefix3 & temp23);
336                        temp73 = (u8.suffix & temp7);
337                        u8.xBF = (temp73 & temp23);
338                        u8.xBE = (temp73 & temp15);
339                        u8.xE0_scope = pablo.Advance(xE0);
340                        u8.xED_scope = pablo.Advance(xED);
341                        u8.xF0_scope = pablo.Advance(xF0);
342                        u8.xF4_scope = pablo.Advance(xF4);
343                        u8.xEF_scope = pablo.Advance(xEF);
344                        u8.scope32 = pablo.Advance(u8.prefix3)
345                        u8.scope33 = pablo.Advance(u8.scope32)
346                        u8.scope42 = pablo.Advance(u8.prefix4)
347                        u8.scope43 = pablo.Advance(u8.scope42)
348                        u8.scope44 = pablo.Advance(u8.scope43)
349
350                        u8lastscope = u8.scope22 | u8.scope33 | u8.scope44
351                        u8anyscope = u8lastscope | u8.scope32 | u8.scope42 | u8.scope43
352
353                        u8error1 = u8.xE0_scope & u8.x80_x9F
354                        u8error2 = u8.xED_scope & u8.xA0_xBF
355                        u8error3 = u8.xF0_scope & u8.x80_x8F
356                        u8error4 = u8.xF4_scope & u8.x90_xBF
357
358                        u8_error |= u8error1 | u8error2 | u8error3 | u8error4
359
360                        EF_BF_pending = pablo.Advance(u8.xEF_scope & u8.xBF)
361
362                        u8_FFFE_FFFF = (EF_BF_pending & (u8.xBE | u8.xBF))
363                u8mismatch = u8anyscope ^ u8.suffix
364                u8_error |= u8mismatch | u8_FFFE_FFFF
365                if u8_error:
366                        error_tracker.NoteError("UTF-8 error found", (u8_error))
367                       
368        temp1 = (basis_bits.bit_0 | basis_bits.bit_1)
369        temp2 = (basis_bits.bit_2 & basis_bits.bit_3)
370        temp3 = (temp2 &~ temp1)
371        temp4 = (basis_bits.bit_5 | basis_bits.bit_6)
372        temp5 = (~temp4)
373        temp6 = (basis_bits.bit_6 | basis_bits.bit_7)
374        temp7 = (basis_bits.bit_5 | temp6)
375        temp8 = ((basis_bits.bit_4 & temp5)|(~(basis_bits.bit_4) & temp7))
376        lex.Digit = (temp3 & temp8)
377        temp9 = (basis_bits.bit_2 | basis_bits.bit_3)
378        temp10 = (temp1 | temp9)
379        temp11 = (basis_bits.bit_4 & temp4)
380        temp12 = (temp10 | temp11)
381        temp13 = (basis_bits.bit_6 & basis_bits.bit_7)
382        temp14 = (basis_bits.bit_5 | temp13)
383        temp15 = (basis_bits.bit_4 & temp14)
384        temp16 = (temp9 | temp15)
385        temp17 = (basis_bits.bit_1 | temp16)
386        temp18 = (basis_bits.bit_0 | temp17)
387        temp19 = (temp12 &~ temp18)
388        lex.Caret = (~temp19)
389        temp20 = (basis_bits.bit_2 &~ basis_bits.bit_3)
390        temp21 = (temp20 &~ temp1)
391        temp22 = (basis_bits.bit_4 & basis_bits.bit_5)
392        temp23 = (basis_bits.bit_7 &~ basis_bits.bit_6)
393        temp24 = (temp22 & temp23)
394        lex.Neg = (temp21 & temp24)
395        temp25 = (basis_bits.bit_4 | basis_bits.bit_5)
396        temp26 = (temp13 &~ temp25)
397        lex.content_end = (temp21 & temp26)
398        temp27 = (basis_bits.bit_4 &~ basis_bits.bit_5)
399        temp28 = (basis_bits.bit_6 &~ basis_bits.bit_7)
400        temp29 = (temp27 & temp28)
401       
402       
403
404def Add_scope_streams(lex, scope1):
405        #scope1.LAngle = pablo.Advance(lex.LAngle)
406        #scope1.Hyphen = pablo.Advance(lex.Hyphen)
407        #scope1.QMark = pablo.Advance(lex.QMark)
408        v = lex.LAngle | lex.Hyphen
409        w = lex.Hyphen | lex.QMark
410        v1 = pablo.Advance(v)
411        w1 = pablo.Advance(w)
412        scope1.LAngle = v1 &~ w1
413        scope1.Hyphen = v1 & w1
414        scope1.QMark = w1 &~ v1
415        scope1.RefStart = 0 # default
416
417def Parse_CtCDPI(lex, marker, ctCDPI_Callouts, check_streams):
418        ctCDPI_Callouts.Ct_starts = 0
419        ctCDPI_Callouts.Ct_ends = 0
420        ctCDPI_Callouts.CD_starts = 0
421        ctCDPI_Callouts.CD_ends = 0
422        ctCDPI_Callouts.PI_starts = 0
423        ctCDPI_Callouts.PI_name_starts = 0
424        ctCDPI_Callouts.PI_name_ends = 0
425        ctCDPI_Callouts.PI_ends = 0
426        CtCDPI_starts = 0
427        CtCDPI_ends = 0
428        ctCDPI_mask = 0
429
430        v = lex.LAngle | lex.Hyphen
431        w = lex.Hyphen | lex.QMark
432        v1 = pablo.Advance(v,1)
433        w1 = pablo.Advance(w,1)
434       
435        LAngle_scope = v1 &~ w1  #pablo.Advance(lex.LAngle)
436        PI_opener = LAngle_scope & lex.QMark
437        CtCD_opener= LAngle_scope & lex.Exclam
438        CtCDPI_opener = PI_opener | CtCD_opener
439
440        #DoubleHyphen = 0
441        CD_closer = 0
442        #PI_closer = 0
443       
444        #if lex.Hyphen: DoubleHyphen = pablo.Advance(lex.Hyphen) & lex.Hyphen
445        DoubleHyphen = v1 & w1 & lex.Hyphen
446        if lex.RBracket:
447                DoubleRBracket = pablo.Advance(lex.RBracket) & lex.RBracket
448                CD_closer = pablo.Advance(DoubleRBracket) & lex.RAngle
449        #if lex.QMark: PI_closer = pablo.Advance(lex.QMark) & lex.RAngle
450        PI_closer = w1 & ~v1 & lex.RAngle
451
452        #
453        # Initiate the scan
454        CtCDPI_Cursor = pablo.ScanToFirst(CtCDPI_opener)
455        while CtCDPI_Cursor:
456                CtCDPI_starts |= CtCDPI_Cursor
457                PI_Cursor = CtCDPI_Cursor & PI_opener
458                CD_Ct_Cursor = pablo.Advance(CtCDPI_Cursor & ~PI_Cursor)
459                CD_Cursor = CD_Ct_Cursor & lex.LBracket
460                Ct_Cursor = CD_Ct_Cursor & lex.Hyphen
461                # PI processing
462                if PI_Cursor:
463                        ctCDPI_Callouts.PI_starts |= PI_Cursor
464                        PI_Cursor = pablo.Advance(PI_Cursor)
465                        ctCDPI_Callouts.PI_name_starts |= PI_Cursor
466                        PI_name_end = pablo.ScanThru(PI_Cursor, lex.NameScan)
467                        PI_error = PI_Cursor & PI_name_end
468                        PI_noWS = PI_name_end & ~ lex.WS
469                        PI_error |= PI_noWS &~ lex.QMark | pablo.Advance(PI_noWS) &~ PI_closer
470                        pablo.assert_0(PI_error, "Error in PI syntax")
471                        ctCDPI_Callouts.PI_name_ends |= PI_name_end
472                        PI_Cursor = pablo.ScanTo(PI_name_end, PI_closer)
473                        ctCDPI_Callouts.PI_ends |= PI_Cursor
474                        CtCDPI_ends |= PI_Cursor
475
476                # CDATA section processing
477                if CD_Cursor:
478                        ctCDPI_Callouts.CD_starts |= CD_Cursor
479                        CD_Cursor = pablo.ScanTo(CD_Cursor, CD_closer)
480                        ctCDPI_Callouts.CD_ends |= CD_Cursor
481                        CtCDPI_ends |= CD_Cursor
482
483                # Comment processing
484                if Ct_Cursor:
485                        ctCDPI_Callouts.Ct_starts |= Ct_Cursor
486                        Ct_Cursor = pablo.Advance(Ct_Cursor) 
487                        Ct_error = Ct_Cursor & ~ lex.Hyphen
488                        # Advance twice past <!--, so that we don't treat <!---
489                        # as being a terminated comment.
490                        Ct_Cursor = pablo.Advance(pablo.Advance(Ct_Cursor))
491                        Ct_Cursor = pablo.Advance(pablo.ScanTo(Ct_Cursor, DoubleHyphen))
492                        pablo.assert_0(Ct_error | Ct_Cursor & ~ lex.RAngle, "Error in comment syntax")
493                        ctCDPI_Callouts.Ct_ends |= Ct_Cursor
494                        CtCDPI_ends |= Ct_Cursor
495
496                # Common processing
497                CtCDPI_Cursor = PI_Cursor | CD_Cursor | Ct_Cursor
498                ctCDPI_mask = pablo.InclusiveSpan(CtCDPI_starts, CtCDPI_ends)
499#               ctCDPI_mask |= (CtCDPI_ends - CtCDPI_starts) | CtCDPI_ends
500                # If any of the Comment, CDATA or PI markups are unterminated, it is an error.
501                pablo.assert_0(pablo.atEOF(ctCDPI_mask), "Error in comment, CDATA or processing instruction syntax")
502                CtCDPI_Cursor = pablo.ScanTo(CtCDPI_Cursor, CtCDPI_opener)     
503               
504#       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
505#  Following is slow
506        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
507
508
509        # Identify the remaining significant markers for XML processing.
510        marker.LAngle_scope = LAngle_scope &~ ctCDPI_mask
511        marker.Ref_opener = lex.RefStart &~ ctCDPI_mask
512        marker.CD_closer = CD_closer &~ ctCDPI_mask
513
514def Parse_tags(lex, marker, tag_Callouts):
515       
516        EqExpected = 0
517        AttListEnd = 0
518       
519        # Delimiters for scans.
520        DQuoteDelim = lex.DQuote | lex.LAngle
521        SQuoteDelim = lex.SQuote | lex.LAngle
522        AttListDelim = lex.Slash | lex.RAngle
523       
524        # Start the parallel parsing by inspecting the character
525        # after the opening "<" of a tag.
526        tag_Callouts.ElemName_starts = marker.LAngle_scope & ~lex.Slash
527        tag_Callouts.EndTag_marks = marker.LAngle_scope & lex.Slash
528       
529        # Start Tag/Empty Element Tag Parsing
530
531        # Advance all cursors by scanning through the tag name.
532        tag_Callouts.ElemName_ends = pablo.ScanThru(tag_Callouts.ElemName_starts, lex.NameScan)
533        # Must have at least one name character for a legal start tag.
534        # Mark any occurrences of null names as errors.
535        ParseError = tag_Callouts.ElemName_starts & tag_Callouts.ElemName_ends
536       
537        # Initialize the accumulators for attribute name and value positions.
538        tag_Callouts.AttName_starts = 0 
539        tag_Callouts.AttName_ends = 0
540        tag_Callouts.AttVal_starts = 0
541        tag_Callouts.AttVal_ends = 0
542        # After the element name, there may or may not be an attlist.
543        if tag_Callouts.ElemName_ends & lex.WS:
544                AfterWS = pablo.ScanThru(tag_Callouts.ElemName_ends, lex.WS)
545                AttListEnd = AfterWS & AttListDelim
546                AttNameStart = AfterWS & ~AttListDelim
547                #
548                # The following loop iterates through attributes within a start tag.
549                # Because all start tags are processed in parallel, the number of
550                # iterations is the maximum number of attributes found in any one
551                # start tag, plus one.
552                while AttNameStart:
553                        ParseError |= AttNameStart &~ lex.NameScan
554                        tag_Callouts.AttName_starts |= AttNameStart
555                        AttNameFollow = pablo.ScanThru(AttNameStart, lex.NameScan)
556                        tag_Callouts.AttName_ends |= AttNameFollow
557                        # Scan through WS to the expected '=' delimiter.
558                        # EqExpected = pablo.ScanThru(AttNameFollow, lex.WS)
559                        # But use if test to optimize.
560                        if AttNameFollow & lex.WS: 
561                                EqExpected = pablo.ScanThru(AttNameFollow, lex.WS)
562                        else: EqExpected = AttNameFollow
563                        ParseError |= EqExpected &~ lex.Equals
564                        AttValPos = pablo.AdvanceThenScanThru(EqExpected, lex.WS)
565#                       AttValPos = pablo.ScanThru(EqExpected, EqExpected | lex.WS)
566                        tag_Callouts.AttVal_starts |= AttValPos
567                        DQuoteAttVal = AttValPos & lex.DQuote
568                        SQuoteAttVal = AttValPos & lex.SQuote
569#                       DQuoteAttEnd = pablo.ScanTo(DQuoteAttVal, DQuoteDelim &~ DQuoteAttVal)
570#                       SQuoteAttEnd = pablo.ScanTo(SQuoteAttVal, SQuoteDelim &~ SQuoteAttVal)
571                        DQuoteAttEnd = pablo.AdvanceThenScanTo(DQuoteAttVal, DQuoteDelim)
572                        SQuoteAttEnd = pablo.AdvanceThenScanTo(SQuoteAttVal, SQuoteDelim)
573                        AttValEnd = DQuoteAttEnd | SQuoteAttEnd
574                        ParseError |= (AttValPos | AttValEnd) &~ (lex.DQuote | lex.SQuote)
575                        AttValFollow = pablo.Advance(AttValEnd)
576                        tag_Callouts.AttVal_ends |= AttValFollow
577                        #  AfterWS = pablo.ScanThru(AttValFollow, lex.WS)
578                        if AttValFollow & lex.WS: 
579                                AfterWS = pablo.ScanThru(AttValFollow, lex.WS)
580                                AttListEnd |= AfterWS & AttListDelim
581                                AttNameStart = AfterWS & ~AttListDelim
582                        else: 
583                                AttListEnd |= AttValFollow & AttListDelim       
584                                AttNameStart = AttValFollow & ~AttListDelim
585                        ParseError |= AttValFollow & AttNameStart
586        else:
587                # No WS character after ElemName; must be at the end
588                AttListEnd = tag_Callouts.ElemName_ends & AttListDelim
589                ParseError |= tag_Callouts.ElemName_ends & ~AttListDelim
590
591        STagEnds = AttListEnd & lex.RAngle
592        # Mark any "/" characters found as the ends of empty element tags.
593        tag_Callouts.EmptyTag_marks = pablo.Advance(AttListEnd & lex.Slash)
594       
595        ParseError |= tag_Callouts.EmptyTag_marks & ~lex.RAngle
596
597        # End Tag Parsing
598
599        EndTagEnds = pablo.AdvanceThenScanThru(tag_Callouts.EndTag_marks, lex.NameScan)
600        if EndTagEnds & lex.WS:
601                EndTagEnds = pablo.ScanThru(EndTagEnds, lex.WS)
602        ParseError |= EndTagEnds & ~lex.RAngle
603        pablo.assert_0(ParseError, "Tag parsing error found")
604               
605               
606        # Attribute value spans
607#       tag_Callouts.AttVal_spans = tag_Callouts.AttVal_ends - tag_Callouts.AttVal_starts
608        tag_Callouts.AttVal_spans = pablo.SpanUpTo(tag_Callouts.AttVal_starts, tag_Callouts.AttVal_ends)
609       
610        tag_Callouts.Content_starts = STagEnds
611        tag_Callouts.Tag_closing = tag_Callouts.EmptyTag_marks | tag_Callouts.EndTag_marks
612
613def Parse_refs(lex, marker, ref_Callouts):
614        ref_Callouts.GenRef_starts = 0
615        ref_Callouts.GenRef_ends = 0
616        ref_Callouts.DecRef_starts = 0
617        ref_Callouts.DecRef_ends = 0
618        ref_Callouts.HexRef_starts = 0
619        ref_Callouts.HexRef_ends = 0
620        ref_error = 0
621
622        # All remaining "&" must be reference start characters; parse them.
623        if marker.Ref_opener:
624                Ref_scope = pablo.Advance(marker.Ref_opener)
625                NumRef2 = Ref_scope & lex.Hash
626                ref_Callouts.GenRef_starts = Ref_scope &~ lex.Hash
627                NumRef3 = pablo.Advance(NumRef2)
628                HexRef3 = NumRef3 & lex.x
629                ref_Callouts.DecRef_starts = NumRef3 &~ lex.x
630                ref_Callouts.HexRef_starts = pablo.Advance(HexRef3) 
631                ref_Callouts.GenRef_ends = pablo.ScanThru(ref_Callouts.GenRef_starts, lex.NameScan)
632                ref_Callouts.DecRef_ends = pablo.ScanThru(ref_Callouts.DecRef_starts, lex.Digit)
633                ref_Callouts.HexRef_ends = pablo.ScanThru(ref_Callouts.HexRef_starts, lex.Hex)
634                # Error checks
635                # At least one digit required for DecRef, one hex digit for HexRef.
636                ref_error1 = ref_Callouts.DecRef_starts &~ lex.Digit
637                ref_error2 = ref_Callouts.HexRef_starts &~ lex.Hex
638                # Semicolon terminator required (also covers unterminated at EOF).
639                ref_ends = ref_Callouts.GenRef_ends | ref_Callouts.DecRef_ends | ref_Callouts.HexRef_ends
640                ref_error3 = ref_ends &~ lex.Semicolon
641                pablo.assert_0(ref_error1 | ref_error2 | ref_error3, "Reference error found")
642
643
644
645def Validate_xml_names(ctCDPI_Callouts, ref_Callouts, tag_Callouts, lex, u8, check_streams):
646        PI_names = pablo.SpanUpTo(ctCDPI_Callouts.PI_name_starts,ctCDPI_Callouts.PI_name_ends)
647        GenRefs = pablo.SpanUpTo(ref_Callouts.GenRef_starts,ref_Callouts.GenRef_ends)
648        ElemNames = pablo.SpanUpTo(tag_Callouts.ElemName_starts,tag_Callouts.ElemName_ends)
649        AttNames = pablo.SpanUpTo(tag_Callouts.AttName_starts, tag_Callouts.AttName_ends)
650        qname_stream =  ElemNames | AttNames
651        ncname_stream = PI_names | GenRefs
652        name_stream = qname_stream | ncname_stream
653        name_start = name_stream &~ pablo.Advance(name_stream)
654        name_cursor = name_stream & ~pablo.Advance(name_stream)
655        void_prefix_err = name_cursor & lex.Colon
656        namespace_sep = pablo.ScanThru(name_cursor, lex.NameScan &~ lex.Colon) & lex.Colon
657        local_part_start = pablo.Advance(namespace_sep)
658        local_part_err = local_part_start &~ lex.NameScan
659        colon2_err = pablo.ScanThru(local_part_start, lex.NameScan &~ lex.Colon) & lex.Colon
660        ncname_err = ncname_stream & lex.Colon
661        namespace_error = void_prefix_err | local_part_err | colon2_err | ncname_err
662        if namespace_error:
663                error_tracker.NoteError("error found", namespace_error)
664
665
666        check_streams.non_ascii_name_starts = name_start &~lex.ASCII_name_start
667        check_streams.non_ascii_names = (name_stream &~ name_start) & ~lex.ASCII_name_char & ~u8.suffix
668
669   
670def Do_check_streams(marker, tag_Callouts, check_streams):
671        pablo.assert_0(marker.CD_closer & ~tag_Callouts.AttVal_spans, "Error: ]]> in text")
672        check_streams.tag_marks = tag_Callouts.EmptyTag_marks | tag_Callouts.ElemName_starts | tag_Callouts.EndTag_marks | tag_Callouts.AttName_starts
673        check_streams.name_follows = tag_Callouts.ElemName_ends | tag_Callouts.AttName_ends
674        check_streams.att_refs = tag_Callouts.AttVal_spans & marker.Ref_opener
675
676
677def Classify_bytes(basis_bits,lex):
678        temp1 = (basis_bits.bit_0 | basis_bits.bit_1)
679        temp2 = (basis_bits.bit_2 | basis_bits.bit_3)
680        temp3 = (temp1 | temp2)
681        temp4 = (basis_bits.bit_4 | basis_bits.bit_5)
682        temp5 = (basis_bits.bit_7 &~ basis_bits.bit_6)
683        temp6 = (temp5 &~ temp4)
684        lex.cc1 = (temp6 &~ temp3)
685        temp7 = (basis_bits.bit_6 &~ basis_bits.bit_7)
686        temp8 = (temp7 &~ temp4)
687        lex.cc2 = (temp8 &~ temp3)
688        temp9 = (basis_bits.bit_6 & basis_bits.bit_7)
689        temp10 = (temp9 &~ temp4)
690        lex.cc3 = (temp10 &~ temp3)
691        temp11 = (basis_bits.bit_5 &~ basis_bits.bit_4)
692        temp12 = (basis_bits.bit_6 | basis_bits.bit_7)
693        temp13 = (temp11 &~ temp12)
694        lex.cc4 = (temp13 &~ temp3)
695        temp14 = (temp11 & temp5)
696        lex.cc5 = (temp14 &~ temp3)
697        temp15 = (temp11 & temp7)
698        lex.cc6 = (temp15 &~ temp3)
699        temp16 = (temp11 & temp9)
700        lex.cc7 = (temp16 &~ temp3)
701        temp17 = (basis_bits.bit_4 &~ basis_bits.bit_5)
702        temp18 = (temp17 &~ temp12)
703        lex.cc8 = (temp18 &~ temp3)
704        temp19 = (temp17 & temp5)
705        lex.cc9 = (temp19 &~ temp3)
706        temp20 = (temp17 & temp7)
707        lex.cc10 = (temp20 &~ temp3)
708        temp21 = (temp17 & temp9)
709        lex.cc11 = (temp21 &~ temp3)
710        temp22 = (temp4 | temp12)
711        temp23 = (temp3 | temp22)
712        lex.tag_closing = (~temp23)
713
714       
715def Validation_2(lex, output):
716        m0=0
717        m1=0
718        m2=0
719        m3=0
720        m4=0
721        m0=~0
722        m0 = pablo.Advance((m0 & lex.cc2))
723        m0 = pablo.Advance((m0 & lex.cc3))
724        m0 = pablo.Advance((m0 & lex.tag_closing))
725        m0 = pablo.Advance((m0 & lex.cc4))
726        m0 = (lex.tag_closing & m0)
727        if (lex.tag_closing & m0):
728                        m0 = pablo.Advance((m0 & lex.tag_closing))
729                        m0 = pablo.Advance((m0 & lex.cc5))
730                        m0 = pablo.Advance((m0 & lex.tag_closing))
731                        m1 = m0
732                        m1 = pablo.Advance((m1 & lex.cc6))
733                        m1 = pablo.Advance((m1 & lex.tag_closing))
734                        m0 = m1
735                        m1 = m0
736                        m1 = pablo.Advance((m1 & lex.cc6))
737                        m1 = pablo.Advance((m1 & lex.tag_closing))
738                        while (~m0 & m1):
739                                        m0 = (m0 | m1)
740                                        m1 = pablo.Advance((m1 & lex.cc6))
741                                        m1 = pablo.Advance((m1 & lex.tag_closing))
742                        m3 = m0
743                        m3 = pablo.Advance((m3 & lex.cc7))
744                        m3 = pablo.Advance((m3 & lex.tag_closing))
745                        m0 = m3
746                        m3 = m0
747                        m3 = pablo.Advance((m3 & lex.cc7))
748                        m3 = pablo.Advance((m3 & lex.tag_closing))
749                        while (~m0 & m3):
750                                        m0 = (m0 | m3)
751                                        m3 = pablo.Advance((m3 & lex.cc7))
752                                        m3 = pablo.Advance((m3 & lex.tag_closing))
753        m0 = pablo.Advance((m0 & lex.tag_closing))
754        output.matches = m0
755               
756def Validation_8(lex, output):
757        m0=0
758        m1=0
759        m0=~0
760        m0 = pablo.Advance((m0 & lex.cc8))
761        m1 = m0
762        m0 = pablo.Advance((m0 & lex.cc9))
763        m0 = pablo.Advance((m0 & lex.tag_closing))
764        m1 = pablo.Advance((m1 & lex.cc10))
765        m1 = pablo.Advance((m1 & lex.tag_closing))
766        m0 = (m0 | m1)
767        m0 = pablo.Advance((m0 & lex.tag_closing))
768        output.matches = m0 ^ lex.cc8
769       
770def Validation_11(lex, output):
771        m0=0
772        m0=~0
773        m0 = pablo.Advance((m0 & lex.cc11))
774        m0 = pablo.Advance((m0 & lex.cc2))
775        m0 = pablo.Advance((m0 & lex.tag_closing))
776        m0 = pablo.Advance((m0 & lex.cc8))
777        m0 = pablo.Advance((m0 & lex.tag_closing))
778        m0 = pablo.Advance((m0 & lex.tag_closing))
779        output.matches = m0 ^ lex.cc11
780
781def Validate_content_6(lex, output):
782        m0=0
783        m1=0
784        m2=0
785        m3=0
786        m4=0
787        m5=0
788        m6=0
789        m7=0
790        m0=~0
791        m1 = m0
792        m0 = (m0 & ~pablo.Advance(lex.Caret))
793        m1 = pablo.Advance((m1 & lex.content_end))
794        m0 = (m0 | m1)
795        m2 = m0
796        m2 = pablo.Advance((m2 & lex.Digit))
797        m2 = pablo.Advance((m2 & lex.Digit))
798        m2 = pablo.Advance((m2 & lex.Digit))
799        m0 = m2
800        m0 = pablo.Advance((m0 & lex.Neg))
801        m4 = m0
802        m4 = pablo.Advance((m4 & lex.Digit))
803        m4 = pablo.Advance((m4 & lex.Digit))
804        m4 = pablo.Advance((m4 & lex.Digit))
805        m0 = m4
806        m0 = pablo.Advance((m0 & lex.Neg))
807        m6 = m0
808        m6 = pablo.Advance((m6 & lex.Digit))
809        m6 = pablo.Advance((m6 & lex.Digit))
810        m6 = pablo.Advance((m6 & lex.Digit))
811        m6 = pablo.Advance((m6 & lex.Digit))
812        m0 = m6
813        m0 = pablo.Advance((m0 & lex.content_end))
814        output.matches = m0 ^ lex.content_end
815       
816def Validate_content_9(lex, output):
817        m0=0
818        m1=0
819        m2=0
820        m3=0
821        m0=~0
822        m1 = m0
823        m0 = (m0 & ~pablo.Advance(lex.Caret))
824        m1 = pablo.Advance((m1 & lex.content_end))
825        m0 = (m0 | m1)
826        t1 = lex.Digit
827        t2 = (pablo.Advance(t1,1) & t1)
828        t4 = (pablo.Advance(t2,2) & t2)
829        t8 = (pablo.Advance(t4,4) & t4)
830        t16 = (pablo.Advance(t8,8) & t8)
831        m0 = pablo.Advance((pablo.Advance(m0,15) & t16))
832        m0 = pablo.Advance((m0 & lex.content_end))
833        output.matches = m0 ^ lex.content_end
834       
835def Validate_content_10(lex, output):
836        m0=0
837        m1=0
838        m2=0
839        m3=0
840        m0=~0
841        m1 = m0
842        m0 = (m0 & ~pablo.Advance(lex.Caret))
843        m1 = pablo.Advance((m1 & lex.content_end))
844        m0 = (m0 | m1)
845        t1 = lex.Digit
846        t2 = (pablo.Advance(t1,1) & t1)
847        t4 = (pablo.Advance(t2,2) & t2)
848        t8 = (pablo.Advance(t4,4) & t4)
849        t13 = (pablo.Advance(t8,5) & t8)
850        m0 = pablo.Advance((pablo.Advance(m0,12) & t13))
851        m0 = pablo.Advance((m0 & lex.content_end))
852        output.matches = m0 ^ lex.content_end
853
854def Validate_content_7(lex, output):
855        m0=0
856        m1=0
857        m2=0
858        m3=0
859        m4=0
860        m5=0
861        m6=0
862        m7=0
863        m8=0
864        m9=0
865        m10=0
866        m11=0
867        m12=0
868        m13=0
869        m14=0
870        m15=0
871        m16=0
872        m17=0
873        m0=~0
874        m1 = m0
875        m0 = (m0 & ~pablo.Advance(lex.Caret))
876        m1 = pablo.Advance((m1 & lex.content_end))
877        m0 = (m0 | m1)
878        m2 = m0
879        m2 = pablo.Advance((m2 & lex.P_H_sign))
880        m0 = (m0 | m2)
881        m0 = pablo.MatchStar(m0, lex.Digit)
882        m7 = m0
883        m7 = pablo.Advance((m7 & lex.Dot))
884        m0 = (m0 | m7)
885        m9 = m0
886        m9 = pablo.Advance((m9 & lex.Digit))
887        m0 = m9
888        m0 = pablo.MatchStar(m0, lex.Digit)
889        output.tem = m9
890        temp = m0
891        m11 = m0
892        m11 = pablo.Advance((m11 & lex.E_and_e))
893        m13 = m11
894        m13 = pablo.Advance((m13 & lex.P_H_sign))
895        m11 = (m11 | m13)
896        m16 = m11
897        m16 = pablo.Advance((m16 & lex.Digit))
898        m11 = m16
899        m11 = pablo.MatchStar(m11, lex.Digit)
900        m0 = (m0 | m11)
901        m0 = pablo.Advance((m0 & lex.content_end))
902        output.matches = m0
903
904def Validation_3(lex, output):
905        m0=0
906        m0=~0
907        m0 = pablo.Advance((m0 & lex.cc3))
908        m0 = pablo.Advance((m0 & lex.tag_closing))
909        output.matches = m0
910
911def Validation_4(lex, output):
912        m0=0
913        m0=~0
914        m0 = pablo.Advance((m0 & lex.cc4))
915        m0 = pablo.Advance((m0 & lex.tag_closing))
916        output.matches = m0
917
918def Validation_5(lex, output):
919        m0=0
920        m0=~0
921        m0 = pablo.Advance((m0 & lex.cc5))
922        m0 = pablo.Advance((m0 & lex.tag_closing))
923        output.matches = m0
924
925def Validation_6(lex, output):
926        m0=0
927        m0=~0
928        m0 = pablo.Advance((m0 & lex.cc6))
929        m0 = pablo.Advance((m0 & lex.tag_closing))
930        output.matches = m0
931
932def Validation_7(lex, output):
933        m0=0
934        m0=~0
935        m0 = pablo.Advance((m0 & lex.cc7))
936        m0 = pablo.Advance((m0 & lex.tag_closing))
937        output.matches = m0
938
939def Validation_9(lex, output):
940        m0=0
941        m0=~0
942        m0 = pablo.Advance((m0 & lex.cc9))
943        m0 = pablo.Advance((m0 & lex.tag_closing))
944        output.matches = m0
945
946def Validation_10(lex, output):
947        m0=0
948        m0=~0
949        m0 = pablo.Advance((m0 & lex.cc10))
950        m0 = pablo.Advance((m0 & lex.tag_closing))
951        output.matches = m0
952
953       
954
955def Main(basis_bits, lex, u8, xml_char, scope1, ctCDPI_Callouts, ref_Callouts, tag_Callouts, masks, xml_names, check_streams, hash_data):
956       
957        # Classify bytes for UTF-8 processing, whitespace and control
958        # processing and XML lexical analysis.
959        # Classify_bytes(basis_bits, lex)
960
961        # Validate UTF-8 multibyte sequences and determine the UTF-8 scope streams
962        # Validate_utf8(basis_bits, u8)
963                               
964        Classify_bytes_Validate_utf8(basis_bits, lex, u8)
965
966        Add_scope_streams(lex, scope1)
967   
968        # Parse all comments, CDATA sections and processing instructions.
969        Parse_CtCDPI(lex, marker, ctCDPI_Callouts, check_streams)
970               
971        # All remaining '<' must be tag start characters; parse tags.
972        Parse_tags(lex, marker, tag_Callouts) 
973
974        # All remaining '&' must be reference start characters; parse them.
975        Parse_refs(lex, marker, ref_Callouts)
976       
977        # Validate XML namespaces and generate bit streams to post validate non-ascii range XML names
978        Validate_xml_names(ctCDPI_Callouts, ref_Callouts, tag_Callouts, lex, u8, check_streams)
979   
980        Do_check_streams(marker, tag_Callouts, check_streams)
981        # These methods are needed to do Paralel Bitstream Based Length Sorting
982#       Form_Length_Group_Bitstreams(tag_Callouts)
983
984#       Compute_Hash_Value_Bitstream(hash_data, basis_bits);
985       
986               
Note: See TracBrowser for help on using the repository browser.