3
/*ä^€  ã               @   sp   d Z ddlmZ ddlmZ ddlmZ ddlm	Z	 G dd„ deƒZ
G dd	„ d	eeƒZed
krle
ƒ Zejƒ  dS )z:
spark grammar differences over Python2.6 for Python 2.5.
é    )ÚPythonParserSingle)ÚDEFAULT_DEBUG)ÚPython26Parser)Ú
ifelsestmtc                   s@   e Zd Zef‡ fdd„	Zdd„ Z‡ fdd„Z‡ fdd„Z‡  ZS )	ÚPython25Parserc                s   t t| ƒj|ƒ i | _d S )N)Úsuperr   Ú__init__Z
customized)ÚselfZdebug_parser)Ú	__class__© úW/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/uncompyle6/parsers/parse25.pyr      s    zPython25Parser.__init__c             C   s   dS )a  
        # If "return_if_stmt" is in a loop, a JUMP_BACK can be emitted. In 2.6 the
        # JUMP_BACK doesn't appear

        return_if_stmt ::= ret_expr  RETURN_END_IF JUMP_BACK

        # Python 2.6 uses ROT_TWO instead of the STORE_xxx
        # withas is allowed as a "from future" in 2.5
        # 2.6 and 2.7 do something slightly different
        setupwithas ::= DUP_TOP LOAD_ATTR store LOAD_ATTR CALL_FUNCTION_0
                        setup_finally
        # opcode SETUP_WITH
        setupwith ::= DUP_TOP LOAD_ATTR store LOAD_ATTR CALL_FUNCTION_0 POP_TOP
        with      ::= expr setupwith SETUP_FINALLY suite_stmts_opt
                      POP_BLOCK LOAD_CONST COME_FROM with_cleanup

        # Semantic actions want store to be at index 2
        withasstmt ::= expr setupwithas store suite_stmts_opt
                       POP_BLOCK LOAD_CONST COME_FROM with_cleanup


        store ::= STORE_NAME
        store ::= STORE_FAST

        # tryelsetmtl doesn't need COME_FROM since the jump might not
        # be the the join point at the end of the "try" but instead back to the
        # loop. FIXME: should "come_froms" below be a single COME_FROM?
        tryelsestmt    ::= SETUP_EXCEPT suite_stmts_opt POP_BLOCK
                           except_handler else_suite come_froms

        # Python 2.6 omits the LOAD_FAST DELETE_FAST below
        # withas is allowed as a "from future" in 2.5
        withasstmt ::= expr setupwithas store suite_stmts_opt
                       POP_BLOCK LOAD_CONST COME_FROM
                       with_cleanup

        with_cleanup ::= LOAD_FAST DELETE_FAST WITH_CLEANUP END_FINALLY
        with_cleanup ::= LOAD_NAME DELETE_NAME WITH_CLEANUP END_FINALLY


        kvlist ::= kvlist kv
        kv     ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR
        Nr   )r	   Úargsr   r   r   Úp_misc25   s    zPython25Parser.p_misc25c                sH   | j dƒ tt| ƒj||ƒ | jdkr0d| jd< d| jd< d| jd< d S )Na—  
        setupwith  ::= DUP_TOP LOAD_ATTR ROT_TWO LOAD_ATTR CALL_FUNCTION_0 POP_TOP
        with       ::= expr setupwith SETUP_FINALLY suite_stmts_opt
                       POP_BLOCK LOAD_CONST COME_FROM WITH_CLEANUP END_FINALLY
        withasstmt ::= expr setupwithas store suite_stmts_opt
                       POP_BLOCK LOAD_CONST COME_FROM WITH_CLEANUP END_FINALLY
        assert2       ::= assert_expr jmp_true LOAD_ASSERT expr CALL_FUNCTION_1 RAISE_VARARGS_1
        classdefdeco  ::= classdefdeco1 store
        classdefdeco1 ::= expr classdefdeco1 CALL_FUNCTION_1
        classdefdeco1 ::= expr classdefdeco2 CALL_FUNCTION_1
        classdefdeco2 ::= LOAD_CONST expr mkfunc CALL_FUNCTION_0 BUILD_CLASS
        kv3 ::= expr expr STORE_MAP
        if_exp_ret       ::= expr jmp_false_then expr RETURN_END_IF POP_TOP ret_expr_or_cond
        return_if_lambda ::= RETURN_END_IF_LAMBDA POP_TOP
        return_if_stmt   ::= ret_expr RETURN_END_IF POP_TOP
        return_if_stmts  ::= return_if_stmt
        return           ::= ret_expr RETURN_END_IF POP_TOP
        return           ::= ret_expr RETURN_VALUE POP_TOP
        return_stmt_lambda ::= ret_expr RETURN_VALUE_LAMBDA
        setupwithas      ::= DUP_TOP LOAD_ATTR ROT_TWO LOAD_ATTR CALL_FUNCTION_0 setup_finally
        stmt             ::= classdefdeco
        stmt             ::= if_exp_lambda
        stmt             ::= if_exp_not_lambda
        if_exp_lambda    ::= expr jmp_false_then expr return_if_lambda
                               return_stmt_lambda LAMBDA_MARKER
        if_exp_not_lambda ::= expr jmp_true_then expr return_if_lambda
                              return_stmt_lambda LAMBDA_MARKER
        g      @ÚtokensZ
try_exceptÚASTÚaug_assign1r   )Zremove_rulesr   r   Úcustomize_grammar_rulesÚversionZcheck_reduce)r	   r   Z	customize)r
   r   r   r   =   s    


z&Python25Parser.customize_grammar_rulesc       	   	      sr   t t| ƒj|||||ƒ}|s$|d kr(|S |d
kr@|d d dkS |d }t|ƒ}|dkrnt| |||||||ƒS dS )Nr   ÚexprÚ
inplace_opÚstorer   Úandr   F©r   r   r   r   )r   r   )r   r   Úreduce_is_invalidÚlenr   )	r	   ZruleÚastr   ÚfirstÚlastÚinvalidÚlhsÚn)r
   r   r   r   a   s    

z Python25Parser.reduce_is_invalid)	Ú__name__Ú
__module__Ú__qualname__ÚPARSER_DEFAULT_DEBUGr   r   r   r   Ú__classcell__r   r   )r
   r   r      s   -$r   c               @   s   e Zd ZdS )ÚPython25ParserSingleN)r!   r"   r#   r   r   r   r   r&   p   s   r&   Ú__main__N)Ú__doc__Zuncompyle6.parserr   Zspark_parserr   r$   Zuncompyle6.parsers.parse26r   Zuncompyle6.parsers.reducecheckr   r   r&   r!   ÚpZcheck_grammarr   r   r   r   Ú<module>   s   e