diff options
author | TMiguelT <ttmigueltt@gmail.com> | 2019-03-13 10:41:23 +1100 |
---|---|---|
committer | Paul McGuire <ptmcg@users.noreply.github.com> | 2019-03-12 18:41:23 -0500 |
commit | fed0f3da669a9a81829651080b6dfe32ce44c1b0 (patch) | |
tree | f8a80cd5675e7c6d6b171214dc1f014afbd796ed /pyparsing.py | |
parent | ed2f5ec744ddc25242f947be8ba798d9fca6a674 (diff) | |
download | pyparsing-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.py | 8 |
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') |