# master pattern object. keeps track of global attributes
def __init__(self):
self.flags = 0
- self.open = []
- self.groups = 1
self.groupdict = {}
+ self.subpatterns = [None] # group 0
+ @property
+ def groups(self):
+ return len(self.subpatterns)
def opengroup(self, name=None):
gid = self.groups
- self.groups = gid + 1
+ self.subpatterns.append(None)
+ if self.groups > MAXGROUPS:
+ raise error("groups number is too large")
if name is not None:
ogid = self.groupdict.get(name, None)
if ogid is not None:
i, j = av[2].getwidth()
lo = lo + i * av[0]
hi = hi + j * av[1]
- elif op in UNITCODES:
+ elif op in _UNITCODES:
lo = lo + 1
hi = hi + 1
- elif op == SUCCESS:
+ elif op is GROUPREF:
+ i, j = self.pattern.subpatterns[av].getwidth()
+ lo = lo + i
+ hi = hi + j
+ elif op is GROUPREF_EXISTS:
+ i, j = av[1].getwidth()
+ if av[2] is not None:
+ l, h = av[2].getwidth()
+ i = min(i, l)
+ j = max(j, h)
+ else:
+ i = 0
+ lo = lo + i
+ hi = hi + j
+ elif op is SUCCESS:
break
self.width = min(lo, MAXREPEAT - 1), min(hi, MAXREPEAT)
return self.width
if not sourcematch(")"):
raise error("unbalanced parenthesis")
if group is not None:
- state.closegroup(group)
+ state.closegroup(group, p)
subpatternappend((SUBPATTERN, (group, p)))
else:
- while 1:
+ while True:
char = sourceget()
if char is None:
raise error("unexpected end of pattern")