More changes by Jeffrey.

This commit is contained in:
Guido van Rossum 1997-07-15 18:11:42 +00:00
parent 23b8d4c15e
commit 9f845ec64b
1 changed files with 52 additions and 24 deletions

View File

@ -688,34 +688,62 @@ def expand_escape(pattern, index, context=NORMAL):
return CHAR, 'D', index + 1
elif pattern[index] in '0123456789':
end = index
while (end < len(pattern)) and (pattern[end] in string.digits):
end = end + 1
value = pattern[index:end]
if (len(value) == 3) or ((len(value) == 2) and (value[0] == '0')):
# octal character value
value = string.atoi(value, 8)
if pattern[index] == '0':
if (index + 1 < len(pattern)) and \
(pattern[index + 1] in string.octdigits):
if (index + 2 < len(pattern)) and \
(pattern[index + 2] in string.octdigits):
value = string.atoi(pattern[index:index + 3], 8)
index = index + 3
else:
value = string.atoi(pattern[index:index + 2], 8)
index = index + 2
else:
value = 0
index = index + 1
if value > 255:
raise error, 'octal char out of range'
return CHAR, chr(value), end
elif value == '0':
return CHAR, chr(0), end
elif len(value) > 3:
raise error, ('\\' + value + ' has too many digits')
raise error, 'octal value out of range'
return CHAR, chr(value), index
else:
# \1-\99 - reference a register
if context == CHARCLASS:
raise error, ('cannot reference a register from '
'inside a character class')
value = string.atoi(value)
if value == 0:
raise error, ('register 0 cannot be used '
'during match')
return MEMORY_REFERENCE, value, end
if (index + 1 < len(pattern)) and \
(pattern[index + 1] in string.digits):
if (index + 2 < len(pattern)) and \
(pattern[index + 2] in string.octdigits) and \
(pattern[index + 1] in string.octdigits) and \
(pattern[index] in string.octdigits):
value = string.atoi(pattern[index:index + 3], 8)
if value > 255:
raise error, 'octal value out of range'
return CHAR, chr(value), index + 3
else:
value = string.atoi(pattern[index:index + 2])
if (value < 1) or (value > 99):
raise error, 'memory reference out of range'
if context == CHARCLASS:
raise error, ('cannot reference a register from '
'inside a character class')
return MEMORY_REFERENCE, value, index + 2
else:
if context == CHARCLASS:
raise error, ('cannot reference a register from '
'inside a character class')
value = string.atoi(pattern[index])
return MEMORY_REFERENCE, value, index + 1
while (end < len(pattern)) and (pattern[end] in string.digits):
end = end + 1
value = pattern[index:end]
else:
return CHAR, pattern[index], index + 1