Mercurial > cpython-lru_cache-weakref
annotate Lib/re.py @ 5817:48b94de85bf3 legacy-trunk
Extensive changes by AMK.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Thu, 17 Jul 1997 16:29:42 +0000 |
| parents | 518d4f0c8fcc |
| children | 3c15ae0fb6ad |
| rev | line source |
|---|---|
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 # -*- mode: python -*- |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 # $Id$ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 import string |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 import reop |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 error = 're error' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 # compilation flags |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 IGNORECASE = I = 0x01 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 MULTILINE = M = 0x02 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 DOTALL = S = 0x04 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
16 VERBOSE = X = 0x08 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 # Initialize syntax table. This information should really come from the |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 # syntax table in regexpr.c rather than being duplicated here. |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 syntax_table = {} |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 for char in map(chr, range(0, 256)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 syntax_table[char] = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
28 for char in string.lowercase: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
29 syntax_table[char].append('word') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
30 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
31 for char in string.uppercase: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 syntax_table[char].append('word') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
33 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
34 for char in string.digits: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
35 syntax_table[char].append('word') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 syntax_table[char].append('digit') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 for char in string.whitespace: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
39 syntax_table[char].append('whitespace') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
40 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 syntax_table['_'].append('word') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
42 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
47 def valid_identifier(id): |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
48 if len(id) == 0: |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
49 return 0 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
50 if ('word' not in syntax_table[id[0]]) or ('digit' in syntax_table[id[0]]): |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
51 return 0 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
52 for char in id[1:]: |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
53 if 'word' not in syntax_table[char]: |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
54 return 0 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
55 return 1 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
56 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
57 # |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
58 # |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
59 # |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
60 |
|
5797
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
61 _cache = {} |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
62 _MAXCACHE = 20 |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
63 |
|
5797
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
64 def _cachecompile(pattern, flags): |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
65 key = (pattern, flags) |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
66 try: |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
67 return _cache[key] |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
68 except KeyError: |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
69 pass |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
70 value = compile(pattern, flags) |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
71 if len(_cache) >= _MAXCACHE: |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
72 _cache.clear() |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
73 _cache[key] = value |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
74 return value |
|
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
75 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 def match(pattern, string, flags=0): |
|
5797
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
77 return _cachecompile(pattern, flags).match(string) |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
78 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
79 def search(pattern, string, flags=0): |
|
5797
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
80 return _cachecompile(pattern, flags).search(string) |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
81 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
82 def sub(pattern, repl, string, count=0): |
|
5797
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
83 return _cachecompile(pattern).sub(repl, string, count) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 def subn(pattern, repl, string, count=0): |
|
5797
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
86 return _cachecompile(pattern).subn(repl, string, count) |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
87 |
| 5778 | 88 def split(pattern, string, maxsplit=0): |
|
5797
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
89 return _cachecompile(pattern).subn(string, maxsplit) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
94 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 class RegexObject: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 def __init__(self, pattern, flags, code, num_regs, groupindex, callouts): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 self.code = code |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
98 self.num_regs = num_regs |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
99 self.flags = flags |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
100 self.pattern = pattern |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
101 self.groupindex = groupindex |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
102 self.callouts = callouts |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 self.fastmap = build_fastmap(code) |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
104 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
105 if code[0].name == 'bol': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
106 self.anchor = 1 |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
107 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
108 elif code[0].name == 'begbuf': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
109 self.anchor = 2 |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
110 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
111 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
112 self.anchor = 0 |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
113 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
114 self.buffer = assemble(code) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
115 def search(self, string, pos=0): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 regs = reop.search(self.buffer, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
117 self.num_regs, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 self.flags, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 self.fastmap.can_be_null, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 self.fastmap.fastmap(), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 self.anchor, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
122 string, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 pos) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 if regs is None: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
125 return None |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
126 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 return MatchObject(self, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
128 string, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
129 pos, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
130 regs) |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
131 |
| 5778 | 132 def match(self, string, pos=0): |
| 133 regs = reop.match(self.buffer, | |
| 134 self.num_regs, | |
| 135 self.flags, | |
| 136 self.fastmap.can_be_null, | |
| 137 self.fastmap.fastmap(), | |
| 138 self.anchor, | |
| 139 string, | |
| 140 pos) | |
| 141 if regs is None: | |
| 142 return None | |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
143 |
| 5778 | 144 return MatchObject(self, |
| 145 string, | |
| 146 pos, | |
| 147 regs) | |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
148 |
| 5778 | 149 def sub(self, repl, string, count=0): |
| 150 pass | |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
151 |
| 5778 | 152 def subn(self, repl, string, count=0): |
| 153 pass | |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
154 |
| 5778 | 155 def split(self, string, maxsplit=0): |
| 156 pass | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
157 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
158 class MatchObject: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
159 def __init__(self, re, string, pos, regs): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 self.re = re |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 self.string = string |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 self.pos = pos |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 self.regs = regs |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
164 |
| 5778 | 165 def start(self, g): |
| 166 if type(g) == type(''): | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
167 try: |
| 5778 | 168 g = self.re.groupindex[g] |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
169 except (KeyError, TypeError): |
| 5778 | 170 raise IndexError, ('group "' + g + '" is undefined') |
| 171 return self.regs[g][0] | |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
172 |
| 5778 | 173 def end(self, g): |
| 174 if type(g) == type(''): | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 try: |
| 5778 | 176 g = self.re.groupindex[g] |
| 177 except (KeyError, TypeError): | |
| 178 raise IndexError, ('group "' + g + '" is undefined') | |
| 179 return self.regs[g][1] | |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
180 |
| 5778 | 181 def span(self, g): |
| 182 if type(g) == type(''): | |
| 183 try: | |
| 184 g = self.re.groupindex[g] | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
185 except (KeyError, TypeError): |
| 5778 | 186 raise IndexError, ('group "' + g + '" is undefined') |
| 187 return self.regs[g] | |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
188 |
| 5778 | 189 def group(self, *groups): |
| 190 if len(groups) == 0: | |
| 191 groups = range(1, self.re.num_regs) | |
|
5790
1d417e9c72cf
Fix group() -- should be tuple even when re has exactly one group.
Guido van Rossum <guido@python.org>
parents:
5789
diff
changeset
|
192 use_all = 1 |
|
1d417e9c72cf
Fix group() -- should be tuple even when re has exactly one group.
Guido van Rossum <guido@python.org>
parents:
5789
diff
changeset
|
193 else: |
|
1d417e9c72cf
Fix group() -- should be tuple even when re has exactly one group.
Guido van Rossum <guido@python.org>
parents:
5789
diff
changeset
|
194 use_all = 0 |
| 5778 | 195 result = [] |
| 196 for g in groups: | |
| 197 if type(g) == type(''): | |
| 198 try: | |
| 199 g = self.re.groupindex[g] | |
| 200 except (KeyError, TypeError): | |
| 201 raise IndexError, ('group "' + g + '" is undefined') | |
| 5788 | 202 if (self.regs[g][0] == -1) or (self.regs[g][1] == -1): |
| 5778 | 203 result.append(None) |
| 204 else: | |
| 205 result.append(self.string[self.regs[g][0]:self.regs[g][1]]) | |
|
5790
1d417e9c72cf
Fix group() -- should be tuple even when re has exactly one group.
Guido van Rossum <guido@python.org>
parents:
5789
diff
changeset
|
206 if use_all or len(result) > 1: |
| 5778 | 207 return tuple(result) |
| 208 elif len(result) == 1: | |
| 209 return result[0] | |
| 210 else: | |
| 211 return () | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
212 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
213 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
214 # A set of classes to make assembly a bit easier, if a bit verbose. |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
215 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
216 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
217 class Instruction: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
218 def __init__(self, opcode, size=1): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
219 self.opcode = opcode |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
220 self.size = size |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
221 def assemble(self, position, labels): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
222 return self.opcode |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
223 def __repr__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 return '%-15s' % (self.name) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
225 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
226 class FunctionCallout(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 name = 'function' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 def __init__(self, function): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 self.function = function |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
230 Instruction.__init__(self, chr(22), 2 + len(self.function)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
231 def assemble(self, position, labels): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
232 return self.opcode + chr(len(self.function)) + self.function |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
233 def __repr__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
234 return '%-15s %-10s' % (self.name, self.function) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
235 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
236 class End(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
237 name = 'end' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
238 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
239 Instruction.__init__(self, chr(0)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
240 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
241 class Bol(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
242 name = 'bol' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
243 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
244 self.name = 'bol' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
245 Instruction.__init__(self, chr(1)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
246 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
247 class Eol(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
248 name = 'eol' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
249 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
250 Instruction.__init__(self, chr(2)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
251 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
252 class Set(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
253 name = 'set' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
254 def __init__(self, set): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
255 self.set = set |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
256 Instruction.__init__(self, chr(3), 33) |
|
5763
fd4e9f293c77
New version from Jeffrey after I complained about some glaring bugs.
Guido van Rossum <guido@python.org>
parents:
5759
diff
changeset
|
257 def assemble(self, position, labels): |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
258 result = self.opcode |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
259 temp = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
260 for i, c in map(lambda x: (x, chr(x)), range(256)): |
|
5763
fd4e9f293c77
New version from Jeffrey after I complained about some glaring bugs.
Guido van Rossum <guido@python.org>
parents:
5759
diff
changeset
|
261 if c in self.set: |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
262 temp = temp | (1 << (i & 7)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
263 if (i % 8) == 7: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
264 result = result + chr(temp) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
265 temp = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
266 return result |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
267 def __repr__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
268 result = '%-15s' % (self.name) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
269 self.set.sort() |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
270 for char in self.set: |
|
5763
fd4e9f293c77
New version from Jeffrey after I complained about some glaring bugs.
Guido van Rossum <guido@python.org>
parents:
5759
diff
changeset
|
271 result = result + char |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
272 return result |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
273 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
274 class Exact(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
275 name = 'exact' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
276 def __init__(self, char): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
277 self.char = char |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
278 Instruction.__init__(self, chr(4), 2) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
279 def assemble(self, position, labels): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
280 return self.opcode + self.char |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
281 def __repr__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
282 return '%-15s %s' % (self.name, `self.char`) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
283 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
284 class AnyChar(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
285 name = 'anychar' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
286 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
287 Instruction.__init__(self, chr(5)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 def assemble(self, position, labels): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
289 return self.opcode |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
290 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 class MemoryInstruction(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
292 def __init__(self, opcode, register): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
293 self.register = register |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
294 Instruction.__init__(self, opcode, 2) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
295 def assemble(self, position, labels): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
296 return self.opcode + chr(self.register) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
297 def __repr__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
298 return '%-15s %i' % (self.name, self.register) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
299 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
300 class StartMemory(MemoryInstruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
301 name = 'start_memory' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
302 def __init__(self, register): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
303 MemoryInstruction.__init__(self, chr(6), register) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
304 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
305 class EndMemory(MemoryInstruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
306 name = 'end_memory' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
307 def __init__(self, register): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
308 MemoryInstruction.__init__(self, chr(7), register) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
309 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
310 class MatchMemory(MemoryInstruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
311 name = 'match_memory' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
312 def __init__(self, register): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
313 MemoryInstruction.__init__(self, chr(8), register) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
314 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
315 class JumpInstruction(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
316 def __init__(self, opcode, label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
317 self.label = label |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 Instruction.__init__(self, opcode, 3) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
319 def compute_offset(self, start, dest): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
320 return dest - (start + 3) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 def pack_offset(self, offset): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 if offset > 32767: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 raise error, 'offset out of range (pos)' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 elif offset < -32768: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 raise error, 'offset out of range (neg)' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 elif offset < 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 offset = offset + 65536 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
328 return chr(offset & 0xff) + chr((offset >> 8) & 0xff) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
329 def assemble(self, position, labels): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 return self.opcode + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 self.pack_offset(self.compute_offset(position, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
332 labels[self.label])) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
333 def __repr__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 return '%-15s %i' % (self.name, self.label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
335 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 class Jump(JumpInstruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
337 name = 'jump' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
338 def __init__(self, label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
339 JumpInstruction.__init__(self, chr(9), label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
340 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
341 class StarJump(JumpInstruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
342 name = 'star_jump' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 def __init__(self, label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
344 JumpInstruction.__init__(self, chr(10), label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 class FailureJump(JumpInstruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
347 name = 'failure_jump' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 def __init__(self, label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
349 JumpInstruction.__init__(self, chr(11), label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
350 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
351 class UpdateFailureJump(JumpInstruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 name = 'update_failure_jump' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 def __init__(self, label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
354 JumpInstruction.__init__(self, chr(12), label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
355 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 class DummyFailureJump(JumpInstruction): |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
357 name = 'dummy_failure_jump' |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
358 def __init__(self, label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
359 JumpInstruction.__init__(self, chr(13), label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
361 class BegBuf(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 name = 'begbuf' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
363 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
364 Instruction.__init__(self, chr(14)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
365 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
366 class EndBuf(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 name = 'endbuf' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
368 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
369 Instruction.__init__(self, chr(15)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
370 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
371 class WordBeg(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
372 name = 'wordbeg' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
373 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
374 Instruction.__init__(self, chr(16)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
376 class WordEnd(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
377 name = 'wordend' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
378 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
379 Instruction.__init__(self, chr(17)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
380 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
381 class WordBound(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
382 name = 'wordbound' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
383 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
384 Instruction.__init__(self, chr(18)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
385 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 class NotWordBound(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 name = 'notwordbound' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
389 Instruction.__init__(self, chr(18)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 class SyntaxSpec(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 name = 'syntaxspec' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 def __init__(self, syntax): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 self.syntax = syntax |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
395 Instruction.__init__(self, chr(20), 2) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
396 def assemble(self, postition, labels): |
|
5779
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
397 # XXX |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 return self.opcode + chr(self.syntax) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 |
| 5778 | 400 class NotSyntaxSpec(Instruction): |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 name = 'notsyntaxspec' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 def __init__(self, syntax): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
403 self.syntax = syntax |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
404 Instruction.__init__(self, chr(21), 2) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 def assemble(self, postition, labels): |
|
5779
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
406 # XXX |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
407 return self.opcode + chr(self.syntax) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
408 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 class Label(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
410 name = 'label' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
411 def __init__(self, label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
412 self.label = label |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
413 Instruction.__init__(self, '', 0) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
414 def __repr__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
415 return '%-15s %i' % (self.name, self.label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
416 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
417 class OpenParen(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
418 name = '(' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
419 def __init__(self, register): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
420 self.register = register |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
421 Instruction.__init__(self, '', 0) |
|
5779
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
422 def assemble(self, position, labels): |
|
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
423 raise error, 'unmatched open parenthesis' |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
424 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
425 class Alternation(Instruction): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
426 name = '|' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
427 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 Instruction.__init__(self, '', 0) |
|
5779
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
429 def assemble(self, position, labels): |
|
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
430 raise error, 'an alternation was not taken care of' |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
431 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
433 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
434 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
435 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
436 def assemble(instructions): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
437 labels = {} |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
438 position = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
439 pass1 = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 for instruction in instructions: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
441 if instruction.name == 'label': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
442 labels[instruction.label] = position |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
443 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
444 pass1.append((position, instruction)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
445 position = position + instruction.size |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
446 pass2 = '' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
447 for position, instruction in pass1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
448 pass2 = pass2 + instruction.assemble(position, labels) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
449 return pass2 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
450 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
451 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
453 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
454 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
455 def escape(pattern): |
| 5778 | 456 result = [] |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
457 for char in pattern: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
458 if 'word' not in syntax_table[char]: |
| 5778 | 459 result.append('\\') |
| 460 result.append(char) | |
| 461 return string.join(result, '') | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
462 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
463 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
464 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
465 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
466 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
467 def registers_used(instructions): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
468 result = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
469 for instruction in instructions: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
470 if (instruction.name in ['set_memory', 'end_memory']) and \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 (instruction.register not in result): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 result.append(instruction.register) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
473 return result |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
477 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 class Fastmap: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 def __init__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 self.map = ['\000']*256 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 self.can_be_null = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 def add(self, char): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 self.map[ord(char)] = '\001' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 def fastmap(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 return string.join(self.map, '') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 def __getitem__(self, char): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 return ord(self.map[ord(char)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
489 def __repr__(self): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
490 self.map.sort() |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
491 return 'Fastmap(' + `self.can_be_null` + ', ' + `self.map` + ')' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
492 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
493 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
494 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
495 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
496 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 def find_label(code, label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 line = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
499 for instruction in code: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
500 if (instruction.name == 'label') and (instruction.label == label): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 return line + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
502 line = line + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
503 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
504 def build_fastmap_aux(code, pos, visited, fastmap): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
505 if visited[pos]: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
506 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
507 while 1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
508 instruction = code[pos] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
509 visited[pos] = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 pos = pos + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
511 if instruction.name == 'end': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 fastmap.can_be_null = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 elif instruction.name == 'syntaxspec': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 for char in map(chr, range(256)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 if instruction.syntax in syntax_table[char]: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
517 fastmap.add(char) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
518 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 elif instruction.name == 'notsyntaxspec': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 for char in map(chr, range(256)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 if instruction.syntax not in syntax_table[char]: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
522 fastmap.add(char) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
524 elif instruction.name == 'eol': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
525 fastmap.add('\n') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
526 if fastmap.can_be_null == 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
527 fastmap.can_be_null = 2 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
528 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
529 elif instruction.name == 'set': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
530 for char in instruction.set: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
531 fastmap.add(char) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
532 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
533 elif instruction.name == 'exact': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
534 fastmap.add(instruction.char) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
535 elif instruction.name == 'anychar': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
536 for char in map(chr, range(256)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
537 if char != '\n': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
538 fastmap.add(char) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
539 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
540 elif instruction.name == 'match_memory': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
541 for char in map(chr, range(256)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
542 fastmap.add(char) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
543 fastmap.can_be_null = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
544 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
545 elif instruction.name in ['jump', 'dummy_failure_jump', \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
546 'update_failure_jump', 'star_jump']: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
547 pos = find_label(code, instruction.label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
548 if visited[pos]: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
549 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
550 visited[pos] = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
551 elif instruction.name == 'failure_jump': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
552 build_fastmap_aux(code, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
553 find_label(code, instruction.label), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
554 visited, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
555 fastmap) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
556 elif instruction.name == 'function': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
557 for char in map(chr, range(256)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
558 fastmap.add(char) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
559 fastmap.can_be_null = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
560 return |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
561 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
562 def build_fastmap(code, pos=0): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
563 visited = [0] * len(code) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
564 fastmap = Fastmap() |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
565 build_fastmap_aux(code, pos, visited, fastmap) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
566 return fastmap |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
567 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
568 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
569 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
570 # |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
571 |
| 5788 | 572 [NORMAL, CHARCLASS, REPLACEMENT] = range(3) |
| 573 [CHAR, MEMORY_REFERENCE, SYNTAX, SET, WORD_BOUNDARY, NOT_WORD_BOUNDARY, | |
| 574 BEGINNING_OF_BUFFER, END_OF_BUFFER] = range(8) | |
| 575 | |
| 576 def expand_escape(pattern, index, context=NORMAL): | |
| 577 if index >= len(pattern): | |
| 578 raise error, 'escape ends too soon' | |
| 579 | |
| 580 elif pattern[index] == 't': | |
| 581 return CHAR, chr(9), index + 1 | |
| 582 | |
| 583 elif pattern[index] == 'n': | |
| 584 return CHAR, chr(10), index + 1 | |
| 585 | |
| 586 elif pattern[index] == 'r': | |
| 587 return CHAR, chr(13), index + 1 | |
| 588 | |
| 589 elif pattern[index] == 'f': | |
| 590 return CHAR, chr(12), index + 1 | |
| 591 | |
| 592 elif pattern[index] == 'a': | |
| 593 return CHAR, chr(7), index + 1 | |
| 594 | |
| 595 elif pattern[index] == 'e': | |
| 596 return CHAR, chr(27), index + 1 | |
| 597 | |
| 598 elif pattern[index] == 'c': | |
| 599 if index + 1 >= len(pattern): | |
| 600 raise error, '\\c must be followed by another character' | |
| 601 elif pattern[index + 1] in 'abcdefghijklmnopqrstuvwxyz': | |
| 602 return CHAR, chr(ord(pattern[index + 1]) - ord('a') + 1), index + 2 | |
| 603 else: | |
| 604 return CHAR, chr(ord(pattern[index + 1]) ^ 64), index + 2 | |
| 605 | |
| 606 elif pattern[index] == 'x': | |
| 607 # CAUTION: this is the Python rule, not the Perl rule! | |
| 608 end = index | |
| 609 while (end < len(pattern)) and (pattern[end] in string.hexdigits): | |
| 610 end = end + 1 | |
| 611 if end == index: | |
| 612 raise error, "\\x must be followed by hex digit(s)" | |
| 613 # let Python evaluate it, so we don't incorrectly 2nd-guess | |
| 614 # what it's doing (and Python in turn passes it on to sscanf, | |
| 615 # so that *it* doesn't incorrectly 2nd-guess what C does!) | |
| 616 char = eval ('"' + pattern[index-2:end] + '"') | |
| 617 assert len(char) == 1 | |
| 618 return CHAR, char, end | |
| 619 | |
| 620 elif pattern[index] == 'b': | |
| 621 if context != NORMAL: | |
| 622 return CHAR, chr(8), index + 1 | |
| 623 else: | |
| 624 return WORD_BOUNDARY, '', index + 1 | |
| 625 | |
| 626 elif pattern[index] == 'B': | |
| 627 if context != NORMAL: | |
| 628 return CHAR, 'B', index + 1 | |
| 629 else: | |
| 630 return NOT_WORD_BOUNDARY, '', index + 1 | |
| 631 | |
| 632 elif pattern[index] == 'A': | |
| 633 if context != NORMAL: | |
| 634 return CHAR, 'A', index + 1 | |
| 635 else: | |
| 636 return BEGINNING_OF_BUFFER, '', index + 1 | |
| 637 | |
| 638 elif pattern[index] == 'Z': | |
| 639 if context != NORMAL: | |
| 640 return 'Z', index + 1 | |
| 641 else: | |
| 642 return END_OF_BUFFER, '', index + 1 | |
| 643 | |
| 644 elif pattern[index] in 'GluLUQE': | |
| 645 raise error, ('\\' + ch + ' is not allowed') | |
| 646 | |
| 647 elif pattern[index] == 'w': | |
| 648 if context == NORMAL: | |
| 649 return SYNTAX, 'word', index + 1 | |
| 650 elif context == CHARCLASS: | |
| 651 set = [] | |
| 652 for char in syntax_table.keys(): | |
| 653 if 'word' in syntax_table[char]: | |
| 654 set.append(char) | |
| 655 return SET, set, index + 1 | |
| 656 else: | |
| 657 return CHAR, 'w', index + 1 | |
| 658 | |
| 659 elif pattern[index] == 'W': | |
| 660 if context == NORMAL: | |
| 661 return NOT_SYNTAX, 'word', index + 1 | |
| 662 elif context == CHARCLASS: | |
| 663 set = [] | |
| 664 for char in syntax_table.keys(): | |
| 665 if 'word' not in syntax_table[char]: | |
| 666 set.append(char) | |
| 667 return SET, set, index + 1 | |
| 668 else: | |
| 669 return CHAR, 'W', index + 1 | |
| 670 | |
| 671 elif pattern[index] == 's': | |
| 672 if context == NORMAL: | |
| 673 return SYNTAX, 'whitespace', index + 1 | |
| 674 elif context == CHARCLASS: | |
| 675 set = [] | |
| 676 for char in syntax_table.keys(): | |
| 677 if 'whitespace' in syntax_table[char]: | |
| 678 set.append(char) | |
| 679 return SET, set, index + 1 | |
| 680 else: | |
| 681 return CHAR, 's', index + 1 | |
| 682 | |
| 683 elif pattern[index] == 'S': | |
| 684 if context == NORMAL: | |
| 685 return NOT_SYNTAX, 'whitespace', index + 1 | |
| 686 elif context == CHARCLASS: | |
| 687 set = [] | |
| 688 for char in syntax_table.keys(): | |
| 689 if 'whitespace' not in syntax_table[char]: | |
| 690 set.append(char) | |
| 691 return SET, set, index + 1 | |
| 692 else: | |
| 693 return CHAR, 'S', index + 1 | |
| 694 | |
| 695 elif pattern[index] == 'd': | |
| 696 if context == NORMAL: | |
| 697 return SYNTAX, 'digit', index + 1 | |
| 698 elif context == CHARCLASS: | |
| 699 set = [] | |
| 700 for char in syntax_table.keys(): | |
| 701 if 'digit' in syntax_table[char]: | |
| 702 set.append(char) | |
| 703 return SET, set, index + 1 | |
| 704 else: | |
| 705 return CHAR, 'd', index + 1 | |
| 706 | |
| 707 elif pattern[index] == 'D': | |
| 708 if context == NORMAL: | |
| 709 return NOT_SYNTAX, 'digit', index + 1 | |
| 710 elif context == CHARCLASS: | |
| 711 set = [] | |
| 712 for char in syntax_table.keys(): | |
| 713 if 'digit' not in syntax_table[char]: | |
| 714 set.append(char) | |
| 715 return SET, set, index + 1 | |
| 716 else: | |
| 717 return CHAR, 'D', index + 1 | |
| 718 | |
| 719 elif pattern[index] in '0123456789': | |
|
5793
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
720 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
721 if pattern[index] == '0': |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
722 if (index + 1 < len(pattern)) and \ |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
723 (pattern[index + 1] in string.octdigits): |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
724 if (index + 2 < len(pattern)) and \ |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
725 (pattern[index + 2] in string.octdigits): |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
726 value = string.atoi(pattern[index:index + 3], 8) |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
727 index = index + 3 |
| 5788 | 728 |
|
5793
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
729 else: |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
730 value = string.atoi(pattern[index:index + 2], 8) |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
731 index = index + 2 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
732 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
733 else: |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
734 value = 0 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
735 index = index + 1 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
736 |
| 5788 | 737 if value > 255: |
|
5793
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
738 raise error, 'octal value out of range' |
| 5788 | 739 |
|
5793
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
740 return CHAR, chr(value), index |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
741 |
| 5788 | 742 else: |
|
5793
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
743 if (index + 1 < len(pattern)) and \ |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
744 (pattern[index + 1] in string.digits): |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
745 if (index + 2 < len(pattern)) and \ |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
746 (pattern[index + 2] in string.octdigits) and \ |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
747 (pattern[index + 1] in string.octdigits) and \ |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
748 (pattern[index] in string.octdigits): |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
749 value = string.atoi(pattern[index:index + 3], 8) |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
750 if value > 255: |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
751 raise error, 'octal value out of range' |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
752 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
753 return CHAR, chr(value), index + 3 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
754 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
755 else: |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
756 value = string.atoi(pattern[index:index + 2]) |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
757 if (value < 1) or (value > 99): |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
758 raise error, 'memory reference out of range' |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
759 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
760 if context == CHARCLASS: |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
761 raise error, ('cannot reference a register from ' |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
762 'inside a character class') |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
763 return MEMORY_REFERENCE, value, index + 2 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
764 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
765 else: |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
766 if context == CHARCLASS: |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
767 raise error, ('cannot reference a register from ' |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
768 'inside a character class') |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
769 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
770 value = string.atoi(pattern[index]) |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
771 return MEMORY_REFERENCE, value, index + 1 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
772 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
773 while (end < len(pattern)) and (pattern[end] in string.digits): |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
774 end = end + 1 |
|
4ce7827a3621
More changes by Jeffrey.
Guido van Rossum <guido@python.org>
parents:
5790
diff
changeset
|
775 value = pattern[index:end] |
| 5788 | 776 |
| 777 else: | |
| 778 return CHAR, pattern[index], index + 1 | |
| 779 | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
780 def compile(pattern, flags=0): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
781 stack = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
782 label = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
783 register = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
784 groupindex = {} |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
785 callouts = [] |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
786 |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
787 # preprocess the pattern looking for embedded pattern modifiers |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
788 |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
789 index = 0 |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
790 while (index != -1): |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
791 index = string.find(pattern, '(?', index) |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
792 if index != -1: |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
793 index = index + 2 |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
794 if (index < len(pattern)) and (pattern[index] in 'iImMsSxX'): |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
795 while (index < len(pattern)) and (pattern[index] != ')'): |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
796 if pattern[index] in 'iI': |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
797 flags = flags | IGNORECASE |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
798 elif pattern[index] in 'mM': |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
799 flags = flags | MULTILINE |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
800 elif pattern[index] in 'sS': |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
801 flags = flags | DOTALL |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
802 elif pattern[index] in 'xX': |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
803 flags = flags | VERBOSE |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
804 else: |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
805 raise error, 'unknown flag' |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
806 index = index + 1 |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
807 |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
808 index = 0 |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
809 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
810 while (index < len(pattern)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
811 char = pattern[index] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
812 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
813 if char == '\\': |
| 5788 | 814 escape_type, value, index = expand_escape(pattern, index) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
815 |
| 5788 | 816 if escape_type == CHAR: |
| 817 stack.append([Exact(value)]) | |
| 818 | |
| 819 elif escape_type == MEMORY_REFERENCE: | |
| 820 if value >= register: | |
| 821 raise error, ('cannot reference a register ' | |
| 822 'not yet used') | |
| 823 stack.append([MatchMemory(value)]) | |
| 824 | |
| 825 elif escape_type == BEGINNING_OF_BUFFER: | |
| 826 stack.append([BegBuf()]) | |
| 827 | |
| 828 elif escape_type == END_OF_BUFFER: | |
| 829 stack.append([EndBuf()]) | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
830 |
| 5788 | 831 elif escape_type == WORD_BOUNDARY: |
| 832 stack.append([WordBound()]) | |
| 833 | |
| 834 elif escape_type == NOT_WORD_BOUNDARY: | |
| 835 stack.append([NotWordBound()]) | |
| 836 | |
| 837 elif escape_type == SYNTAX: | |
| 838 stack.append([SyntaxSpec(value)]) | |
| 839 | |
| 840 elif escape_type == NOT_SYNTAX: | |
| 841 stack.append([NotSyntaxSpec(value)]) | |
| 842 | |
| 843 elif escape_type == SET: | |
| 844 raise error, 'cannot use set escape type here' | |
| 845 | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
846 else: |
| 5788 | 847 raise error, 'unknown escape type' |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
848 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
849 elif char == '|': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
850 expr = [] |
| 5788 | 851 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
852 while (len(stack) != 0) and \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
853 (stack[-1][0].name != '(') and \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
854 (stack[-1][0].name != '|'): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
855 expr = stack[-1] + expr |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
856 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
857 stack.append([FailureJump(label)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
858 expr + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
859 [Jump(-1), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
860 Label(label)]) |
| 5778 | 861 stack.append([Alternation()]) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
862 label = label + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
863 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
864 elif char == '(': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
865 if index >= len(pattern): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
866 raise error, 'no matching close paren' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
867 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
868 elif pattern[index] == '?': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
869 # Perl style (?...) extensions |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
870 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
871 if index >= len(pattern): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
872 raise error, 'extension ends prematurely' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
873 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
874 elif pattern[index] == 'P': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
875 # Python extensions |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
876 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
877 if index >= len(pattern): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
878 raise error, 'extension ends prematurely' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
879 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
880 elif pattern[index] == '<': |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
881 # Handle Python symbolic group names (?P<...>...) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
882 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
883 end = string.find(pattern, '>', index) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
884 if end == -1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
885 raise error, 'no end to symbolic group name' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
886 name = pattern[index:end] |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
887 if not valid_identifier(name): |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
888 raise error, ('symbolic group name must be a ' |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
889 'valid identifier') |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
890 index = end + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
891 groupindex[name] = register |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
892 stack.append([OpenParen(register)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
893 register = register + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
894 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
895 elif pattern[index] == '=': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
896 # backreference to symbolic group name |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
897 if index >= len(pattern): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
898 raise error, '(?P= at the end of the pattern' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
899 start = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
900 end = string.find(pattern, ')', start) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
901 if end == -1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
902 raise error, 'no ) to end symbolic group name' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
903 name = pattern[start:end] |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
904 if name not in groupindex.keys(): |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
905 raise error, ('symbolic group name ' + name + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
906 ' has not been used yet') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
907 stack.append([MatchMemory(groupindex[name])]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
908 index = end + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
909 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
910 elif pattern[index] == '!': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
911 # function callout |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
912 if index >= len(pattern): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
913 raise error, 'no function callout name' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
914 start = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
915 end = string.find(pattern, ')', start) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
916 if end == -1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
917 raise error, 'no ) to end function callout name' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
918 name = pattern[start:end] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
919 if name not in callouts: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
920 raise error, ('function callout name not listed ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
921 'in callouts dict') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
922 stack.append([FunctionCallout(name)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
923 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
924 else: |
| 5778 | 925 raise error, ('unknown Python extension: ' + \ |
| 926 pattern[index]) | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
927 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
928 elif pattern[index] == ':': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
929 # grouping, but no registers |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
930 index = index + 1 |
| 5778 | 931 stack.append([OpenParen(-1)]) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
932 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
933 elif pattern[index] == '#': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
934 # comment |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
935 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
936 end = string.find(pattern, ')', index) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
937 if end == -1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
938 raise error, 'no end to comment' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
939 index = end + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
940 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
941 elif pattern[index] == '=': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
942 raise error, ('zero-width positive lookahead ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
943 'assertion is unsupported') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
944 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
945 elif pattern[index] == '!': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
946 raise error, ('zero-width negative lookahead ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
947 'assertion is unsupported') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
948 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
949 elif pattern[index] in 'iImMsSxX': |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
950 # ignore embedded pattern modifiers here, they |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
951 # have already been taken care of in the |
|
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
952 # preprocessing |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
953 while (index < len(pattern)) and (pattern[index] != ')'): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
954 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
955 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
956 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
957 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
958 raise error, 'unknown extension' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
959 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
960 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
961 stack.append([OpenParen(register)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
962 register = register + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
963 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
964 elif char == ')': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
965 # make one expression out of everything on the stack up to |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
966 # the marker left by the last parenthesis |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
967 expr = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
968 while (len(stack) > 0) and (stack[-1][0].name != '('): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
969 expr = stack[-1] + expr |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
970 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
971 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
972 if len(stack) == 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
973 raise error, 'too many close parens' |
| 5788 | 974 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
975 # remove markers left by alternation |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
976 expr = filter(lambda x: x.name != '|', expr) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
977 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
978 # clean up jumps inserted by alternation |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
979 need_label = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
980 for i in range(len(expr)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
981 if (expr[i].name == 'jump') and (expr[i].label == -1): |
| 5788 | 982 expr[i] = Jump(label) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
983 need_label = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
984 if need_label: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
985 expr.append(Label(label)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
986 label = label + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
987 |
|
5763
fd4e9f293c77
New version from Jeffrey after I complained about some glaring bugs.
Guido van Rossum <guido@python.org>
parents:
5759
diff
changeset
|
988 if stack[-1][0].register > 0: |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
989 expr = [StartMemory(stack[-1][0].register)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
990 expr + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
991 [EndMemory(stack[-1][0].register)] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
992 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
993 stack.append(expr) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
994 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
995 elif char == '{': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
996 if len(stack) == 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
997 raise error, 'no expression to repeat' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
998 end = string.find(pattern, '}', index) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
999 if end == -1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1000 raise error, ('no close curly bracket to match' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1001 ' open curly bracket') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1002 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1003 fields = map(string.strip, |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1004 string.split(pattern[index:end], ',')) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1005 index = end + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1006 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1007 minimal = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1008 if (index < len(pattern)) and (pattern[index] == '?'): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1009 minimal = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1010 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1011 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1012 if len(fields) == 1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1013 # {n} or {n}? (there's really no difference) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1014 try: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1015 count = string.atoi(fields[0]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1016 except ValueError: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1017 raise error, ('count must be an integer ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1018 'inside curly braces') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1019 if count > 65535: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1020 raise error, 'repeat count out of range' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1021 expr = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1022 while count > 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1023 expr = expr + stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1024 count = count - 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1025 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1026 stack.append(expr) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1027 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1028 elif len(fields) == 2: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1029 # {n,} or {n,m} |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1030 if fields[1] == '': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1031 # {n,} |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1032 try: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1033 min = string.atoi(fields[0]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1034 except ValueError: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1035 raise error, ('minimum must be an integer ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1036 'inside curly braces') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1037 if min > 65535: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1038 raise error, 'minimum repeat count out of range' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1039 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1040 expr = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1041 while min > 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1042 expr = expr + stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1043 min = min - 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1044 if minimal: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1045 expr = expr + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1046 ([Jump(label + 1), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1047 Label(label)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1048 stack[-1] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1049 [Label(label + 1), |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
1050 FailureJump(label)]) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1051 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1052 expr = expr + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1053 ([Label(label), |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
1054 FailureJump(label + 1)] + |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1055 stack[-1] + |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1056 [StarJump(label), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1057 Label(label + 1)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1058 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1059 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1060 stack.append(expr) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1061 label = label + 2 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1062 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1063 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1064 # {n,m} |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1065 try: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1066 min = string.atoi(fields[0]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1067 except ValueError: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1068 raise error, ('minimum must be an integer ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1069 'inside curly braces') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1070 try: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1071 max = string.atoi(fields[1]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1072 except ValueError: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1073 raise error, ('maximum must be an integer ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1074 'inside curly braces') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1075 if min > 65535: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1076 raise error, ('minumim repeat count out ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1077 'of range') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1078 if max > 65535: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1079 raise error, ('maximum repeat count out ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1080 'of range') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1081 if min > max: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1082 raise error, ('minimum repeat count must be ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1083 'less than the maximum ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1084 'repeat count') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1085 expr = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1086 while min > 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1087 expr = expr + stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1088 min = min - 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1089 max = max - 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1090 if minimal: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1091 while max > 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1092 expr = expr + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1093 [FailureJump(label), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1094 Jump(label + 1), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1095 Label(label)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1096 stack[-1] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1097 [Label(label + 1)] |
|
5797
d689d2c4f842
Correct inf. while loop.
Guido van Rossum <guido@python.org>
parents:
5793
diff
changeset
|
1098 max = max - 1 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1099 label = label + 2 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1100 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1101 stack.append(expr) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1102 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1103 while max > 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1104 expr = expr + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1105 [FailureJump(label)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1106 stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1107 max = max - 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1108 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1109 stack.append(expr + [Label(label)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1110 label = label + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1111 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1112 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1113 raise error, ('there need to be one or two fields ' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1114 'in a {} expression') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1115 index = end + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1116 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1117 elif char == '}': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1118 raise error, 'unbalanced close curly brace' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1119 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1120 elif char == '*': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1121 # Kleene closure |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1122 if len(stack) == 0: |
|
5779
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
1123 raise error, '* needs something to repeat' |
|
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
1124 if (stack[-1][0].name == '(') or (stack[-1][0].name == '|'): |
|
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
1125 raise error, '* needs something to repeat' |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1126 registers = registers_used(stack[-1]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1127 if (index < len(pattern)) and (pattern[index] == '?'): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1128 # non-greedy matching |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
1129 expr = [Jump(label + 1), |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1130 Label(label)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1131 stack[-1] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1132 [Label(label + 1), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1133 FailureJump(label)] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1134 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1135 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1136 # greedy matching |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1137 expr = [Label(label), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1138 FailureJump(label + 1)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1139 stack[-1] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1140 [StarJump(label), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1141 Label(label + 1)] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1142 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1143 stack.append(expr) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1144 label = label + 2 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1145 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1146 elif char == '+': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1147 # positive closure |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1148 if len(stack) == 0: |
|
5779
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
1149 raise error, '+ needs something to repeat' |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
1150 |
|
5779
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
1151 if (stack[-1][0].name == '(') or (stack[-1][0].name == '|'): |
|
3428487b29a3
New from Jeffrey; small nits.
Guido van Rossum <guido@python.org>
parents:
5778
diff
changeset
|
1152 raise error, '+ needs something to repeat' |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
1153 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1154 if (index < len(pattern)) and (pattern[index] == '?'): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1155 # non-greedy |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1156 expr = [Label(label)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1157 stack[-1] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1158 [FailureJump(label)] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1159 label = label + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1160 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1161 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1162 # greedy |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1163 expr = [DummyFailureJump(label + 1), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1164 Label(label), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1165 FailureJump(label + 2), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1166 Label(label + 1)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1167 stack[-1] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1168 [StarJump(label), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1169 Label(label + 2)] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1170 label = label + 3 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1171 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1172 stack.append(expr) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1173 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1174 elif char == '?': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1175 if len(stack) == 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1176 raise error, 'need something to be optional' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1177 if (index < len(pattern)) and (pattern[index] == '?'): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1178 # non-greedy matching |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1179 expr = [FailureJump(label), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1180 Jump(label + 1), |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1181 Label(label)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1182 stack[-1] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1183 [Label(label + 1)] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1184 label = label + 2 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1185 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1186 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1187 # greedy matching |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1188 expr = [FailureJump(label)] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1189 stack[-1] + \ |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1190 [Label(label)] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1191 label = label + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1192 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1193 stack.append(expr) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1194 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1195 elif char == '.': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1196 if flags & DOTALL: |
|
5805
518d4f0c8fcc
Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents:
5797
diff
changeset
|
1197 stack.append([Set(map(chr, range(256)))]) |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1198 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1199 stack.append([AnyChar()]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1200 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1201 elif char == '^': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1202 if flags & MULTILINE: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1203 stack.append([Bol()]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1204 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1205 stack.append([BegBuf()]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1206 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1207 elif char == '$': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1208 if flags & MULTILINE: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1209 stack.append([Eol()]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1210 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1211 stack.append([EndBuf()]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1212 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1213 elif char == '#': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1214 if flags & VERBOSE: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1215 # comment |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1216 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1217 end = string.find(pattern, '\n', index) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1218 if end == -1: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1219 index = len(pattern) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1220 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1221 index = end + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1222 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1223 stack.append([Exact(char)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1224 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1225 elif char in string.whitespace: |
| 5788 | 1226 if not (flags & VERBOSE): |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1227 stack.append([Exact(char)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1228 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1229 elif char == '[': |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1230 # compile character class |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1231 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1232 if index >= len(pattern): |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1233 raise error, 'unclosed character class' |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1234 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1235 negate = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1236 last = '' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1237 set = [] |
| 5788 | 1238 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1239 if pattern[index] == '^': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1240 negate = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1241 index = index + 1 |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1242 if index >= len(pattern): |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1243 raise error, 'unclosed character class' |
| 5788 | 1244 |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1245 if pattern[index] == ']': |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1246 set.append(']') |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1247 index = index + 1 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1248 if index >= len(pattern): |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1249 raise error, 'unclosed character class' |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1250 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1251 elif pattern[index] == '-': |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1252 set.append('-') |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1253 index = index + 1 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1254 if index >= len(pattern): |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1255 raise error, 'unclosed character class' |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1256 |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1257 while (index < len(pattern)) and (pattern[index] != ']'): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1258 next = pattern[index] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1259 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1260 if next == '-': |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1261 if index >= len(pattern): |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1262 raise error, 'incomplete range in character class' |
| 5788 | 1263 |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1264 elif pattern[index] == ']': |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1265 set.append('-') |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1266 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1267 else: |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1268 if last == '': |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1269 raise error, ('improper use of range in ' |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1270 'character class') |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1271 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1272 start = last |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1273 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1274 if pattern[index] == '\\': |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1275 escape_type, |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1276 value, |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1277 index = expand_escape(pattern, |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1278 index + 1, |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1279 CHARCLASS) |
| 5788 | 1280 |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1281 if escape_type == CHAR: |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1282 end = value |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1283 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1284 else: |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1285 raise error, ('illegal escape in character ' |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1286 'class range') |
| 5788 | 1287 else: |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1288 end = pattern[index] |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1289 index = index + 1 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1290 |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1291 if start > end: |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1292 raise error, ('range arguments out of order ' |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1293 'in character class') |
| 5788 | 1294 |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1295 for char in map(chr, range(ord(start), ord(end) + 1)): |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1296 if char not in set: |
|
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1297 set.append(char) |
| 5788 | 1298 |
|
5789
88e6ae105ab5
Jeffrey's latest -- almost there.
Guido van Rossum <guido@python.org>
parents:
5788
diff
changeset
|
1299 last = '' |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1300 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1301 elif next == '\\': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1302 # expand syntax meta-characters and add to set |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1303 if index >= len(pattern): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1304 raise error, 'incomplete set' |
| 5788 | 1305 |
| 1306 escape_type, value, index = expand_escape(pattern, | |
| 1307 index, | |
| 1308 CHARCLASS) | |
| 1309 | |
| 1310 if escape_type == CHAR: | |
| 1311 set.append(value) | |
| 1312 last = value | |
| 1313 | |
| 1314 elif escape_type == SET: | |
| 1315 for char in value: | |
| 1316 if char not in set: | |
| 1317 set.append(char) | |
| 1318 last = '' | |
| 1319 | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1320 else: |
| 5788 | 1321 raise error, 'illegal escape type in character class' |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1322 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1323 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1324 if next not in set: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1325 set.append(next) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1326 last = next |
| 5788 | 1327 |
| 1328 if (index >= len(pattern)) or ( pattern[index] != ']'): | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1329 raise error, 'incomplete set' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1330 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1331 index = index + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1332 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1333 if negate: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1334 notset = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1335 for char in map(chr, range(256)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1336 if char not in set: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1337 notset.append(char) |
| 5788 | 1338 if len(notset) == 0: |
| 1339 raise error, 'empty negated set' | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1340 stack.append([Set(notset)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1341 else: |
| 5788 | 1342 if len(set) == 0: |
| 1343 raise error, 'empty set' | |
|
5759
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1344 stack.append([Set(set)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1345 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1346 else: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1347 stack.append([Exact(char)]) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1348 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1349 code = [] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1350 while len(stack) > 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1351 if stack[-1][0].name == '(': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1352 raise error, 'too many open parens' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1353 code = stack[-1] + code |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1354 del stack[-1] |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1355 if len(code) == 0: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1356 raise error, 'no code generated' |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1357 code = filter(lambda x: x.name != '|', code) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1358 need_label = 0 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1359 for i in range(len(code)): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1360 if (code[i].name == 'jump') and (code[i].label == -1): |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1361 code[i] = Jump(label) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1362 need_label = 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1363 if need_label: |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1364 code.append(Label(label)) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1365 label = label + 1 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1366 code.append(End()) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1367 return RegexObject(pattern, flags, code, register, groupindex, callouts) |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1368 |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1369 if __name__ == '__main__': |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1370 print compile('a(b)*') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1371 print compile('a{3}') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1372 print compile('(a){2}') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1373 print compile('a{2,4}') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1374 print compile('a|b') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1375 print compile('a(b|c)') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1376 print compile('a*') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1377 print compile('a+') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1378 print compile('a|b|c') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1379 print compile('a(b|c)*') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1380 print compile('\\n') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1381 print compile('a(?# huh huh)b') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1382 print compile('[a-c\\w]') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1383 print compile('[[]') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1384 print compile('[]]') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1385 print compile('(<hello>a)') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1386 print compile('\Q*\e') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1387 print compile('a{0,}') |
|
919386fb3e50
Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1388 |
