source: proto/PDF/pdf.py @ 2604

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

Depth change for literal strings

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