From 2674ec893a4267c40eddd55f27beeed487d971cb Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 27 Nov 2017 04:56:01 -0500 Subject: [PATCH] Grammar reduction --- uncompyle6/parser.py | 6 ------ uncompyle6/parsers/parse2.py | 13 +++++++++++++ uncompyle6/parsers/parse26.py | 3 --- uncompyle6/parsers/parse27.py | 1 - uncompyle6/parsers/parse3.py | 2 ++ uncompyle6/scanners/scanner2.py | 2 ++ 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index 38c41cd2..792400d2 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -415,10 +415,6 @@ class PythonParser(GenericASTBuilder): def p_setcomp(self, args): """ - expr ::= setcomp - - setcomp ::= LOAD_SETCOMP MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 - comp_iter ::= comp_if comp_iter ::= comp_for comp_iter ::= comp_body @@ -512,8 +508,6 @@ class PythonParser(GenericASTBuilder): compare_chained ::= expr compare_chained1 ROT_TWO POP_TOP _come_from compare_chained2 ::= expr COMPARE_OP JUMP_FORWARD - mapexpr ::= BUILD_MAP kvlist - # Non-null kvlist items are broken out in the indiviual grammars kvlist ::= diff --git a/uncompyle6/parsers/parse2.py b/uncompyle6/parsers/parse2.py index af47d1e0..1e83f84a 100644 --- a/uncompyle6/parsers/parse2.py +++ b/uncompyle6/parsers/parse2.py @@ -100,6 +100,12 @@ class Python2Parser(PythonParser): _mklambda ::= load_closure mklambda kwarg ::= LOAD_CONST expr + kvlist ::= kvlist kv3 + kv3 ::= expr expr STORE_MAP + + mapexpr ::= BUILD_MAP kvlist + + classdef ::= buildclass designator buildclass ::= LOAD_CONST expr mkfunc @@ -355,6 +361,12 @@ class Python2Parser(PythonParser): "LOAD_ASSERT expr CALL_FUNCTION_1 RAISE_VARARGS_1 COME_FROM", ], customize) continue + elif opname == 'LOAD_SETCOMP': + self.add_unique_rules([ + "expr ::= setcomp", + "setcomp ::= LOAD_SETCOMP MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1" + ], customize) + continue elif opname == 'LOOKUP_METHOD': # A PyPy speciality - DRY with parse3 self.add_unique_rule("load_attr ::= expr LOOKUP_METHOD", @@ -392,6 +404,7 @@ class Python2Parser(PythonParser): ('expr '*v, opname))], customize) elif prev_tok == 'LOAD_SETCOMP': self.add_unique_rules([ + "expr ::= setcomp", ('setcomp ::= %s load_closure LOAD_SETCOMP %s expr' ' GET_ITER CALL_FUNCTION_1' % ('expr '*v, opname)) diff --git a/uncompyle6/parsers/parse26.py b/uncompyle6/parsers/parse26.py index 9025dbfc..7479db43 100644 --- a/uncompyle6/parsers/parse26.py +++ b/uncompyle6/parsers/parse26.py @@ -142,7 +142,6 @@ class Python26Parser(Python2Parser): whilestmt ::= SETUP_LOOP testexpr l_stmts_opt jb_pop POP_BLOCK _come_from whilestmt ::= SETUP_LOOP testexpr l_stmts_opt jb_cf_pop bp_come_from - whilestmt ::= SETUP_LOOP testexpr return_stmts come_froms POP_TOP bp_come_from whilestmt ::= SETUP_LOOP testexpr return_stmts POP_BLOCK COME_FROM whileelsestmt ::= SETUP_LOOP testexpr l_stmts_opt jb_pop POP_BLOCK @@ -253,8 +252,6 @@ class Python26Parser(Python2Parser): return_if_lambda ::= RETURN_END_IF_LAMBDA POP_TOP conditional_lambda ::= expr jmp_false_then expr return_if_lambda return_stmt_lambda LAMBDA_MARKER - kvlist ::= kvlist kv3 - kv3 ::= expr expr STORE_MAP """ def add_custom_rules(self, tokens, customize): diff --git a/uncompyle6/parsers/parse27.py b/uncompyle6/parsers/parse27.py index 6b5bdb11..9e4c5cc3 100644 --- a/uncompyle6/parsers/parse27.py +++ b/uncompyle6/parsers/parse27.py @@ -113,7 +113,6 @@ class Python27Parser(Python2Parser): return_if_lambda ::= RETURN_END_IF_LAMBDA COME_FROM conditional_lambda ::= expr jmp_false expr return_if_lambda return_stmt_lambda LAMBDA_MARKER - kvlist ::= kvlist kv3 kv3 ::= expr expr STORE_MAP """ diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index ab8e0287..c3888aad 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -809,6 +809,8 @@ class Python3Parser(PythonParser): seen_LOAD_SETCOMP = True # Should this be generalized and put under MAKE_FUNCTION? if has_get_iter_call_function1: + self.add_unique_rule("expr ::= setcomp", + opname, token.attr, customize) rule_pat = ("setcomp ::= LOAD_SETCOMP %sMAKE_FUNCTION_0 expr " "GET_ITER CALL_FUNCTION_1") self.add_make_function_rule(rule_pat, opname, token.attr, customize) diff --git a/uncompyle6/scanners/scanner2.py b/uncompyle6/scanners/scanner2.py index 9493732a..440a5e3b 100644 --- a/uncompyle6/scanners/scanner2.py +++ b/uncompyle6/scanners/scanner2.py @@ -260,6 +260,8 @@ class Scanner2(Scanner): customize[op_name] = 0 elif op == self.opc.CONTINUE_LOOP: customize[op_name] = 0 + elif op_name == 'LOAD_SETCOMP': + customize[op_name] = 0 elif op == self.opc.JUMP_ABSOLUTE: # Further classify JUMP_ABSOLUTE into backward jumps # which are used in loops, and "CONTINUE" jumps which