- fixed "{ in any other context" bug

- minor comment touchups in the C module
This commit is contained in:
Fredrik Lundh 2000-07-01 23:49:14 +00:00
parent 0cebe439ce
commit c13222cdff
2 changed files with 19 additions and 13 deletions

View File

@ -142,12 +142,13 @@ class SubPattern:
class Tokenizer: class Tokenizer:
def __init__(self, string): def __init__(self, string):
self.index = 0
self.string = string self.string = string
self.next = self.__next() self.index = 0
self.__next()
def __next(self): def __next(self):
if self.index >= len(self.string): if self.index >= len(self.string):
return None self.next = None
return
char = self.string[self.index] char = self.string[self.index]
if char[0] == "\\": if char[0] == "\\":
try: try:
@ -156,21 +157,20 @@ class Tokenizer:
raise error, "bogus escape" raise error, "bogus escape"
char = char + c char = char + c
self.index = self.index + len(char) self.index = self.index + len(char)
return char self.next = char
def match(self, char): def match(self, char):
if char == self.next: if char == self.next:
self.next = self.__next() self.__next()
return 1
return 0
def match_set(self, set):
if self.next and self.next in set:
self.next = self.__next()
return 1 return 1
return 0 return 0
def get(self): def get(self):
this = self.next this = self.next
self.next = self.__next() self.__next()
return this return this
def tell(self):
return self.index, self.next
def seek(self, index):
self.index, self.next = index
def isident(char): def isident(char):
return "a" <= char <= "z" or "A" <= char <= "Z" or char == "_" return "a" <= char <= "z" or "A" <= char <= "Z" or char == "_"
@ -381,6 +381,7 @@ def _parse(source, state):
elif this == "+": elif this == "+":
min, max = 1, MAXREPEAT min, max = 1, MAXREPEAT
elif this == "{": elif this == "{":
here = source.tell()
min, max = 0, MAXREPEAT min, max = 0, MAXREPEAT
lo = hi = "" lo = hi = ""
while source.next in DIGITS: while source.next in DIGITS:
@ -391,7 +392,9 @@ def _parse(source, state):
else: else:
hi = lo hi = lo
if not source.match("}"): if not source.match("}"):
raise error, "bogus range" subpattern.append((LITERAL, ord(this)))
source.seek(here)
continue
if lo: if lo:
min = int(lo) min = int(lo)
if hi: if hi:

View File

@ -19,7 +19,7 @@
* 00-06-25 fl major changes to better deal with nested repeats (0.9) * 00-06-25 fl major changes to better deal with nested repeats (0.9)
* 00-06-28 fl fixed findall (0.9.1) * 00-06-28 fl fixed findall (0.9.1)
* 00-06-29 fl fixed split, added more scanner features (0.9.2) * 00-06-29 fl fixed split, added more scanner features (0.9.2)
* 00-06-30 fl tuning, fast search (0.9.3) * 00-06-30 fl added fast search optimization (0.9.3)
* 00-06-30 fl added assert (lookahead) primitives, etc (0.9.4) * 00-06-30 fl added assert (lookahead) primitives, etc (0.9.4)
* *
* Copyright (c) 1997-2000 by Secret Labs AB. All rights reserved. * Copyright (c) 1997-2000 by Secret Labs AB. All rights reserved.
@ -365,18 +365,21 @@ SRE_MEMBER(SRE_CODE* set, SRE_CODE ch)
return !ok; return !ok;
case SRE_OP_LITERAL: case SRE_OP_LITERAL:
/* args: <literal> */
if (ch == set[0]) if (ch == set[0])
return ok; return ok;
set++; set++;
break; break;
case SRE_OP_RANGE: case SRE_OP_RANGE:
/* args: <lower> <upper> */
if (set[0] <= ch && ch <= set[1]) if (set[0] <= ch && ch <= set[1])
return ok; return ok;
set += 2; set += 2;
break; break;
case SRE_OP_CATEGORY: case SRE_OP_CATEGORY:
/* args: <category> */
if (sre_category(set[0], (int) ch)) if (sre_category(set[0], (int) ch))
return ok; return ok;
set += 1; set += 1;