summaryrefslogtreecommitdiff
path: root/pyparsing.py
diff options
context:
space:
mode:
authorPaul McGuire <ptmcg@austin.rr.com>2019-03-30 02:28:19 -0500
committerPaul McGuire <ptmcg@austin.rr.com>2019-03-30 02:28:19 -0500
commit5a2fd3bd482d7c3c61d054601c4a17a1111e7747 (patch)
tree412cc2641682f168bd3c9ec7f917161307025283 /pyparsing.py
parent897696352f4b0a03152058c01403a42b07be650c (diff)
parentfed0f3da669a9a81829651080b6dfe32ce44c1b0 (diff)
downloadpyparsing-git-5a2fd3bd482d7c3c61d054601c4a17a1111e7747.tar.gz
Merge remote-tracking branch 'origin/master'
# Conflicts: # pyparsing.py
Diffstat (limited to 'pyparsing.py')
-rw-r--r--pyparsing.py22
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')