return False
return True
-def _class_escape(source, escape):
+def _class_escape(source, escape, nested):
# handle escape code inside character class
code = ESCAPES.get(escape)
if code:
if c in 'Uu':
warnings.warn('bad escape %s; Unicode escapes are '
'supported only since Python 3.3' % escape,
- FutureWarning, stacklevel=8)
+ FutureWarning, stacklevel=nested + 6)
else:
warnings.warnpy3k('bad escape %s' % escape,
- DeprecationWarning, stacklevel=8)
+ DeprecationWarning, stacklevel=nested + 6)
return LITERAL, ord(escape[1])
except ValueError:
pass
raise error, "bogus escape: %s" % repr(escape)
-def _escape(source, escape, state):
+def _escape(source, escape, state, nested):
# handle escape code in expression
code = CATEGORIES.get(escape)
if code:
import warnings
warnings.warn('group references in lookbehind '
'assertions are not supported',
- RuntimeWarning)
+ RuntimeWarning, stacklevel=nested + 6)
return GROUPREF, group
raise ValueError
if len(escape) == 2:
if c in 'Uu':
warnings.warn('bad escape %s; Unicode escapes are '
'supported only since Python 3.3' % escape,
- FutureWarning, stacklevel=8)
+ FutureWarning, stacklevel=nested + 6)
else:
warnings.warnpy3k('bad escape %s' % escape,
- DeprecationWarning, stacklevel=8)
+ DeprecationWarning, stacklevel=nested + 6)
return LITERAL, ord(escape[1])
except ValueError:
pass
raise error, "bogus escape: %s" % repr(escape)
-def _parse_sub(source, state, nested=1):
+def _parse_sub(source, state, nested):
# parse an alternation: a|b|c
items = []
itemsappend = items.append
sourcematch = source.match
while 1:
- itemsappend(_parse(source, state))
+ itemsappend(_parse(source, state, nested + 1))
if sourcematch("|"):
continue
if not nested:
subpattern.append((BRANCH, (None, items)))
return subpattern
-def _parse_sub_cond(source, state, condgroup):
- item_yes = _parse(source, state)
+def _parse_sub_cond(source, state, condgroup, nested):
+ item_yes = _parse(source, state, nested + 1)
if source.match("|"):
- item_no = _parse(source, state)
+ item_no = _parse(source, state, nested + 1)
if source.match("|"):
raise error, "conditional backref with more than two branches"
else:
_LOOKBEHINDASSERTCHARS = set("=!")
_REPEATCODES = set([MIN_REPEAT, MAX_REPEAT])
-def _parse(source, state):
+def _parse(source, state, nested):
# parse a simple pattern
subpattern = SubPattern(state)
if this == "]" and set != start:
break
elif this and this[0] == "\\":
- code1 = _class_escape(source, this)
+ code1 = _class_escape(source, this, nested + 1)
elif this:
code1 = LITERAL, ord(this)
else:
break
elif this:
if this[0] == "\\":
- code2 = _class_escape(source, this)
+ code2 = _class_escape(source, this, nested + 1)
else:
code2 = LITERAL, ord(this)
if code1[0] != LITERAL or code2[0] != LITERAL:
import warnings
warnings.warn('group references in lookbehind '
'assertions are not supported',
- RuntimeWarning)
+ RuntimeWarning, stacklevel=nested + 6)
subpatternappend((GROUPREF, gid))
continue
else:
dir = -1 # lookbehind
char = sourceget()
state.lookbehind += 1
- p = _parse_sub(source, state)
+ p = _parse_sub(source, state, nested + 1)
if dir < 0:
state.lookbehind -= 1
if not sourcematch(")"):
import warnings
warnings.warn('group references in lookbehind '
'assertions are not supported',
- RuntimeWarning)
+ RuntimeWarning, stacklevel=nested + 6)
else:
# flags
if not source.next in FLAGS:
else:
group = state.opengroup(name)
if condgroup:
- p = _parse_sub_cond(source, state, condgroup)
+ p = _parse_sub_cond(source, state, condgroup, nested + 1)
else:
- p = _parse_sub(source, state)
+ p = _parse_sub(source, state, nested + 1)
if not sourcematch(")"):
raise error, "unbalanced parenthesis"
if group is not None:
subpattern.append((AT, AT_END))
elif this and this[0] == "\\":
- code = _escape(source, this, state)
+ code = _escape(source, this, state, nested + 1)
subpatternappend(code)
else: