]> granicus.if.org Git - python/commitdiff
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
authorFredrik Lundh <fredrik@pythonware.com>
Sun, 21 Oct 2001 18:04:11 +0000 (18:04 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Sun, 21 Oct 2001 18:04:11 +0000 (18:04 +0000)
check to the test suite.

added a few missing exception checks in the _sre module

Lib/sre.py
Lib/test/test_sre.py
Modules/_sre.c

index 9c3f4b3ae040d95c542e6863a25a801db85ee2e1..701334e5db113430307d641e9c3e03bb3714684c 100644 (file)
@@ -330,15 +330,16 @@ copy_reg.pickle(_pattern_type, _pickle, _compile)
 # experimental stuff (see python-dev discussions for details)
 
 class Scanner:
-    def __init__(self, lexicon):
+    def __init__(self, lexicon, flags=0):
         from sre_constants import BRANCH, SUBPATTERN
         self.lexicon = lexicon
         # combine phrases into a compound pattern
         p = []
         s = sre_parse.Pattern()
+        s.flags = flags
         for phrase, action in lexicon:
             p.append(sre_parse.SubPattern(s, [
-                (SUBPATTERN, (len(p), sre_parse.parse(phrase))),
+                (SUBPATTERN, (len(p)+1, sre_parse.parse(phrase, flags))),
                 ]))
         p = sre_parse.SubPattern(s, [(BRANCH, (None, p))])
         s.groups = len(p)
@@ -346,16 +347,16 @@ class Scanner:
     def scan(self, string):
         result = []
         append = result.append
-        match = self.scanner.match
+        match = self.scanner.scanner(string).match
         i = 0
         while 1:
-            m = match(string, i)
+            m = match()
             if not m:
                 break
             j = m.end()
             if i == j:
                 break
-            action = self.lexicon[m.lastindex][1]
+            action = self.lexicon[m.lastindex-1][1]
             if callable(action):
                 self.match = m
                 action = action(self, m.group())
index 12a66f9aa7fcb19bb7185394bcb44e4804ed8781..e8791519d50c493c2d903163c64e0b0c45a889be 100644 (file)
@@ -223,6 +223,26 @@ pat = sre.compile(sre.escape(p))
 test(r"""pat.match(p) is not None""", 1)
 test(r"""pat.match(p).span()""", (0,256))
 
+if verbose:
+    print 'Running tests on sre.Scanner'
+
+def s_ident(scanner, token): return token
+def s_operator(scanner, token): return "op%s" % token
+def s_float(scanner, token): return float(token)
+def s_int(scanner, token): return int(token)
+
+scanner = sre.Scanner([
+    (r"[a-zA-Z_]\w*", s_ident),
+    (r"\d+\.\d*", s_float),
+    (r"\d+", s_int),
+    (r"=|\+|-|\*|/", s_operator),
+    (r"\s+", None),
+    ])
+
+# sanity check
+test('scanner.scan("sum = 3*foo + 312.50 + bar")',
+     (['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5, 'op+', 'bar'], ''))
+
 if verbose:
     print 'Pickling a SRE_Pattern instance'
 
index be93d937177c3d36abe453bc24548d8de617c2da..3a2d47c997ce3a46303b83dbfc50cff9ce058a72 100644 (file)
@@ -1800,6 +1800,11 @@ join(PyObject* list, PyObject* pattern)
         return NULL;
     }
     args = PyTuple_New(1);
+    if (!args) {
+        Py_DECREF(function);
+        Py_DECREF(joiner);
+        return NULL;
+    }
     PyTuple_SET_ITEM(args, 0, list);
     result = PyObject_CallObject(function, args);
     Py_DECREF(args); /* also removes list */
@@ -1896,6 +1901,10 @@ pattern_findall(PatternObject* self, PyObject* args, PyObject* kw)
         return NULL;
 
     list = PyList_New(0);
+    if (!list) {
+        state_fini(&state);
+        return NULL;
+    }
 
     while (state.start <= state.end) {
 
@@ -1995,6 +2004,10 @@ pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
         return NULL;
 
     list = PyList_New(0);
+    if (!list) {
+        state_fini(&state);
+        return NULL;
+    }
 
     n = 0;
     last = state.start;
@@ -2110,6 +2123,10 @@ pattern_subx(PatternObject* self, PyObject* template, PyObject* string,
         return NULL;
 
     list = PyList_New(0);
+    if (!list) {
+        state_fini(&state);
+        return NULL;
+    }
 
     n = i = 0;