diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index db26c962..a40f5fdc 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015-2016 Rocky Bernstein +# Copyright (c) 2015-2017 Rocky Bernstein # Copyright (c) 2005 by Dan Pascu # Copyright (c) 2000-2002 by hartmut Goebel # Copyright (c) 1999 John Aycock @@ -28,6 +28,16 @@ nop_func = lambda self, args: None class PythonParser(GenericASTBuilder): + def __init__(self, AST, start, debug): + super(PythonParser, self).__init__(AST, start, debug) + self.collect = frozenset( + ['stmts', 'except_stmts', '_stmts', + 'exprlist', 'kvlist', 'kwargs', 'come_froms', + # Python < 3 + 'print_items', + # PyPy: + 'kvlist_n']) + def add_unique_rule(self, rule, opname, count, customize): """Add rule to grammar, but only if it hasn't been added previously opname and count are used in the customize() semantic the actions @@ -115,11 +125,7 @@ class PythonParser(GenericASTBuilder): return token.type def nonterminal(self, nt, args): - collect = ('stmts', 'exprlist', 'kvlist', '_stmts', 'print_items', 'kwargs', - # PYPY: - 'kvlist_n') - - if nt in collect and len(args) > 1: + if nt in self.collect and len(args) > 1: # # Collect iterated thingies together. That is rather than # stmts -> stmts stmt -> stmts stmt -> ... diff --git a/uncompyle6/parsers/parse26.py b/uncompyle6/parsers/parse26.py index 4e53164b..29b13283 100644 --- a/uncompyle6/parsers/parse26.py +++ b/uncompyle6/parsers/parse26.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Rocky Bernstein +# Copyright (c) 2017 Rocky Bernstein """ spark grammar differences over Python2 for Python 2.6. """ @@ -22,7 +22,10 @@ class Python26Parser(Python2Parser): JUMP_IF_FALSE POP_TOP POP_TOP designator POP_TOP try_middle ::= JUMP_FORWARD COME_FROM except_stmts - come_from_pop END_FINALLY COME_FROM + come_from_pop END_FINALLY come_froms + + try_middle ::= JUMP_FORWARD COME_FROM except_stmts END_FINALLY + come_froms try_middle ::= jmp_abs COME_FROM except_stmts POP_TOP END_FINALLY