From ee6db130ec8cde6bc50e38b53ced48412efd53df Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 15 Nov 2017 09:38:48 -0500 Subject: [PATCH] grammar cleanup: dict/set comprehensions 2.7+ --- uncompyle6/parsers/parse2.py | 28 +++++++++++++++------------- uncompyle6/parsers/parse27.py | 8 ++++++++ uncompyle6/parsers/parse3.py | 4 ++++ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/uncompyle6/parsers/parse2.py b/uncompyle6/parsers/parse2.py index 3ea32470..f05dd518 100644 --- a/uncompyle6/parsers/parse2.py +++ b/uncompyle6/parsers/parse2.py @@ -187,11 +187,6 @@ class Python2Parser(PythonParser): jmp_abs ::= JUMP_BACK ''' - def p_dictcomp2(self, args): - """" - dictcomp ::= LOAD_DICTCOMP MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 - """ - def p_genexpr2(self, args): ''' genexpr ::= LOAD_GENEXPR MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 @@ -308,12 +303,16 @@ class Python2Parser(PythonParser): if opname == 'BUILD_MAP_n': # PyPy sometimes has no count. Sigh. self.add_unique_rules([ - 'dictcomp_func ::= BUILD_MAP_n LOAD_FAST FOR_ITER designator ' - 'comp_iter JUMP_BACK RETURN_VALUE RETURN_LAST', 'kvlist_n ::= kvlist_n kv3', 'kvlist_n ::=', 'mapexpr ::= BUILD_MAP_n kvlist_n', ], customize) + if self.version >= 2.7: + self.add_unique_rule( + 'dictcomp_func ::= BUILD_MAP_n LOAD_FAST FOR_ITER designator ' + 'comp_iter JUMP_BACK RETURN_VALUE RETURN_LAST', + 'dictcomp_func', 0, customize) + else: kvlist_n = "kvlist_%s" % v self.add_unique_rules([ @@ -361,15 +360,18 @@ class Python2Parser(PythonParser): ('genexpr ::= %s load_closure LOAD_GENEXPR %s expr' ' GET_ITER CALL_FUNCTION_1' % ('expr '*v, opname)), - ('setcomp ::= %s load_closure LOAD_SETCOMP %s expr' - ' GET_ITER CALL_FUNCTION_1' % - ('expr '*v, opname)), - ('dictcomp ::= %s load_closure LOAD_DICTCOMP %s expr' - ' GET_ITER CALL_FUNCTION_1' % - ('expr '*v, opname)), ('mkfunc ::= %s load_closure LOAD_CONST %s' % ('expr '*v, opname))], customize) + if self.version >= 2.7: + self.add_unique_rules([ + ('setcomp ::= %s load_closure LOAD_SETCOMP %s expr' + ' GET_ITER CALL_FUNCTION_1' % + ('expr '*v, opname)), + ('dictcomp ::= %s load_closure LOAD_DICTCOMP %s expr' + ' GET_ITER CALL_FUNCTION_1' % + ('expr '*v, opname))], + customize) continue elif opname_base in ('CALL_FUNCTION', 'CALL_FUNCTION_VAR', 'CALL_FUNCTION_VAR_KW', 'CALL_FUNCTION_KW'): diff --git a/uncompyle6/parsers/parse27.py b/uncompyle6/parsers/parse27.py index dac49f1f..85819711 100644 --- a/uncompyle6/parsers/parse27.py +++ b/uncompyle6/parsers/parse27.py @@ -18,6 +18,14 @@ class Python27Parser(Python2Parser): stmt ::= setcomp_func + # Dictionary and set comprehensions were added in Python 2.7 + expr ::= dictcomp + stmt ::= dictcomp_func + dictcomp_func ::= BUILD_MAP_0 LOAD_FAST FOR_ITER designator + comp_iter JUMP_BACK RETURN_VALUE RETURN_LAST + + dictcomp ::= LOAD_DICTCOMP MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 + setcomp_func ::= BUILD_SET_0 LOAD_FAST FOR_ITER designator comp_iter JUMP_BACK RETURN_VALUE RETURN_LAST diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index 1fefc74a..a2c6c1dd 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -70,6 +70,10 @@ class Python3Parser(PythonParser): def p_dictcomp3(self, args): """" + expr ::= dictcomp + stmt ::= dictcomp_func + dictcomp_func ::= BUILD_MAP_0 LOAD_FAST FOR_ITER designator + comp_iter JUMP_BACK RETURN_VALUE RETURN_LAST dictcomp ::= LOAD_DICTCOMP LOAD_CONST MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 """