summaryrefslogtreecommitdiff
path: root/pyparsing.py
diff options
context:
space:
mode:
authorTMiguelT <ttmigueltt@gmail.com>2019-03-13 10:41:23 +1100
committerPaul McGuire <ptmcg@users.noreply.github.com>2019-03-12 18:41:23 -0500
commitfed0f3da669a9a81829651080b6dfe32ce44c1b0 (patch)
treef8a80cd5675e7c6d6b171214dc1f014afbd796ed /pyparsing.py
parented2f5ec744ddc25242f947be8ba798d9fca6a674 (diff)
downloadpyparsing-git-fed0f3da669a9a81829651080b6dfe32ce44c1b0.tar.gz
Fix cases where an indentedBlock partially parsing will cause all other correct indentedBlocks to fail (#75)
* Add failing test for indentedBlock * Simplify fix by storing a backup stack
Diffstat (limited to 'pyparsing.py')
-rw-r--r--pyparsing.py8
1 files changed, 7 insertions, 1 deletions
diff --git a/pyparsing.py b/pyparsing.py
index 4a79904..8781ff7 100644
--- a/pyparsing.py
+++ b/pyparsing.py
@@ -5854,12 +5854,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):
@@ -5887,6 +5892,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')