diff options
Diffstat (limited to 'pyparsing.py')
-rw-r--r-- | pyparsing.py | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/pyparsing.py b/pyparsing.py index 4d2f98e..135b6a0 100644 --- a/pyparsing.py +++ b/pyparsing.py @@ -95,8 +95,8 @@ classes inherit from. Use the docstrings for examples of how to: namespace class """ -__version__ = "2.4.6" -__versionTime__ = "24 Dec 2019 04:27 UTC" +__version__ = "2.4.7" +__versionTime__ = "04 Mar 2020 02:48 UTC" __author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" import string @@ -1391,6 +1391,12 @@ class ParserElement(object): """ ParserElement._literalStringClass = cls + @classmethod + def _trim_traceback(cls, tb): + while tb.tb_next: + tb = tb.tb_next + return tb + def __init__(self, savelist=False): self.parseAction = list() self.failAction = None @@ -1943,7 +1949,8 @@ class ParserElement(object): if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc else: return tokens @@ -2017,7 +2024,8 @@ class ParserElement(object): if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc def transformString(self, instring): @@ -2063,7 +2071,8 @@ class ParserElement(object): if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc def searchString(self, instring, maxMatches=_MAX_INT): @@ -2093,7 +2102,8 @@ class ParserElement(object): if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): @@ -2565,7 +2575,8 @@ class ParserElement(object): if ParserElement.verbose_stacktrace: raise else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + exc.__traceback__ = self._trim_traceback(exc.__traceback__) raise exc def __eq__(self, other): @@ -3312,7 +3323,7 @@ class Regex(Token): self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayIndexError = False - self.mayReturnEmpty = True + self.mayReturnEmpty = self.re_match("") is not None self.asGroupList = asGroupList self.asMatch = asMatch if self.asGroupList: @@ -3993,6 +4004,7 @@ class And(ParseExpression): self.leaveWhitespace() def __init__(self, exprs, savelist=True): + exprs = list(exprs) if exprs and Ellipsis in exprs: tmp = [] for i, expr in enumerate(exprs): @@ -4358,7 +4370,7 @@ class Each(ParseExpression): if self.initExprGroups: self.opt1map = dict((id(e.expr), e) for e in self.exprs if isinstance(e, Optional)) opt1 = [e.expr for e in self.exprs if isinstance(e, Optional)] - opt2 = [e for e in self.exprs if e.mayReturnEmpty and not isinstance(e, Optional)] + opt2 = [e for e in self.exprs if e.mayReturnEmpty and not isinstance(e, (Optional, Regex))] self.optionals = opt1 + opt2 self.multioptionals = [e.expr for e in self.exprs if isinstance(e, ZeroOrMore)] self.multirequired = [e.expr for e in self.exprs if isinstance(e, OneOrMore)] |