source: proto/parabix2/parse_CtCDPI_prescan.py @ 3730

Last change on this file since 3730 was 2592, checked in by ksherdy, 7 years ago

Changed scanword_t type to ScanWord?.

File size: 4.2 KB
Line 
1def Parse_CtCDPI(lex, marker, ctCDPI_Callouts, check_streams):
2        ctCDPI_Callouts.Ct_starts = 0
3        ctCDPI_Callouts.Ct_ends = 0
4        ctCDPI_Callouts.CD_starts = 0
5        ctCDPI_Callouts.CD_ends = 0
6        ctCDPI_Callouts.PI_starts = 0
7        ctCDPI_Callouts.PI_name_starts = 0
8        ctCDPI_Callouts.PI_name_ends = 0
9        ctCDPI_Callouts.PI_ends = 0
10        CtCDPI_starts = 0
11        CtCDPI_ends = 0
12        ctCDPI_mask = 0
13
14        v = lex.LAngle | lex.Hyphen
15        w = lex.Hyphen | lex.QMark
16        v1 = pablo.Advance(v)
17        w1 = pablo.Advance(w)
18       
19        LAngle_scope = v1 &~ w1  #pablo.Advance(lex.LAngle)
20        PI_opener = LAngle_scope & lex.QMark
21        CtCD_opener= LAngle_scope & lex.Exclam
22        CtCDPI_opener = PI_opener | CtCD_opener
23
24        #DoubleHyphen = 0
25        CD_closer = 0
26        #PI_closer = 0
27       
28        #if lex.Hyphen: DoubleHyphen = pablo.Advance(lex.Hyphen) & lex.Hyphen
29        DoubleHyphen = v1 & w1 & lex.Hyphen
30        if lex.RBracket:
31                DoubleRBracket = pablo.Advance(lex.RBracket) & lex.RBracket
32                CD_closer = pablo.Advance(DoubleRBracket) & lex.RAngle
33        #if lex.QMark: PI_closer = pablo.Advance(lex.QMark) & lex.RAngle
34        PI_closer = w1 & ~v1 & lex.RAngle
35
36        #
37        # Initiate the scan
38        CtCDPI_Cursor = pablo.ScanToFirst(CtCDPI_opener)
39        while CtCDPI_Cursor:
40                CtCDPI_starts |= CtCDPI_Cursor
41                PI_Cursor = CtCDPI_Cursor & PI_opener
42                CD_Ct_Cursor = pablo.Advance(CtCDPI_Cursor & ~PI_Cursor)
43                CD_Cursor = CD_Ct_Cursor & lex.LBracket
44                Ct_Cursor = CD_Ct_Cursor & lex.Hyphen
45                # PI processing
46                if PI_Cursor:
47                        ctCDPI_Callouts.PI_starts |= PI_Cursor
48                        PI_Cursor = pablo.AdvanceThenScanTo(PI_Cursor, PI_closer)
49                        ctCDPI_Callouts.PI_ends |= PI_Cursor
50                        CtCDPI_ends |= PI_Cursor
51
52                # CDATA section processing
53                if CD_Cursor:
54                        ctCDPI_Callouts.CD_starts |= CD_Cursor
55                        CD_Cursor = pablo.ScanTo(CD_Cursor, CD_closer)
56                        ctCDPI_Callouts.CD_ends |= CD_Cursor
57                        CtCDPI_ends |= CD_Cursor
58
59                # Comment processing
60                if Ct_Cursor:
61                        ctCDPI_Callouts.Ct_starts |= Ct_Cursor
62                        Ct_Cursor = pablo.Advance(Ct_Cursor) 
63                        # Advance twice past <!--, so that we don't treat <!---
64                        # as being a terminated comment.
65                        Ct_Cursor = pablo.Advance(pablo.Advance(Ct_Cursor))
66                        Ct_Cursor = pablo.Advance(pablo.ScanTo(Ct_Cursor, DoubleHyphen))
67                        ctCDPI_Callouts.Ct_ends |= Ct_Cursor
68                        CtCDPI_ends |= Ct_Cursor
69
70                # Common processing
71                CtCDPI_Cursor = PI_Cursor | CD_Cursor | Ct_Cursor
72                CtCDPI_Cursor = pablo.ScanTo(CtCDPI_Cursor, CtCDPI_opener)     
73
74        if CtCDPI_starts | ctCDPI_Callouts.Ct_starts | ctCDPI_Callouts.Ct_ends:
75                ctCDPI_mask = pablo.InclusiveSpan(CtCDPI_starts, CtCDPI_ends)
76                # If any of the Comment, CDATA or PI markups are unterminated, it is an error.
77                ctCDPI_error = pablo.atEOF(ctCDPI_mask)
78                if ctCDPI_error:
79                        error_tracker.NoteError("Error in comment, CDATA or processing instruction syntax", ctCDPI_error)
80               
81                if ctCDPI_Callouts.PI_starts:
82                        ctCDPI_Callouts.PI_name_starts = pablo.Advance(ctCDPI_Callouts.PI_starts)
83                        ctCDPI_Callouts.PI_name_ends = pablo.ScanThru(ctCDPI_Callouts.PI_name_starts, lex.NameScan)
84                        no_PI_name = ctCDPI_Callouts.PI_name_starts & ctCDPI_Callouts.PI_name_ends
85                        if no_PI_name:
86                                error_tracker.NoteError("Error in PI syntax", no_PI_name)
87                        check_for_PI_closer = ctCDPI_Callouts.PI_name_ends & ~ lex.WS
88                        if check_for_PI_closer:
89                                PI_error = pablo.Advance(check_for_PI_closer) & ~ PI_closer
90                                if PI_error:
91                                        error_tracker.NoteError("Error in PI syntax", PI_error)
92               
93                if ctCDPI_Callouts.Ct_starts:
94                        Ct_error = pablo.Advance(ctCDPI_Callouts.Ct_starts) &~ lex.Hyphen
95                        if Ct_error:
96                                error_tracker.NoteError("Error in comment opener", Ct_error)
97       
98
99                if ctCDPI_Callouts.Ct_ends &~ lex.RAngle:
100                        error_tracker.NoteError("Error in comment syntax", ctCDPI_Callouts.Ct_ends &~ lex.RAngle)
101               
102
103       
104        #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
105#  Following is slow
106        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
107
108
109        # Identify the remaining significant markers for XML processing.
110        marker.LAngle_scope = LAngle_scope &~ ctCDPI_mask
111        marker.Ref_opener = lex.RefStart &~ ctCDPI_mask
112        marker.CD_closer = CD_closer &~ ctCDPI_mask
113
Note: See TracBrowser for help on using the repository browser.