From 843e3585e2adfb753233ef1f7dfee87142503c03 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 29 Jul 2023 12:01:14 -0400 Subject: [PATCH 1/2] chained-compare1 -> chained-compare-middle --- uncompyle6/parser.py | 2 +- uncompyle6/parsers/parse26.py | 25 ++++++++-------- uncompyle6/parsers/parse27.py | 19 +++++++----- uncompyle6/parsers/parse3.py | 35 +++++++++++----------- uncompyle6/parsers/parse30.py | 24 ++++++++------- uncompyle6/parsers/parse37.py | 46 ++++++++++++++++------------- uncompyle6/semantics/consts.py | 2 +- uncompyle6/semantics/customize37.py | 16 +++++----- 8 files changed, 90 insertions(+), 79 deletions(-) diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index 97dc5f9d..dbeaf73f 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -598,7 +598,7 @@ class PythonParser(GenericASTBuilder): compare_single ::= expr expr COMPARE_OP # A compare_chained is two comparisions like x <= y <= z - compare_chained ::= expr compare_chained1 ROT_TWO POP_TOP _come_froms + compare_chained ::= expr compared_chained_middle ROT_TWO POP_TOP _come_froms compare_chained2 ::= expr COMPARE_OP JUMP_FORWARD # Non-null kvlist items are broken out in the indiviual grammars diff --git a/uncompyle6/parsers/parse26.py b/uncompyle6/parsers/parse26.py index 65b59740..1c90b194 100644 --- a/uncompyle6/parsers/parse26.py +++ b/uncompyle6/parsers/parse26.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017-2022 Rocky Bernstein +# Copyright (c) 2017-2023 Rocky Bernstein """ spark grammar differences over Python2 for Python 2.6. """ @@ -307,17 +307,18 @@ class Python26Parser(Python2Parser): and ::= expr JUMP_IF_FALSE POP_TOP expr JUMP_IF_FALSE POP_TOP - # compare_chained is like x <= y <= z - compare_chained ::= expr compare_chained1 ROT_TWO COME_FROM POP_TOP _come_froms - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false compare_chained1 _come_froms - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false compare_chained2 _come_froms + # compare_chained is x <= y <= z + compare_chained ::= expr compared_chained_middle ROT_TWO + COME_FROM POP_TOP _come_froms + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + jmp_false compared_chained_middle _come_froms + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + jmp_false compare_chained2 _come_froms - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false_then compare_chained1 _come_froms - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false_then compare_chained2 _come_froms + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + jmp_false_then compared_chained_middle _come_froms + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + jmp_false_then compare_chained2 _come_froms compare_chained2 ::= expr COMPARE_OP return_expr_lambda compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA @@ -565,7 +566,7 @@ if __name__ == "__main__": remain_tokens = set(tokens) - opcode_set import re - remain_tokens = set([re.sub("_\d+$", "", t) for t in remain_tokens]) + remain_tokens = set([re.sub(r"_\d+$", "", t) for t in remain_tokens]) remain_tokens = set([re.sub("_CONT$", "", t) for t in remain_tokens]) remain_tokens = set(remain_tokens) - opcode_set print(remain_tokens) diff --git a/uncompyle6/parsers/parse27.py b/uncompyle6/parsers/parse27.py index 81223340..50e1503a 100644 --- a/uncompyle6/parsers/parse27.py +++ b/uncompyle6/parsers/parse27.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016-2020, 2022 Rocky Bernstein +# Copyright (c) 2016-2020, 2023 Rocky Bernstein # Copyright (c) 2005 by Dan Pascu # Copyright (c) 2000-2002 by hartmut Goebel @@ -115,11 +115,12 @@ class Python27Parser(Python2Parser): or ::= expr_jitop expr COME_FROM and ::= expr JUMP_IF_FALSE_OR_POP expr COME_FROM - # compare_chained{1,2} is used exclusively in chained_compare - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained1 COME_FROM - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained2 COME_FROM + # compare_chained{middle,2} is used exclusively in chained_compare + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + JUMP_IF_FALSE_OR_POP compared_chained_middle + COME_FROM + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + JUMP_IF_FALSE_OR_POP compare_chained2 COME_FROM return_lambda ::= RETURN_VALUE return_lambda ::= RETURN_VALUE_LAMBDA @@ -177,11 +178,13 @@ class Python27Parser(Python2Parser): while1stmt ::= SETUP_LOOP returns pb_come_from while1stmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK POP_BLOCK COME_FROM - whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK _come_froms + whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK + _come_froms # Should this be JUMP_BACK+ ? # JUMP_BACK should all be to the same location - whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK JUMP_BACK POP_BLOCK _come_froms + whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK + JUMP_BACK POP_BLOCK _come_froms while1elsestmt ::= SETUP_LOOP l_stmts JUMP_BACK POP_BLOCK else_suitel COME_FROM diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index e71d3100..ab343826 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -346,14 +346,15 @@ class Python3Parser(PythonParser): # FIXME: Common with 2.7 ret_and ::= expr JUMP_IF_FALSE_OR_POP return_expr_or_cond COME_FROM ret_or ::= expr JUMP_IF_TRUE_OR_POP return_expr_or_cond COME_FROM - if_exp_ret ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF COME_FROM return_expr_or_cond + if_exp_ret ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF COME_FROM + return_expr_or_cond - # compare_chained1 is used exclusively in chained_compare - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained1 COME_FROM - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained2 COME_FROM + # compared_chained_middle is used exclusively in chained_compare + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP + compared_chained_middle COME_FROM + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP + compare_chained2 COME_FROM """ def p_stmt3(self, args): @@ -419,24 +420,24 @@ class Python3Parser(PythonParser): for ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK COME_FROM_LOOP - forelsestmt ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK else_suite - COME_FROM_LOOP + forelsestmt ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK + else_suite COME_FROM_LOOP - forelselaststmt ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK else_suitec - COME_FROM_LOOP + forelselaststmt ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK + else_suitec COME_FROM_LOOP - forelselaststmtl ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK else_suitel - COME_FROM_LOOP + forelselaststmtl ::= SETUP_LOOP expr for_iter store for_block POP_BLOCK + else_suitel COME_FROM_LOOP - whilestmt ::= SETUP_LOOP testexpr l_stmts_opt COME_FROM JUMP_BACK POP_BLOCK - COME_FROM_LOOP + whilestmt ::= SETUP_LOOP testexpr l_stmts_opt COME_FROM JUMP_BACK + POP_BLOCK COME_FROM_LOOP - whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK JUMP_BACK - COME_FROM_LOOP + whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK + JUMP_BACK COME_FROM_LOOP whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK COME_FROM_LOOP - whilestmt ::= SETUP_LOOP testexpr returns POP_BLOCK + whilestmt ::= SETUP_LOOP testexpr returns POP_BLOCK COME_FROM_LOOP while1elsestmt ::= SETUP_LOOP l_stmts JUMP_BACK diff --git a/uncompyle6/parsers/parse30.py b/uncompyle6/parsers/parse30.py index 9537d1ba..df5eaf99 100644 --- a/uncompyle6/parsers/parse30.py +++ b/uncompyle6/parsers/parse30.py @@ -14,9 +14,10 @@ class Python30Parser(Python31Parser): pt_bp ::= POP_TOP POP_BLOCK - assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 COME_FROM POP_TOP - assert2 ::= assert_expr jmp_true LOAD_ASSERT expr CALL_FUNCTION_1 RAISE_VARARGS_1 - come_froms + assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 + COME_FROM POP_TOP + assert2 ::= assert_expr jmp_true LOAD_ASSERT expr CALL_FUNCTION_1 + RAISE_VARARGS_1 come_froms call_stmt ::= expr _come_froms POP_TOP return_if_lambda ::= RETURN_END_IF_LAMBDA COME_FROM POP_TOP @@ -205,10 +206,10 @@ class Python30Parser(Python31Parser): come_froms POP_TOP POP_BLOCK COME_FROM_LOOP - # compare_chained is like x <= y <= z - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false compare_chained1 _come_froms - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP + # compare_chained is x <= y <= z + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + jmp_false compared_chained_middle _come_froms + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP jmp_false compare_chained2 _come_froms compare_chained2 ::= expr COMPARE_OP RETURN_END_IF """ @@ -270,10 +271,11 @@ class Python30Parser(Python31Parser): jmp_true ::= JUMP_IF_TRUE_OR_POP POP_TOP jmp_true ::= POP_JUMP_IF_TRUE - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained1 COME_FROM - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained2 COME_FROM + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + JUMP_IF_FALSE_OR_POP compared_chained_middle + COME_FROM + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP + JUMP_IF_FALSE_OR_POP compare_chained2 COME_FROM ret_or ::= expr JUMP_IF_TRUE_OR_POP return_expr_or_cond COME_FROM ret_and ::= expr JUMP_IF_FALSE_OR_POP return_expr_or_cond COME_FROM if_exp_ret ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF diff --git a/uncompyle6/parsers/parse37.py b/uncompyle6/parsers/parse37.py index 265a131d..d73be25d 100644 --- a/uncompyle6/parsers/parse37.py +++ b/uncompyle6/parsers/parse37.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017-2020, 2022 Rocky Bernstein +# Copyright (c) 2017-2020, 2022-2023 Rocky Bernstein # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -130,7 +130,8 @@ class Python37Parser(Python37BaseParser): stmt ::= return return ::= return_expr RETURN_VALUE - # "returns" nonterminal is a sequence of statements that ends in a RETURN statement. + # "returns" nonterminal is a sequence of statements that ends in a + # RETURN statement. # In later Python versions with jump optimization, this can cause JUMPs # that would normally appear to be omitted. @@ -221,7 +222,7 @@ class Python37Parser(Python37BaseParser): compare_single ::= expr expr COMPARE_OP # A compare_chained is two comparisions like x <= y <= z - compare_chained ::= expr compare_chained1 ROT_TWO POP_TOP _come_froms + compare_chained ::= expr compared_chained_middle ROT_TWO POP_TOP _come_froms compare_chained2 ::= expr COMPARE_OP JUMP_FORWARD # Non-null kvlist items are broken out in the indiviual grammars @@ -625,25 +626,25 @@ class Python37Parser(Python37BaseParser): compare_chained ::= compare_chained37 compare_chained ::= compare_chained37_false - compare_chained37 ::= expr compare_chained1a_37 - compare_chained37 ::= expr compare_chained1c_37 + compare_chained37 ::= expr compared_chained_middlea_37 + compare_chained37 ::= expr compared_chained_middlec_37 - compare_chained37_false ::= expr compare_chained1_false_37 - compare_chained37_false ::= expr compare_chained1b_false_37 + compare_chained37_false ::= expr compared_chained_middle_false_37 + compare_chained37_false ::= expr compared_chained_middleb_false_37 compare_chained37_false ::= expr compare_chained2_false_37 - compare_chained1a_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE - compare_chained1a_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compared_chained_middlea_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compared_chained_middlea_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compare_chained2a_37 COME_FROM POP_TOP COME_FROM - compare_chained1b_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compared_chained_middleb_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compare_chained2b_false_37 POP_TOP _jump COME_FROM - compare_chained1c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compared_chained_middlec_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compare_chained2a_37 POP_TOP - compare_chained1_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compared_chained_middle_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compare_chained2c_37 POP_TOP JUMP_FORWARD COME_FROM - compare_chained1_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compared_chained_middle_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compare_chained2b_false_37 POP_TOP _jump COME_FROM compare_chained2_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE @@ -667,11 +668,13 @@ class Python37Parser(Python37BaseParser): expr ::= if_exp37 if_exp37 ::= expr expr jf_cfs expr COME_FROM jf_cfs ::= JUMP_FORWARD _come_froms - ifelsestmt ::= testexpr c_stmts_opt jf_cfs else_suite opt_come_from_except + ifelsestmt ::= testexpr c_stmts_opt jf_cfs else_suite + opt_come_from_except # This is probably more realistically an "ifstmt" (with a null else) # see _cmp() of python3.8/distutils/__pycache__/version.cpython-38.opt-1.pyc - ifelsestmt ::= testexpr stmts jf_cfs else_suite_opt opt_come_from_except + ifelsestmt ::= testexpr stmts jf_cfs else_suite_opt + opt_come_from_except expr_pjit ::= expr POP_JUMP_IF_TRUE @@ -694,7 +697,8 @@ class Python37Parser(Python37BaseParser): expr ::= if_exp_37a expr ::= if_exp_37b if_exp_37a ::= and_not expr JUMP_FORWARD come_froms expr COME_FROM - if_exp_37b ::= expr jmp_false expr POP_JUMP_IF_FALSE jump_forward_else expr + if_exp_37b ::= expr jmp_false expr POP_JUMP_IF_FALSE + jump_forward_else expr jmp_false_cf ::= POP_JUMP_IF_FALSE COME_FROM comp_if ::= or jmp_false_cf comp_iter """ @@ -1014,11 +1018,11 @@ class Python37Parser(Python37BaseParser): and ::= expr jmp_false expr COME_FROM or ::= expr_jt expr COME_FROM - # compare_chained1 is used exclusively in chained_compare - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained1 COME_FROM - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained2 COME_FROM + # compared_chained_middle is used exclusively in chained_compare + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP + compared_chained_middle COME_FROM + compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP + compare_chained2 COME_FROM """ def p_stmt3(self, args): diff --git a/uncompyle6/semantics/consts.py b/uncompyle6/semantics/consts.py index 06c9d91c..8981d521 100644 --- a/uncompyle6/semantics/consts.py +++ b/uncompyle6/semantics/consts.py @@ -338,7 +338,7 @@ TABLE_DIRECT = { "if_exp_not_lambda": ("%p if not %c else %c", (2, "expr", 27), 0, 4), "compare_single": ('%p %[-1]{pattr.replace("-", " ")} %p', (0, 19), (1, 19)), "compare_chained": ("%p %p", (0, 29), (1, 30)), - "compare_chained1": ('%[3]{pattr.replace("-", " ")} %p %p', (0, 19), (-2, 19)), + "compared_chained_middle": ('%[3]{pattr.replace("-", " ")} %p %p', (0, 19), (-2, 19)), "compare_chained2": ('%[1]{pattr.replace("-", " ")} %p', (0, 19)), # "classdef": (), # handled by n_classdef() # A custom rule in n_function def distinguishes whether to call this or diff --git a/uncompyle6/semantics/customize37.py b/uncompyle6/semantics/customize37.py index 97109997..67613e0f 100644 --- a/uncompyle6/semantics/customize37.py +++ b/uncompyle6/semantics/customize37.py @@ -99,12 +99,12 @@ def customize_for_version37(self, version): "await_stmt": ("%|%c\n", 0), "c_async_with_stmt": ("%|async with %c:\n%+%c%-", (0, "expr"), 3), "call_ex": ("%c(%p)", (0, "expr"), (1, 100)), - "compare_chained1a_37": ( + "compared_chained_middlea_37": ( ' %[3]{pattr.replace("-", " ")} %p %p', (0, PRECEDENCE["compare"] - 1), (-4, PRECEDENCE["compare"] - 1), ), - "compare_chained1_false_37": ( + "compared_chained_middle_false_37": ( ' %[3]{pattr.replace("-", " ")} %p %p', (0, PRECEDENCE["compare"] - 1), (-4, PRECEDENCE["compare"] - 1), @@ -114,12 +114,12 @@ def customize_for_version37(self, version): (0, PRECEDENCE["compare"] - 1), (-5, PRECEDENCE["compare"] - 1), ), - "compare_chained1b_false_37": ( + "compared_chained_middleb_false_37": ( ' %[3]{pattr.replace("-", " ")} %p %p', (0, PRECEDENCE["compare"] - 1), (-4, PRECEDENCE["compare"] - 1), ), - "compare_chained1c_37": ( + "compared_chained_middlec_37": ( ' %[3]{pattr.replace("-", " ")} %p %p', (0, PRECEDENCE["compare"] - 1), (-2, PRECEDENCE["compare"] - 1), @@ -461,12 +461,12 @@ def customize_for_version37(self, version): compare_chained37 = node[0] if ( compare_chained37 == "compare_chained37" - and compare_chained37[1] == "compare_chained1b_37" + and compare_chained37[1] == "compared_chained_middleb_37" ): - compare_chained1b_37 = compare_chained37[1] + compared_chained_middleb_37 = compare_chained37[1] if ( - len(compare_chained1b_37) > 2 - and compare_chained1b_37[-2] == "JUMP_FORWARD" + len(compared_chained_middleb_37) > 2 + and compared_chained_middleb_37[-2] == "JUMP_FORWARD" ): node.kind = "testfalse" pass From ddeb5af6d6ee7fb72a7c5d1c846f321502acfeda Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 29 Jul 2023 12:09:25 -0400 Subject: [PATCH 2/2] compare_chained2 _> compare_chained_right --- test/simple_source/bug33/01_triple_compare.py | 4 +- uncompyle6/parser.py | 7 +-- uncompyle6/parsers/parse26.py | 12 ++--- uncompyle6/parsers/parse27.py | 6 +-- uncompyle6/parsers/parse3.py | 2 +- uncompyle6/parsers/parse30.py | 14 +++--- uncompyle6/parsers/parse32.py | 7 ++- uncompyle6/parsers/parse36.py | 2 +- uncompyle6/parsers/parse37.py | 46 +++++++++---------- uncompyle6/semantics/consts.py | 2 +- uncompyle6/semantics/customize37.py | 10 ++-- 11 files changed, 56 insertions(+), 56 deletions(-) diff --git a/test/simple_source/bug33/01_triple_compare.py b/test/simple_source/bug33/01_triple_compare.py index dc28d36c..cdbc18ab 100644 --- a/test/simple_source/bug33/01_triple_compare.py +++ b/test/simple_source/bug33/01_triple_compare.py @@ -1,7 +1,7 @@ # In Python 3.3+ this uses grammar rule -# compare_chained2 ::= expr COMPARE_OP RETURN_VALUE +# compare_chained_right ::= expr COMPARE_OP RETURN_VALUE # In Python 3.6 uses this uses grammar rule -# compare_chained2 ::= expr COMPARE_OP come_froms JUMP_FORWARD +# compare_chained_right ::= expr COMPARE_OP come_froms JUMP_FORWARD # Seen in Python 3.3 ipaddress.py diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index dbeaf73f..8b91f040 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -597,9 +597,10 @@ class PythonParser(GenericASTBuilder): compare ::= compare_single compare_single ::= expr expr COMPARE_OP - # A compare_chained is two comparisions like x <= y <= z - compare_chained ::= expr compared_chained_middle ROT_TWO POP_TOP _come_froms - compare_chained2 ::= expr COMPARE_OP JUMP_FORWARD + # A compare_chained is two comparisions, as in: x <= y <= z + compare_chained ::= expr compared_chained_middle ROT_TWO POP_TOP + _come_froms + compare_chained_right ::= expr COMPARE_OP JUMP_FORWARD # Non-null kvlist items are broken out in the indiviual grammars kvlist ::= diff --git a/uncompyle6/parsers/parse26.py b/uncompyle6/parsers/parse26.py index 1c90b194..74370369 100644 --- a/uncompyle6/parsers/parse26.py +++ b/uncompyle6/parsers/parse26.py @@ -307,22 +307,22 @@ class Python26Parser(Python2Parser): and ::= expr JUMP_IF_FALSE POP_TOP expr JUMP_IF_FALSE POP_TOP - # compare_chained is x <= y <= z + # A "compare_chained" is two comparisions like x <= y <= z compare_chained ::= expr compared_chained_middle ROT_TWO COME_FROM POP_TOP _come_froms compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP jmp_false compared_chained_middle _come_froms compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false compare_chained2 _come_froms + jmp_false compare_chained_right _come_froms compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP jmp_false_then compared_chained_middle _come_froms compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false_then compare_chained2 _come_froms + jmp_false_then compare_chained_right _come_froms - compare_chained2 ::= expr COMPARE_OP return_expr_lambda - compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA - compare_chained2 ::= expr COMPARE_OP RETURN_END_IF COME_FROM + compare_chained_right ::= expr COMPARE_OP return_expr_lambda + compare_chained_right ::= expr COMPARE_OP RETURN_END_IF_LAMBDA + compare_chained_right ::= expr COMPARE_OP RETURN_END_IF COME_FROM return_if_lambda ::= RETURN_END_IF_LAMBDA POP_TOP stmt ::= if_exp_lambda diff --git a/uncompyle6/parsers/parse27.py b/uncompyle6/parsers/parse27.py index 50e1503a..92f0d4b6 100644 --- a/uncompyle6/parsers/parse27.py +++ b/uncompyle6/parsers/parse27.py @@ -120,13 +120,13 @@ class Python27Parser(Python2Parser): JUMP_IF_FALSE_OR_POP compared_chained_middle COME_FROM compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP - JUMP_IF_FALSE_OR_POP compare_chained2 COME_FROM + JUMP_IF_FALSE_OR_POP compare_chained_right COME_FROM return_lambda ::= RETURN_VALUE return_lambda ::= RETURN_VALUE_LAMBDA - compare_chained2 ::= expr COMPARE_OP return_lambda - compare_chained2 ::= expr COMPARE_OP return_lambda + compare_chained_right ::= expr COMPARE_OP return_lambda + compare_chained_right ::= expr COMPARE_OP return_lambda # if_exp_true are for conditions which always evaluate true # There is dead or non-optional remnants of the condition code though, diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index ab343826..e43f07b1 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -354,7 +354,7 @@ class Python3Parser(PythonParser): compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP compared_chained_middle COME_FROM compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained2 COME_FROM + compare_chained_right COME_FROM """ def p_stmt3(self, args): diff --git a/uncompyle6/parsers/parse30.py b/uncompyle6/parsers/parse30.py index df5eaf99..f9106665 100644 --- a/uncompyle6/parsers/parse30.py +++ b/uncompyle6/parsers/parse30.py @@ -20,8 +20,8 @@ class Python30Parser(Python31Parser): RAISE_VARARGS_1 come_froms call_stmt ::= expr _come_froms POP_TOP - return_if_lambda ::= RETURN_END_IF_LAMBDA COME_FROM POP_TOP - compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA + return_if_lambda ::= RETURN_END_IF_LAMBDA COME_FROM POP_TOP + compare_chained_right ::= expr COMPARE_OP RETURN_END_IF_LAMBDA # FIXME: combine with parse3.2 whileTruestmt ::= SETUP_LOOP l_stmts_opt @@ -206,12 +206,12 @@ class Python30Parser(Python31Parser): come_froms POP_TOP POP_BLOCK COME_FROM_LOOP - # compare_chained is x <= y <= z + # A "compare_chained" is two comparisions like x <= y <= z compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false compared_chained_middle _come_froms + jmp_false compared_chained_middle _come_froms compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false compare_chained2 _come_froms - compare_chained2 ::= expr COMPARE_OP RETURN_END_IF + jmp_false compare_chained_right _come_froms + compare_chained_right ::= expr COMPARE_OP RETURN_END_IF """ @@ -275,7 +275,7 @@ class Python30Parser(Python31Parser): JUMP_IF_FALSE_OR_POP compared_chained_middle COME_FROM compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP - JUMP_IF_FALSE_OR_POP compare_chained2 COME_FROM + JUMP_IF_FALSE_OR_POP compare_chained_right COME_FROM ret_or ::= expr JUMP_IF_TRUE_OR_POP return_expr_or_cond COME_FROM ret_and ::= expr JUMP_IF_FALSE_OR_POP return_expr_or_cond COME_FROM if_exp_ret ::= expr POP_JUMP_IF_FALSE expr RETURN_END_IF diff --git a/uncompyle6/parsers/parse32.py b/uncompyle6/parsers/parse32.py index f0706798..923aca73 100644 --- a/uncompyle6/parsers/parse32.py +++ b/uncompyle6/parsers/parse32.py @@ -25,10 +25,9 @@ class Python32Parser(Python3Parser): """ if_exp ::= expr jmp_false expr jump_forward_else expr COME_FROM - # compare_chained2 is used in a "chained_compare": x <= y <= z - # used exclusively in compare_chained - compare_chained2 ::= expr COMPARE_OP RETURN_VALUE - compare_chained2 ::= expr COMPARE_OP RETURN_VALUE_LAMBDA + # compare_chained_right is used in a "chained_compare": x <= y <= z + compare_chained_right ::= expr COMPARE_OP RETURN_VALUE + compare_chained_right ::= expr COMPARE_OP RETURN_VALUE_LAMBDA # Python < 3.5 no POP BLOCK whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK COME_FROM_LOOP diff --git a/uncompyle6/parsers/parse36.py b/uncompyle6/parsers/parse36.py index fd79035f..280b23ba 100644 --- a/uncompyle6/parsers/parse36.py +++ b/uncompyle6/parsers/parse36.py @@ -190,7 +190,7 @@ class Python36Parser(Python35Parser): tryfinally_return_stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST COME_FROM_FINALLY - compare_chained2 ::= expr COMPARE_OP come_froms JUMP_FORWARD + compare_chained_right ::= expr COMPARE_OP come_froms JUMP_FORWARD """ # Some of this is duplicated from parse37. Eventually we'll probably rebase from diff --git a/uncompyle6/parsers/parse37.py b/uncompyle6/parsers/parse37.py index d73be25d..fad4d1ce 100644 --- a/uncompyle6/parsers/parse37.py +++ b/uncompyle6/parsers/parse37.py @@ -223,7 +223,7 @@ class Python37Parser(Python37BaseParser): # A compare_chained is two comparisions like x <= y <= z compare_chained ::= expr compared_chained_middle ROT_TWO POP_TOP _come_froms - compare_chained2 ::= expr COMPARE_OP JUMP_FORWARD + compare_chained_right ::= expr COMPARE_OP JUMP_FORWARD # Non-null kvlist items are broken out in the indiviual grammars kvlist ::= @@ -440,10 +440,10 @@ class Python37Parser(Python37BaseParser): """ if_exp::= expr jmp_false expr jump_forward_else expr COME_FROM - # compare_chained2 is used in a "chained_compare": x <= y <= z + # compare_chained_right is used in a "chained_compare": x <= y <= z # used exclusively in compare_chained - compare_chained2 ::= expr COMPARE_OP RETURN_VALUE - compare_chained2 ::= expr COMPARE_OP RETURN_VALUE_LAMBDA + compare_chained_right ::= expr COMPARE_OP RETURN_VALUE + compare_chained_right ::= expr COMPARE_OP RETURN_VALUE_LAMBDA # Python < 3.5 no POP BLOCK whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK COME_FROM_LOOP @@ -631,36 +631,36 @@ class Python37Parser(Python37BaseParser): compare_chained37_false ::= expr compared_chained_middle_false_37 compare_chained37_false ::= expr compared_chained_middleb_false_37 - compare_chained37_false ::= expr compare_chained2_false_37 + compare_chained37_false ::= expr compare_chained_right_false_37 compared_chained_middlea_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compared_chained_middlea_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE - compare_chained2a_37 COME_FROM POP_TOP COME_FROM + compare_chained_righta_37 COME_FROM POP_TOP COME_FROM compared_chained_middleb_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE - compare_chained2b_false_37 POP_TOP _jump COME_FROM + compare_chained_rightb_false_37 POP_TOP _jump COME_FROM compared_chained_middlec_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE - compare_chained2a_37 POP_TOP + compare_chained_righta_37 POP_TOP compared_chained_middle_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE - compare_chained2c_37 POP_TOP JUMP_FORWARD COME_FROM + compare_chained_rightc_37 POP_TOP JUMP_FORWARD COME_FROM compared_chained_middle_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE - compare_chained2b_false_37 POP_TOP _jump COME_FROM + compare_chained_rightb_false_37 POP_TOP _jump COME_FROM - compare_chained2_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE - compare_chained2a_false_37 POP_TOP JUMP_BACK COME_FROM + compare_chained_right_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compare_chained_righta_false_37 POP_TOP JUMP_BACK COME_FROM - compare_chained2a_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_TRUE JUMP_FORWARD - compare_chained2a_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_TRUE JUMP_BACK - compare_chained2a_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE jf_cfs + compare_chained_righta_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_TRUE JUMP_FORWARD + compare_chained_righta_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_TRUE JUMP_BACK + compare_chained_righta_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE jf_cfs - compare_chained2b_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD COME_FROM - compare_chained2b_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD + compare_chained_rightb_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD COME_FROM + compare_chained_rightb_false_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD - compare_chained2c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE - compare_chained2a_false_37 ELSE - compare_chained2c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE - compare_chained2a_false_37 + compare_chained_rightc_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE + compare_chained_righta_false_37 ELSE + compare_chained_rightc_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE + compare_chained_righta_false_37 """ def p_37_conditionals(self, args): @@ -1022,7 +1022,7 @@ class Python37Parser(Python37BaseParser): compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP compared_chained_middle COME_FROM compared_chained_middle ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP - compare_chained2 COME_FROM + compare_chained_right COME_FROM """ def p_stmt3(self, args): @@ -1209,7 +1209,7 @@ class Python37Parser(Python37BaseParser): tryfinally_return_stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST COME_FROM_FINALLY - compare_chained2 ::= expr COMPARE_OP come_froms JUMP_FORWARD + compare_chained_right ::= expr COMPARE_OP come_froms JUMP_FORWARD """ def p_37_misc(self, args): diff --git a/uncompyle6/semantics/consts.py b/uncompyle6/semantics/consts.py index 8981d521..18d5b9e2 100644 --- a/uncompyle6/semantics/consts.py +++ b/uncompyle6/semantics/consts.py @@ -339,7 +339,7 @@ TABLE_DIRECT = { "compare_single": ('%p %[-1]{pattr.replace("-", " ")} %p', (0, 19), (1, 19)), "compare_chained": ("%p %p", (0, 29), (1, 30)), "compared_chained_middle": ('%[3]{pattr.replace("-", " ")} %p %p', (0, 19), (-2, 19)), - "compare_chained2": ('%[1]{pattr.replace("-", " ")} %p', (0, 19)), + "compare_chained_right": ('%[1]{pattr.replace("-", " ")} %p', (0, 19)), # "classdef": (), # handled by n_classdef() # A custom rule in n_function def distinguishes whether to call this or # function_def_async diff --git a/uncompyle6/semantics/customize37.py b/uncompyle6/semantics/customize37.py index 67613e0f..c0b2f2f7 100644 --- a/uncompyle6/semantics/customize37.py +++ b/uncompyle6/semantics/customize37.py @@ -109,7 +109,7 @@ def customize_for_version37(self, version): (0, PRECEDENCE["compare"] - 1), (-4, PRECEDENCE["compare"] - 1), ), - "compare_chained2_false_37": ( + "compare_chained_right_false_37": ( ' %[3]{pattr.replace("-", " ")} %p %p', (0, PRECEDENCE["compare"] - 1), (-5, PRECEDENCE["compare"] - 1), @@ -124,19 +124,19 @@ def customize_for_version37(self, version): (0, PRECEDENCE["compare"] - 1), (-2, PRECEDENCE["compare"] - 1), ), - "compare_chained2a_37": ( + "compare_chained_righta_37": ( '%[1]{pattr.replace("-", " ")} %p', (0, PRECEDENCE["compare"] - 1), ), - "compare_chained2b_false_37": ( + "compare_chained_rightb_false_37": ( '%[1]{pattr.replace("-", " ")} %p', (0, PRECEDENCE["compare"] - 1), ), - "compare_chained2a_false_37": ( + "compare_chained_righta_false_37": ( '%[1]{pattr.replace("-", " ")} %p', (0, PRECEDENCE["compare"] - 1), ), - "compare_chained2c_37": ( + "compare_chained_rightc_37": ( '%[3]{pattr.replace("-", " ")} %p %p', (0, PRECEDENCE["compare"] - 1), (6, PRECEDENCE["compare"] - 1),