]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
- fixed "{ in any other context" bug
authorFredrik Lundh <fredrik@pythonware.com>
Sat, 1 Jul 2000 23:49:14 +0000 (23:49 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Sat, 1 Jul 2000 23:49:14 +0000 (23:49 +0000)
- minor comment touchups in the C module

Lib/sre_parse.py
Modules/_sre.c

index 0e01ad62dbf42cfa506aefef67c34273630270d1..12f49c3620d72f14daa2e3b382ee247711715131 100644 (file)
@@ -142,12 +142,13 @@ class SubPattern:
 
 class Tokenizer:
     def __init__(self, string):
-        self.index = 0
         self.string = string
-        self.next = self.__next()
+        self.index = 0
+        self.__next()
     def __next(self):
         if self.index >= len(self.string):
-            return None
+            self.next = None
+            return
         char = self.string[self.index]
         if char[0] == "\\":
             try:
@@ -156,21 +157,20 @@ class Tokenizer:
                 raise error, "bogus escape"
             char = char + c
         self.index = self.index + len(char)
-        return char
+        self.next = char
     def match(self, char):
         if char == 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()
+            self.__next()
             return 1
         return 0
     def get(self):
         this = self.next
-        self.next = self.__next()
+        self.__next()
         return this
+    def tell(self):
+        return self.index, self.next
+    def seek(self, index):
+        self.index, self.next = index
 
 def isident(char):
     return "a" <= char <= "z" or "A" <= char <= "Z" or char == "_"
@@ -381,6 +381,7 @@ def _parse(source, state):
             elif this == "+":
                 min, max = 1, MAXREPEAT
             elif this == "{":
+                here = source.tell()
                 min, max = 0, MAXREPEAT
                 lo = hi = ""
                 while source.next in DIGITS:
@@ -391,7 +392,9 @@ def _parse(source, state):
                 else:
                     hi = lo
                 if not source.match("}"):
-                    raise error, "bogus range"
+                    subpattern.append((LITERAL, ord(this)))
+                    source.seek(here)
+                    continue
                 if lo:
                     min = int(lo)
                 if hi:
index 3d6305a6ae222e1bd3cde5b003b0f6166727ceee..7206b9570e2c02c5acf1b2a8bdf80cebf44c7691 100644 (file)
@@ -19,7 +19,7 @@
  * 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-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)
  *
  * 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;
 
                case SRE_OP_LITERAL:
+            /* args: <literal> */
                        if (ch == set[0])
                                return ok;
                        set++;
                        break;
 
                case SRE_OP_RANGE:
+            /* args: <lower> <upper> */
                        if (set[0] <= ch && ch <= set[1])
                                return ok;
                        set += 2;
                        break;
 
                case SRE_OP_CATEGORY:
+            /* args: <category> */
                        if (sre_category(set[0], (int) ch))
                                return ok;
                        set += 1;