From fed0f3da669a9a81829651080b6dfe32ce44c1b0 Mon Sep 17 00:00:00 2001 From: TMiguelT Date: Wed, 13 Mar 2019 10:41:23 +1100 Subject: 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 --- pyparsing.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'pyparsing.py') 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') -- cgit v1.2.1