source: proto/xmlschema/parabix2_validation_cc_po2.py @ 3592

Last change on this file since 3592 was 3552, checked in by shiyangy, 6 years ago

test case added

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