source: proto/PDF/pdf.py @ 2568

Last change on this file since 2568 was 2568, checked in by bhull, 7 years ago

Changes to template

File size: 10.9 KB
Line 
1import sys
2import pablo
3
4
5class Basis_bits():     
6        bit_0 = 0
7        bit_1 = 0
8        bit_2 = 0
9        bit_3 = 0
10        bit_4 = 0
11        bit_5 = 0
12        bit_6 = 0
13        bit_7 = 0
14
15class Parity():
16        odd = 0
17        even = 0
18
19class Lex ():
20        LParen = 0
21        RParen = 0
22        Backslash = 0
23        Percent = 0
24        Slash=0
25        Regular=0
26        Delimiter=0
27        LAngle=0
28        RAngle=0
29        Hex=0
30        WS=0
31        Digit=0
32        Sign=0
33        Period=0
34        EOL=0
35        RBracket=0
36        LBracket=0
37       
38class Escaped_Callouts ():
39        UELParen = 0
40        UERParen = 0
41
42class Comments_Callouts() :
43        mask=0
44class LiteralStrings_Callouts() :
45        starts=0
46        ends=0
47        mask=0
48        error = 0
49
50class Marker() :
51        mask=0
52
53class Names_Callouts() :
54        starts = 0
55        follows = 0
56
57class HexStrings_Callouts() :
58        starts = 0
59        ends = 0
60        error = 0
61
62class Numeric_Callouts() :
63        starts = 0
64        follows = 0
65        error = 0
66
67class Keywords_Callouts() :
68        starts = 0
69        ends = 0
70       
71class Arrays_Callouts() :
72        starts = 0
73        ends = 0
74
75
76def Classify_bytes(basis_bits, lex): 
77        temp1 = (basis_bits.bit_0 | basis_bits.bit_1)
78        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3)
79        temp3 = (temp2 &~ temp1)
80        temp4 = (basis_bits.bit_4 &~ basis_bits.bit_5)
81        temp5 = (basis_bits.bit_6 | basis_bits.bit_7)
82        temp6 = (temp4 &~ temp5)
83        lex.LParen = (temp3 & temp6)
84        temp7 = (basis_bits.bit_7 &~ basis_bits.bit_6)
85        temp8 = (temp4 & temp7)
86        lex.RParen = (temp3 & temp8)
87        temp9 = (basis_bits.bit_1 &~ basis_bits.bit_0)
88        temp10 = (basis_bits.bit_3 &~ basis_bits.bit_2)
89        temp11 = (temp9 & temp10)
90        temp12 = (basis_bits.bit_4 & basis_bits.bit_5)
91        temp13 = (temp12 &~ temp5)
92        lex.Backslash = (temp11 & temp13)
93        temp14 = (temp5 &~ temp7)
94        temp15 = (temp4 &~ temp14)
95        temp16 = (temp3 & temp15)
96        temp17 = (basis_bits.bit_2 & basis_bits.bit_3)
97        temp18 = (temp17 &~ temp1)
98        temp19 = (temp18 & temp13)
99        temp20 = (temp16 | temp19)
100        temp21 = (basis_bits.bit_6 &~ basis_bits.bit_7)
101        temp22 = (temp12 & temp21)
102        temp23 = (temp18 & temp22)
103        temp24 = (temp20 | temp23)
104        temp25 = (basis_bits.bit_6 & basis_bits.bit_7)
105        temp26 = (temp4 & temp25)
106        temp27 = (temp11 & temp26)
107        temp28 = (temp24 | temp27)
108        temp29 = (temp12 & temp7)
109        temp30 = (temp11 & temp29)
110        temp31 = (temp28 | temp30)
111        temp32 = (temp9 & temp17)
112        temp33 = (temp32 & temp26)
113        temp34 = (temp31 | temp33)
114        temp35 = (temp32 & temp29)
115        temp36 = (temp34 | temp35)
116        temp37 = (basis_bits.bit_5 &~ basis_bits.bit_4)
117        temp38 = (temp37 & temp7)
118        temp39 = (temp3 & temp38)
119        temp40 = (temp36 | temp39)
120        temp41 = (temp12 & temp25)
121        temp42 = (temp3 & temp41)
122        lex.Delimiter = (temp40 | temp42)
123        lex.Percent = (temp3 & temp38)
124        lex.Period = (temp3 & temp22)
125        lex.LAngle = (temp18 & temp13)
126        lex.RAngle = (temp18 & temp22)
127        lex.LBracket = (temp11 & temp26)
128        lex.RBracket = (temp11 & temp29)
129        lex.Slash = (temp3 & temp41)
130        temp43 = (basis_bits.bit_2 | basis_bits.bit_3)
131        temp44 = (temp1 | temp43)
132        temp45 = (temp4 & temp21)
133        temp46 = (temp29 | temp45)
134        lex.EOL = (temp46 &~ temp44)
135        temp47 = (basis_bits.bit_4 | basis_bits.bit_5)
136        temp48 = (temp47 | temp5)
137        temp49 = (temp44 | temp48)
138        temp50 = (temp13 &~ temp44)
139        temp51 = (temp49 &~ temp50)
140        temp52 = (temp29 &~ temp44)
141        temp53 = (temp51 &~ temp52)
142        temp54 = (temp45 &~ temp44)
143        temp55 = (temp53 &~ temp54)
144        temp56 = (temp8 &~ temp44)
145        temp57 = (temp55 &~ temp56)
146        temp58 = (temp3 &~ temp48)
147        temp59 = (temp57 &~ temp58)
148        lex.WS = (~temp59)
149        temp60 = (basis_bits.bit_5 | basis_bits.bit_6)
150        temp61 = (basis_bits.bit_4 & temp60)
151        lex.Digit = (temp18 &~ temp61)
152        temp62 = (temp29 | temp26)
153        lex.Sign = (temp3 & temp62)
154        temp63 = (temp9 &~ temp43)
155        temp64 = (temp63 &~ basis_bits.bit_4)
156        temp65 = (~temp25)
157        temp66 = ((basis_bits.bit_5 & temp65)|(~(basis_bits.bit_5) & temp5))
158        temp67 = (temp64 & temp66)
159        temp68 = (lex.Digit | temp67)
160        temp69 = (temp9 & temp2)
161        temp70 = (temp69 &~ basis_bits.bit_4)
162        temp71 = (temp70 & temp66)
163        lex.Hex = (temp68 | temp71)
164        lex.Regular = ~lex.Delimiter&~lex.WS
165
166
167
168def simd_const_4(hexdigit, EOF_mask):
169        lgth = pablo.count_leading_zeroes(~EOF_mask)/4
170        return int(hexdigit*(lgth+1),16)&EOF_mask
171
172
173def Parse_Escaped(lex, escaped_Callouts):
174
175        odd = simd_const_4('a',pablo.EOF_mask) 
176        even = simd_const_4('5',pablo.EOF_mask) 
177
178        start = lex.Backslash &~ pablo.Advance(lex.Backslash)
179        even_start = start & even
180       
181        even_final = pablo.ScanThru(even_start, lex.Backslash) 
182        escape = even_final & odd
183   
184        odd_start = start & odd
185        odd_final = pablo.ScanThru(odd_start, lex.Backslash)
186        escape = escape | (odd_final & even)
187                   
188        escaped_Callouts.UELParen = lex.LParen &~ escape
189        escaped_Callouts.UERParen = lex.RParen &~ escape
190
191def inc() :
192        global depth
193        depth+=1
194
195def dec() :
196        global depth
197        depth-=1
198
199def lt_zero() :
200        global depth
201        return depth < 0
202
203def gt_zero() :
204        global depth
205        return depth > 0
206
207def is_zero() :
208        global depth
209        return depth==0
210               
211# Parallel version
212# def Parse_LiteralStrings(LParen, RParen, LiteralStrings_Callouts):
213        # unmatched = RParen
214        # pscan = {}
215        # qscan = {}
216        # LiteralStrings_Callouts.closed={}
217        # i = 0
218        # pscan[0] = pablo.ScanTo(pablo.Advance(LParen), LParen | RParen)
219        # qscan[0] = pablo.ScanTo(pablo.Advance(RParen), LParen | RParen)
220        # LiteralStrings_Callouts.mask = (pscan[0] - (LParen)) | pscan[0]
221       
222        # LiteralStrings_Callouts.closed[i] = pscan[i] & RParen
223        # unclosed = pscan[i] & LParen | qscan[i] & RParen
224        # LiteralStrings_Callouts.error = pscan[i] &~ pablo.EOF_mask
225        # all_closed = LiteralStrings_Callouts.closed[i]
226        # while unclosed:
227                # i += 1
228                # pscan[i] = pablo.ScanTo(pablo.Advance(unclosed & LParen), unclosed)
229                # qscan[i] = pablo.ScanTo(pablo.Advance(unclosed & RParen), unclosed)
230                # LiteralStrings_Callouts.mask|=(pscan[i]-(unclosed & LParen)) | pscan[i]
231                # LiteralStrings_Callouts.closed[i] = pscan[i] & RParen #| qscan[i] & LParen
232                # unclosed = pscan[i] & LParen | qscan[i] & RParen
233                # all_closed |= LiteralStrings_Callouts.closed[i]
234                # LiteralStrings_Callouts.error |= pscan[i] &~ pablo.EOF_mask #| ~pablo.atEOF(qscan[i])
235       
236        # LiteralStrings_Callouts.error |= RParen &~ all_closed
237# def Parse_Comments(Percent, lex, Comments_Callouts) :
238        # end = Pablo.ScanTo(Percent, lex.EOL)
239        # Comments_Callouts.mask = end-Percent
240# def Parse_CommentsLiteralStrings(lex, Escaped_Callouts, Marker, Comments_Callouts, LiteralStrings_Callouts) :
241        # Parse_LiteralStrings(Escaped_Callouts.UELParen, Escaped_Callouts.UERParen, LiteralStrings_Callouts)
242        # while (lex.Percent &~ (LiteralStrings_Callouts.mask | Comments_Callouts.mask)) :
243                # Parse_Comments(lex.Percent&~LiteralStrings_Callouts.mask, lex, Comments_Callouts)
244                # if (LiteralStrings_Callouts.mask & Comments_Callouts.mask) :
245                        # Parse_LiteralStrings(Escaped_Callouts.UELP &~ Comments_Callouts.mask, Escaped_Callouts.UERP &~ Comments_Callouts.mask, LiteralStrings_Callouts)
246                # else :
247                        # break
248        # Marker.mask = Comments_Callouts.mask | LiteralStrings_Callouts.mask
249
250
251
252def Parse_CommentsLiteralStrings(lex, escaped_Callouts, marker, comments_Callouts, literalStrings_Callouts) :
253        #not entirely sure this code is correct once compiled
254        depth = 0
255        comment_starts=0
256        comment_ends=0
257        scan_characters = escaped_Callouts.UELParen |escaped_Callouts.UERParen | lex.Percent
258        cursor = pablo.ScanToFirst(scan_characters)
259        while pablo.inFile(cursor) :
260                comment_cursor = cursor & lex.Percent
261                string_cursor = cursor & (escaped_Callouts.UELParen|escaped_Callouts.UERParen)
262                if comment_cursor :
263                        comment_starts |=comment_cursor
264                        comment_cursor = pablo.ScanTo(comment_cursor, lex.EOL)
265                        comment_ends |=comment_cursor
266                        cursor = pablo.ScanTo(pablo.Advance(comment_cursor), scan_characters)
267   
268
269               
270                if string_cursor :
271                        if (string_cursor & escaped_Callouts.UELParen) :
272                                if is_zero():
273                                        literalStrings_Callouts.starts|=string_cursor
274
275                                inc()
276
277                                cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
278                        if (string_cursor & escaped_Callouts.UERParen) :
279
280                                dec()
281
282                                if is_zero():
283                                        literalStrings_Callouts.ends|=string_cursor
284                                        cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
285                                elif lt_zero():
286                                        literalStrings_Callouts.error|=string_cursor
287                                        cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
288                                else:
289                                        cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
290                                       
291               
292               
293        #if (depth>0):
294                #error
295        comments_Callouts.mask = pablo.SpanUpTo(comment_starts, comment_ends)
296        literalStrings_Callouts.mask = pablo.SpanUpTo(literalStrings_Callouts.starts,literalStrings_Callouts.ends)
297        marker.mask = comments_Callouts.mask | literalStrings_Callouts.mask
298
299
300def Parse_Names(lex, marker, names_Callouts) :
301        names_Callouts.starts = pablo.Advance(lex.Slash&~marker.mask)
302        names_Callouts.follows = pablo.ScanThru(names_Callouts.starts, lex.Regular)
303        marker.mask |=names_Callouts.starts
304
305def Parse_HexStrings(lex, marker, hexStrings_Callouts) :
306        #Haven't confirmed that this is the correct behaviour with bad input
307        hexStrings_Callouts.starts = lex.LAngle &~marker.mask
308        hexStrings_Callouts.ends = pablo.ScanThru(pablo.Advance(hexStrings_Callouts.starts),lex.Hex|lex.WS)
309        hexStrings_Callouts.error = hexStrings_Callouts.ends &~ lex.RAngle
310        marker.mask |= pablo.SpanUpTo(hexStrings_Callouts.starts,hexStrings_Callouts.ends)
311
312def Parse_Numeric(lex, marker, numeric_Callouts) :
313        numeric_characters = (lex.Digit | lex.Period | lex.Sign)
314        numeric_Callouts.starts =(numeric_characters &~ pablo.Advance(lex.Regular)) &~ marker.mask
315        numeric_Callouts.follows =pablo.ScanThru(numeric_Callouts.starts, lex.Regular)
316        marker.mask |= numeric_Callouts.starts
317
318        # aftersign = pablo.Advance(numeric_Callouts.starts & lex.Sign) | (numeric_Callouts.starts &~ lex.Sign)
319        # temp = pablo.ScanThru(aftersign, lex.Digit)
320        # afterperiod = pablo.Advance(temp & lex.Period) | (temp &~ lex.Period)
321        # numeric_Callouts.follows = pablo.ScanThru(afterperiod, lex.Digit)
322        # numeric_Callouts.error = numeric_Callouts.follows &~ (lex.WS | lex.Delimiter)
323        # marker.mask |= numeric_Callouts.starts
324
325def Parse_Keywords(lex, marker, keywords_Callouts) :
326        keywords_Callouts.starts = (lex.Regular &~ pablo.Advance(lex.Regular)) &~ marker.mask
327        keywords_Callouts.follows = pablo.ScanThru(keywords_Callouts.starts, lex.Regular)
328       
329def Parse_Arrays(lex, marker, arrays_Callouts) :
330        arrays_Callouts.starts =  lex.LBracket &~ marker.mask
331        arrays_Callouts.ends = lex.RBracket &~ marker.mask
332
333       
334def Main(basis_bits, lex, parity, escaped_Callouts):
335                Classify_bytes(basis_bits, lex)
336                # Generate parity odd/even streams
337                Parse_Escaped(lex, parity, escaped_Callouts)
338#               Parse_CommentsLiteralStrings(lex, escaped_Callouts, marker, comments_Callouts, literalStrings_Callouts)
339#               Parse_Names(lex, marker, names_Callouts)
340#               Parse_HexStrings(lex, marker, hexStrings_Callouts)
341#               Parse_Numeric(lex, marker, numeric_Callouts)
342#               Parse_Keywords(lex, marker, keywords_Callouts)
343#               Parse_Arrays(lex, marker, arrays_Callouts)
344       
Note: See TracBrowser for help on using the repository browser.