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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
132 def match(self, string, pos=0):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
133 regs = reop.match(self.buffer,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
134 self.num_regs,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
135 self.flags,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
136 self.fastmap.can_be_null,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
137 self.fastmap.fastmap(),
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
138 self.anchor,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
139 string,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
140 pos)
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
141 if regs is None:
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
144 return MatchObject(self,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
145 string,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
146 pos,
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
147 regs)
5805
518d4f0c8fcc Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents: 5797
diff changeset
148
5778
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
149 def sub(self, repl, string, count=0):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
150 pass
5805
518d4f0c8fcc Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents: 5797
diff changeset
151
5778
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
152 def subn(self, repl, string, count=0):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
153 pass
5805
518d4f0c8fcc Jeffrey's latest -- seems to solve most problems!
Guido van Rossum <guido@python.org>
parents: 5797
diff changeset
154
5778
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
155 def split(self, string, maxsplit=0):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
165 def start(self, g):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
170 raise IndexError, ('group "' + g + '" is undefined')
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
173 def end(self, g):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
176 g = self.re.groupindex[g]
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
177 except (KeyError, TypeError):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
178 raise IndexError, ('group "' + g + '" is undefined')
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
181 def span(self, g):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
182 if type(g) == type(''):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
183 try:
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
186 raise IndexError, ('group "' + g + '" is undefined')
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
189 def group(self, *groups):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
190 if len(groups) == 0:
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
195 result = []
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
196 for g in groups:
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
197 if type(g) == type(''):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
198 try:
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
199 g = self.re.groupindex[g]
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
200 except (KeyError, TypeError):
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
201 raise IndexError, ('group "' + g + '" is undefined')
5788
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
202 if (self.regs[g][0] == -1) or (self.regs[g][1] == -1):
5778
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
203 result.append(None)
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
204 else:
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
207 return tuple(result)
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
208 elif len(result) == 1:
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
209 return result[0]
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
210 else:
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
459 result.append('\\')
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
460 result.append(char)
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
572 [NORMAL, CHARCLASS, REPLACEMENT] = range(3)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
573 [CHAR, MEMORY_REFERENCE, SYNTAX, SET, WORD_BOUNDARY, NOT_WORD_BOUNDARY,
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
574 BEGINNING_OF_BUFFER, END_OF_BUFFER] = range(8)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
575
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
576 def expand_escape(pattern, index, context=NORMAL):
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
577 if index >= len(pattern):
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
578 raise error, 'escape ends too soon'
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
579
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
580 elif pattern[index] == 't':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
581 return CHAR, chr(9), index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
582
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
583 elif pattern[index] == 'n':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
584 return CHAR, chr(10), index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
585
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
586 elif pattern[index] == 'r':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
587 return CHAR, chr(13), index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
588
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
589 elif pattern[index] == 'f':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
590 return CHAR, chr(12), index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
591
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
592 elif pattern[index] == 'a':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
593 return CHAR, chr(7), index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
594
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
595 elif pattern[index] == 'e':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
596 return CHAR, chr(27), index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
597
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
598 elif pattern[index] == 'c':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
599 if index + 1 >= len(pattern):
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
600 raise error, '\\c must be followed by another character'
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
601 elif pattern[index + 1] in 'abcdefghijklmnopqrstuvwxyz':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
602 return CHAR, chr(ord(pattern[index + 1]) - ord('a') + 1), index + 2
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
603 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
604 return CHAR, chr(ord(pattern[index + 1]) ^ 64), index + 2
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
605
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
606 elif pattern[index] == 'x':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
607 # CAUTION: this is the Python rule, not the Perl rule!
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
608 end = index
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
609 while (end < len(pattern)) and (pattern[end] in string.hexdigits):
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
610 end = end + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
611 if end == index:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
612 raise error, "\\x must be followed by hex digit(s)"
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
613 # let Python evaluate it, so we don't incorrectly 2nd-guess
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
614 # what it's doing (and Python in turn passes it on to sscanf,
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
615 # so that *it* doesn't incorrectly 2nd-guess what C does!)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
616 char = eval ('"' + pattern[index-2:end] + '"')
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
617 assert len(char) == 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
618 return CHAR, char, end
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
619
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
620 elif pattern[index] == 'b':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
621 if context != NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
622 return CHAR, chr(8), index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
623 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
624 return WORD_BOUNDARY, '', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
625
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
626 elif pattern[index] == 'B':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
627 if context != NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
628 return CHAR, 'B', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
629 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
630 return NOT_WORD_BOUNDARY, '', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
631
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
632 elif pattern[index] == 'A':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
633 if context != NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
634 return CHAR, 'A', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
635 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
636 return BEGINNING_OF_BUFFER, '', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
637
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
638 elif pattern[index] == 'Z':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
639 if context != NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
640 return 'Z', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
641 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
642 return END_OF_BUFFER, '', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
643
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
644 elif pattern[index] in 'GluLUQE':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
645 raise error, ('\\' + ch + ' is not allowed')
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
646
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
647 elif pattern[index] == 'w':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
648 if context == NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
649 return SYNTAX, 'word', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
650 elif context == CHARCLASS:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
651 set = []
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
652 for char in syntax_table.keys():
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
653 if 'word' in syntax_table[char]:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
654 set.append(char)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
655 return SET, set, index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
656 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
657 return CHAR, 'w', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
658
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
659 elif pattern[index] == 'W':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
660 if context == NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
661 return NOT_SYNTAX, 'word', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
662 elif context == CHARCLASS:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
663 set = []
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
664 for char in syntax_table.keys():
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
665 if 'word' not in syntax_table[char]:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
666 set.append(char)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
667 return SET, set, index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
668 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
669 return CHAR, 'W', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
670
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
671 elif pattern[index] == 's':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
672 if context == NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
673 return SYNTAX, 'whitespace', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
674 elif context == CHARCLASS:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
675 set = []
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
676 for char in syntax_table.keys():
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
677 if 'whitespace' in syntax_table[char]:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
678 set.append(char)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
679 return SET, set, index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
680 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
681 return CHAR, 's', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
682
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
683 elif pattern[index] == 'S':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
684 if context == NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
685 return NOT_SYNTAX, 'whitespace', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
686 elif context == CHARCLASS:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
687 set = []
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
688 for char in syntax_table.keys():
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
689 if 'whitespace' not in syntax_table[char]:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
690 set.append(char)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
691 return SET, set, index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
692 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
693 return CHAR, 'S', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
694
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
695 elif pattern[index] == 'd':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
696 if context == NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
697 return SYNTAX, 'digit', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
698 elif context == CHARCLASS:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
699 set = []
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
700 for char in syntax_table.keys():
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
701 if 'digit' in syntax_table[char]:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
702 set.append(char)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
703 return SET, set, index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
704 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
705 return CHAR, 'd', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
706
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
707 elif pattern[index] == 'D':
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
708 if context == NORMAL:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
709 return NOT_SYNTAX, 'digit', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
710 elif context == CHARCLASS:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
711 set = []
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
712 for char in syntax_table.keys():
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
713 if 'digit' not in syntax_table[char]:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
714 set.append(char)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
715 return SET, set, index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
716 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
717 return CHAR, 'D', index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
718
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
776
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
777 else:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
778 return CHAR, pattern[index], index + 1
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
816 if escape_type == CHAR:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
817 stack.append([Exact(value)])
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
818
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
819 elif escape_type == MEMORY_REFERENCE:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
820 if value >= register:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
821 raise error, ('cannot reference a register '
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
822 'not yet used')
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
823 stack.append([MatchMemory(value)])
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
824
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
825 elif escape_type == BEGINNING_OF_BUFFER:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
826 stack.append([BegBuf()])
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
827
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
828 elif escape_type == END_OF_BUFFER:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
829 stack.append([EndBuf()])
5759
919386fb3e50 Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff changeset
830
5788
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
831 elif escape_type == WORD_BOUNDARY:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
832 stack.append([WordBound()])
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
833
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
834 elif escape_type == NOT_WORD_BOUNDARY:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
835 stack.append([NotWordBound()])
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
836
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
837 elif escape_type == SYNTAX:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
838 stack.append([SyntaxSpec(value)])
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
839
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
840 elif escape_type == NOT_SYNTAX:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
841 stack.append([NotSyntaxSpec(value)])
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
842
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
843 elif escape_type == SET:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
844 raise error, 'cannot use set escape type here'
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
845
5759
919386fb3e50 Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff changeset
846 else:
5788
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
925 raise error, ('unknown Python extension: ' + \
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
049d94ffc06a Jeffrey's latest.
Guido van Rossum <guido@python.org>
parents: 5764
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1305
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1306 escape_type, value, index = expand_escape(pattern,
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1307 index,
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1308 CHARCLASS)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1309
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1310 if escape_type == CHAR:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1311 set.append(value)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1312 last = value
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1313
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1314 elif escape_type == SET:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1315 for char in value:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1316 if char not in set:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1317 set.append(char)
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1318 last = ''
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1319
5759
919386fb3e50 Straight from Jeffrey Ollie's web page.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1320 else:
5788
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1327
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1338 if len(notset) == 0:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
1342 if len(set) == 0:
31cae374f786 Jeffrey's newest
Guido van Rossum <guido@python.org>
parents: 5779
diff changeset
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