source: proto/PDF/pdf_demo.py @ 2570

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

Depth change

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