[Python-checkins] CVS: python/dist/src/Lib sre_parse.py,1.39,1.40

Fredrik Lundh python-dev@python.org
Sun, 14 Jan 2001 13:00:46 -0800


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv11051/Lib

Modified Files:
	sre_parse.py 
Log Message:


SRE: stricter pattern syntax checking (covers parts of bug #115900)


Index: sre_parse.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/sre_parse.py,v
retrieving revision 1.39
retrieving revision 1.40
diff -C2 -r1.39 -r1.40
*** sre_parse.py	2001/01/14 15:06:11	1.39
--- sre_parse.py	2001/01/14 21:00:44	1.40
***************
*** 9,12 ****
--- 9,14 ----
  #
  
+ # XXX: show string offset and offending character for all errors
+ 
  import string, sys
  
***************
*** 411,419 ****
                              code2 = LITERAL, ord(this)
                          if code1[0] != LITERAL or code2[0] != LITERAL:
!                             raise error, "illegal range"
                          lo = code1[1]
                          hi = code2[1]
                          if hi < lo:
!                             raise error, "illegal range"
                          set.append((RANGE, (lo, hi)))
                  else:
--- 413,421 ----
                              code2 = LITERAL, ord(this)
                          if code1[0] != LITERAL or code2[0] != LITERAL:
!                             raise error, "bad character range"
                          lo = code1[1]
                          hi = code2[1]
                          if hi < lo:
!                             raise error, "bad character range"
                          set.append((RANGE, (lo, hi)))
                  else:
***************
*** 458,462 ****
                  if hi:
                      max = int(hi)
!                 # XXX: <fl> check that hi >= lo ???
              else:
                  raise error, "not supported"
--- 460,465 ----
                  if hi:
                      max = int(hi)
!                 if max < min:
!                     raise error, "bad repeat interval"
              else:
                  raise error, "not supported"
***************
*** 466,469 ****
--- 469,474 ----
              else:
                  raise error, "nothing to repeat"
+             if item[0][0] in (MIN_REPEAT, MAX_REPEAT):
+                 raise error, "multiple repeat"
              if source.match("?"):
                  subpattern[-1] = (MIN_REPEAT, (min, max, item))
***************
*** 494,498 ****
                          group = 1
                          if not isname(name):
!                             raise error, "illegal character in group name"
                      elif source.match("="):
                          # named backreference
--- 499,503 ----
                          group = 1
                          if not isname(name):
!                             raise error, "bad character in group name"
                      elif source.match("="):
                          # named backreference
***************
*** 506,510 ****
                              name = name + char
                          if not isname(name):
!                             raise error, "illegal character in group name"
                          gid = state.groupdict.get(name)
                          if gid is None:
--- 511,515 ----
                              name = name + char
                          if not isname(name):
!                             raise error, "bad character in group name"
                          gid = state.groupdict.get(name)
                          if gid is None:
***************
*** 548,551 ****
--- 553,558 ----
                  else:
                      # flags
+                     if not FLAGS.has_key(source.next):
+                         raise error, "unexpected end of pattern"
                      while FLAGS.has_key(source.next):
                          state.flags = state.flags | FLAGS[source.get()]
***************
*** 566,570 ****
                  while 1:
                      char = source.get()
!                     if char is None or char == ")":
                          break
                      raise error, "unknown extension"
--- 573,579 ----
                  while 1:
                      char = source.get()
!                     if char is None:
!                         raise error, "unexpected end of pattern"
!                     if char == ")":
                          break
                      raise error, "unknown extension"
***************
*** 593,596 ****
--- 602,606 ----
          pattern = Pattern()
      pattern.flags = flags
+     pattern.str = str
  
      p = _parse_sub(source, pattern, 0)
***************
*** 640,644 ****
                  except ValueError:
                      if not isname(name):
!                         raise error, "illegal character in group name"
                      try:
                          index = pattern.groupindex[name]
--- 650,654 ----
                  except ValueError:
                      if not isname(name):
!                         raise error, "bad character in group name"
                      try:
                          index = pattern.groupindex[name]