diff options
author | Paul McGuire <ptmcg@austin.rr.com> | 2019-03-30 02:28:19 -0500 |
---|---|---|
committer | Paul McGuire <ptmcg@austin.rr.com> | 2019-03-30 02:28:19 -0500 |
commit | 5a2fd3bd482d7c3c61d054601c4a17a1111e7747 (patch) | |
tree | 412cc2641682f168bd3c9ec7f917161307025283 /pyparsing.py | |
parent | 897696352f4b0a03152058c01403a42b07be650c (diff) | |
parent | fed0f3da669a9a81829651080b6dfe32ce44c1b0 (diff) | |
download | pyparsing-git-5a2fd3bd482d7c3c61d054601c4a17a1111e7747.tar.gz |
Merge remote-tracking branch 'origin/master'
# Conflicts:
# pyparsing.py
Diffstat (limited to 'pyparsing.py')
-rw-r--r-- | pyparsing.py | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/pyparsing.py b/pyparsing.py index 578a07c..af88035 100644 --- a/pyparsing.py +++ b/pyparsing.py @@ -4647,18 +4647,18 @@ class Forward(ParseElementEnhance): def __str__( self ): if hasattr(self,"name"): return self.name - return self.__class__.__name__ + ": ..." - # stubbed out for now - creates awful memory and perf issues - self._revertClass = self.__class__ - self.__class__ = _ForwardNoRecurse + # Avoid infinite recursion by setting a temporary name + self.name = self.__class__.__name__ + ": ..." + + # Use the string representation of main expression. try: if self.expr is not None: retString = _ustr(self.expr) else: retString = "None" finally: - self.__class__ = self._revertClass + del self.name return self.__class__.__name__ + ": " + retString def copy(self): @@ -4669,10 +4669,6 @@ class Forward(ParseElementEnhance): ret <<= self return ret -class _ForwardNoRecurse(Forward): - def __str__( self ): - return "..." - class TokenConverter(ParseElementEnhance): """ Abstract subclass of :class:`ParseExpression`, for converting parsed results. @@ -5869,12 +5865,17 @@ def indentedBlock(blockStatementExpr, indentStack, indent=True): ':', [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] """ + backup_stack = indentStack[:] + + def reset_stack(): + indentStack[:] = backup_stack + def checkPeerIndent(s,l,t): if l >= len(s): return curCol = col(l,s) if curCol != indentStack[-1]: if curCol > indentStack[-1]: - raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"illegal nesting") raise ParseException(s,l,"not a peer entry") def checkSubIndent(s,l,t): @@ -5902,6 +5903,7 @@ def indentedBlock(blockStatementExpr, indentStack, indent=True): else: smExpr = Group( Optional(NL) + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + smExpr.setFailAction(lambda a, b, c, d: reset_stack()) blockStatementExpr.ignore(_bslash + LineEnd()) return smExpr.setName('indented block') |