3
/*^X                 @   s*  d Z ddlmZ ddlmZ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r&e Zej  ddlmZmZ edkr&ej \ZZZZZddlmZ eeeZeejj j!edj" Z#eee# Z$ddl%Z%edd e$D Z$edd e$D Z$ee$e# Z$e&e$ dS )z;
spark grammar differences over Python 3.5 for Python 3.6.
    )print_function)PythonParserSinglenop_func)DEFAULT_DEBUG)Python35Parser)Tokenc                   sT   e Zd Zef fdd	Zdd Zdd Z fddZ fd	d
Z fddZ	  Z
S )Python36Parserc                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/parse36.pyr
      s    zPython36Parser.__init__c             C   s   dS )a  sstmt ::= sstmt RETURN_LAST

        # long except clauses in a loop can sometimes cause a JUMP_BACK to turn into a
        # JUMP_FORWARD to a JUMP_BACK. And when this happens there is an additional
        # ELSE added to the except_suite. With better flow control perhaps we can
        # sort this out better.
        except_suite ::= c_stmts_opt POP_EXCEPT jump_except ELSE
        except_suite_finalize ::= SETUP_FINALLY c_stmts_opt except_var_finalize END_FINALLY
                                  _jump ELSE

        # 3.6 redoes how return_closure works. FIXME: Isolate to LOAD_CLOSURE
        return_closure   ::= LOAD_CLOSURE DUP_TOP STORE_NAME RETURN_VALUE RETURN_LAST

        for_block       ::= l_stmts_opt come_from_loops JUMP_BACK
        come_from_loops ::= COME_FROM_LOOP*

        whilestmt       ::= SETUP_LOOP testexpr l_stmts_opt
                            JUMP_BACK come_froms POP_BLOCK COME_FROM_LOOP
        whilestmt       ::= SETUP_LOOP testexpr l_stmts_opt
                            come_froms JUMP_BACK come_froms POP_BLOCK COME_FROM_LOOP

        # 3.6 due to jump optimization, we sometimes add RETURN_END_IF where
        # RETURN_VALUE is meant. Specifcally this can happen in
        # ifelsestmt -> ...else_suite _. suite_stmts... (last) stmt
        return ::= ret_expr RETURN_END_IF
        return ::= ret_expr RETURN_VALUE COME_FROM
        return_stmt_lambda ::= ret_expr RETURN_VALUE_LAMBDA COME_FROM

        # A COME_FROM is dropped off because of JUMP-to-JUMP optimization
        and  ::= expr jmp_false expr
        and  ::= expr jmp_false expr jmp_false

        jf_cf       ::= JUMP_FORWARD COME_FROM
        cf_jf_else  ::= come_froms JUMP_FORWARD ELSE

        if_exp ::= expr jmp_false expr jf_cf expr COME_FROM

        async_for_stmt     ::= SETUP_LOOP expr
                               GET_AITER
                               LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST
                               YIELD_FROM
                               store
                               POP_BLOCK JUMP_FORWARD COME_FROM_EXCEPT DUP_TOP
                               LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_FALSE
                               POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_BLOCK
                               JUMP_ABSOLUTE END_FINALLY COME_FROM
                               for_block POP_BLOCK
                               COME_FROM_LOOP

        stmt      ::= async_for_stmt36

        async_for_stmt36   ::= SETUP_LOOP expr
                               GET_AITER
                               LOAD_CONST YIELD_FROM
                               SETUP_EXCEPT GET_ANEXT LOAD_CONST
                               YIELD_FROM
                               store
                               POP_BLOCK JUMP_BACK COME_FROM_EXCEPT DUP_TOP
                               LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_TRUE
                               END_FINALLY for_block
                               COME_FROM
                               POP_TOP POP_TOP POP_TOP POP_EXCEPT
                               POP_TOP POP_BLOCK
                               COME_FROM_LOOP

        async_forelse_stmt ::= SETUP_LOOP expr
                               GET_AITER
                               LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST
                               YIELD_FROM
                               store
                               POP_BLOCK JUMP_FORWARD COME_FROM_EXCEPT DUP_TOP
                               LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_FALSE
                               POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_BLOCK
                               JUMP_ABSOLUTE END_FINALLY COME_FROM
                               for_block POP_BLOCK
                               else_suite COME_FROM_LOOP

        # Adds a COME_FROM_ASYNC_WITH over 3.5
        # FIXME: remove corresponding rule for 3.5?

        except_suite ::= c_stmts_opt COME_FROM POP_EXCEPT jump_except COME_FROM

        jb_cfs      ::= JUMP_BACK come_froms

        # If statement inside a loop.
        stmt                ::= ifstmtl
        ifstmtl            ::= testexpr _ifstmts_jumpl
        _ifstmts_jumpl     ::= c_stmts JUMP_BACK

        ifelsestmtl ::= testexpr c_stmts_opt jb_cfs else_suitel
        ifelsestmtl ::= testexpr c_stmts_opt cf_jf_else else_suitel
        ifelsestmt  ::= testexpr c_stmts_opt cf_jf_else else_suite _come_froms
        ifelsestmt  ::= testexpr c_stmts come_froms else_suite come_froms

        # In 3.6+, A sequence of statements ending in a RETURN can cause
        # JUMP_FORWARD END_FINALLY to be omitted from try middle

        except_return    ::= POP_TOP POP_TOP POP_TOP returns
        except_handler   ::= JUMP_FORWARD COME_FROM_EXCEPT except_return

        # Try middle following a returns
        except_handler36 ::= COME_FROM_EXCEPT except_stmts END_FINALLY

        stmt             ::= try_except36
        try_except36     ::= SETUP_EXCEPT returns except_handler36
                             opt_come_from_except
        try_except36     ::= SETUP_EXCEPT suite_stmts
        try_except36     ::= SETUP_EXCEPT suite_stmts_opt POP_BLOCK
                             except_handler36 opt_come_from_except

        # 3.6 omits END_FINALLY sometimes
        except_handler36 ::= COME_FROM_EXCEPT except_stmts
        except_handler36 ::= JUMP_FORWARD COME_FROM_EXCEPT except_stmts
        except_handler   ::= jmp_abs COME_FROM_EXCEPT except_stmts

        stmt             ::= tryfinally36
        tryfinally36     ::= SETUP_FINALLY returns
                             COME_FROM_FINALLY suite_stmts
        tryfinally36     ::= SETUP_FINALLY returns
                             COME_FROM_FINALLY suite_stmts_opt END_FINALLY
        except_suite_finalize ::= SETUP_FINALLY returns
                                  COME_FROM_FINALLY suite_stmts_opt END_FINALLY _jump

        stmt ::= tryfinally_return_stmt
        tryfinally_return_stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST
                                   COME_FROM_FINALLY

        compare_chained2 ::= expr COMPARE_OP come_froms JUMP_FORWARD

        Nr   )r   argsr   r   r   p_36misc    s    zPython36Parser.p_36miscc             C   s   dS )a#  
        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
        Nr   )r   r   r   r   r   p_37conditionals   s    zPython36Parser.p_37conditionalsc       	         s"  t t| j|| | jd d| jd< xt|D ]\}}|j}|dkr\d}| j|| q2|dkrvd}| j|| q2|dkrd	| jkrd
}| j	|t
 nd| jkrd}| j	|t
 q2|dkrd}| j	|t
 q2|jdr|j}dd| |f }| j|| d| jkrd}| j|| q2|jdrL|j}dd| |f }| j	|t
 q2|jdr|j}ddt|d   dt|d d   d|d   | }| j	|t
 dd| |f }| j	|t
 q2|dkrd}| j	|t
 d| jd< q2|d krd!}| j	|t
 q2|d"kr2d#}| j	|t
 q2W d S )$Na+  
           _ifstmts_jumpl     ::= c_stmts_opt
           _ifstmts_jumpl     ::= _ifstmts_jump
           except_handler     ::= JUMP_FORWARD COME_FROM_EXCEPT except_stmts END_FINALLY COME_FROM
           async_for_stmt     ::= SETUP_LOOP expr
                                  GET_AITER
                                  LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST
                                  YIELD_FROM
                                  store
                                  POP_BLOCK jump_except COME_FROM_EXCEPT DUP_TOP
                                  LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_FALSE
                                  POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_BLOCK
                                  JUMP_ABSOLUTE END_FINALLY COME_FROM
                                  for_block POP_BLOCK JUMP_ABSOLUTE
                                  COME_FROM_LOOP
           async_forelse_stmt ::= SETUP_LOOP expr
                                  GET_AITER
                                  LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST
                                  YIELD_FROM
                                  store
                                  POP_BLOCK JUMP_FORWARD COME_FROM_EXCEPT DUP_TOP
                                  LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_FALSE
                                  POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_BLOCK
                                  JUMP_ABSOLUTE END_FINALLY COME_FROM
                                  for_block pb_ja
                                  else_suite COME_FROM_LOOP

        ASTcall_kwFORMAT_VALUEz
                    expr              ::= formatted_value1
                    formatted_value1  ::= expr FORMAT_VALUE
                ZFORMAT_VALUE_ATTRz
                expr              ::= formatted_value2
                formatted_value2  ::= expr expr FORMAT_VALUE_ATTR
                ZMAKE_FUNCTION_8ZLOAD_DICTCOMPz
                       dict_comp ::= load_closure LOAD_DICTCOMP LOAD_STR
                                     MAKE_FUNCTION_8 expr
                                     GET_ITER CALL_FUNCTION_1
                       ZLOAD_SETCOMPz
                       set_comp ::= load_closure LOAD_SETCOMP LOAD_STR
                                    MAKE_FUNCTION_8 expr
                                    GET_ITER CALL_FUNCTION_1
                       BEFORE_ASYNC_WITHae  
                  stmt ::= async_with_stmt
                  async_with_pre     ::= BEFORE_ASYNC_WITH GET_AWAITABLE LOAD_CONST YIELD_FROM SETUP_ASYNC_WITH
                  async_with_post    ::= COME_FROM_ASYNC_WITH
                                         WITH_CLEANUP_START GET_AWAITABLE LOAD_CONST YIELD_FROM
                                         WITH_CLEANUP_FINISH END_FINALLY
                  async_with_as_stmt ::= expr
                               async_with_pre
                               store
                               suite_stmts_opt
                               POP_BLOCK LOAD_CONST
                               async_with_post
                 stmt ::= async_with_as_stmt
                 async_with_stmt ::= expr
                               POP_TOP
                               suite_stmts_opt
                               POP_BLOCK LOAD_CONST
                               async_with_post
                 async_with_stmt ::= expr
                               POP_TOP
                               suite_stmts_opt
                               async_with_post
                BUILD_STRINGz
                    expr                 ::= joined_str
                    joined_str           ::= %sBUILD_STRING_%d
                zexpr z
                      formatted_value_attr ::= expr expr FORMAT_VALUE_ATTR expr BUILD_STRING
                      expr                 ::= formatted_value_attr
                    BUILD_MAP_UNPACK_WITH_CALLz#build_map_unpack_with_call ::= %s%sBUILD_TUPLE_UNPACK_WITH_CALLz!build_tuple_unpack_with_call ::= z	expr1024 i   zexpr32     zstarred ::= %s %sSETUP_ANNOTATIONSa  
                    stmt ::= SETUP_ANNOTATIONS
                    stmt ::= ann_assign_init_value
                    stmt ::= ann_assign_no_init

                    ann_assign_init_value ::= expr store store_annotation
                    ann_assign_no_init    ::= store_annotation
                    store_annotation      ::= LOAD_NAME STORE_ANNOTATION
                    store_annotation      ::= subscript STORE_ANNOTATION
                 tokenassignWITH_CLEANUP_STARTz
                  stmt        ::= with_null
                  with_null   ::= with_suffix
                  with_suffix ::= WITH_CLEANUP_START WITH_CLEANUP_FINISH END_FINALLY
                
SETUP_WITHa  
                  with       ::= expr SETUP_WITH POP_TOP suite_stmts_opt COME_FROM_WITH
                                 with_suffix

                  # Removes POP_BLOCK LOAD_CONST from 3.6-
                  withasstmt ::= expr SETUP_WITH store suite_stmts_opt COME_FROM_WITH
                                 with_suffix
                  with       ::= expr SETUP_WITH POP_TOP suite_stmts_opt POP_BLOCK
                                 BEGIN_FINALLY COME_FROM_WITH
                                 with_suffix
                )r	   r   customize_grammar_rulesZremove_rulesZcheck_reduce	enumeratekindZadd_unique_doc_rulesseen_opsaddRuler   
startswithattrint)	r   tokens	customizeir   opnameZ	rules_strrulev)r   r   r   r      sf    


8

z&Python36Parser.customize_grammar_rulesc                s  | j |\}}t|td d }|| }	tdj| jrdd|  d|  d|  |j d	 }
| j|
|j|	| | jd
|j|	| |jdr|rtt	| j
||||| n8| jdt d|j }djf t }
| j|
|j|j| n|dkrF| jdt d| jkr| jdt d| jkr| jdt d| jkr| jdt n|dkr| jdt | jdkrd| jkr| jdt d| jkr| jdd |j t | jdt ntt	| j
||||| d S )NCALL_FUNCTION   GET_AWAITABLE
YIELD_FROMzasync_call ::= expr zpos_arg zkwarg zexpr z$ GET_AWAITABLE LOAD_CONST YIELD_FROMzexpr ::= async_callCALL_FUNCTION_KWzexpr ::= call_kw36z/call_kw36 ::= expr {values} LOAD_CONST {opname}ZCALL_FUNCTION_EX_KWa  expr        ::= call_ex_kw4
                            call_ex_kw4 ::= expr
                                            expr
                                            expr
                                            CALL_FUNCTION_EX_KW
                         r   zexpr        ::= call_ex_kw
                                call_ex_kw  ::= expr expr build_map_unpack_with_call
                                                CALL_FUNCTION_EX_KW
                             r   a4  expr        ::= call_ex_kw3
                                call_ex_kw3 ::= expr
                                                build_tuple_unpack_with_call
                                                expr
                                                CALL_FUNCTION_EX_KW
                             aZ  expr        ::= call_ex_kw2
                                    call_ex_kw2 ::= expr
                                                    build_tuple_unpack_with_call
                                                    build_map_unpack_with_call
                                                    CALL_FUNCTION_EX_KW
                             CALL_FUNCTION_EXz
                         expr        ::= call_ex
                         starred     ::= expr
                         call_ex     ::= expr starred CALL_FUNCTION_EX
                         g@z
                            expr        ::= call_ex_kw
                            call_ex_kw  ::= expr expr
                                            build_map_unpack_with_call CALL_FUNCTION_EX
                            a;  
                            expr        ::= call_ex_kw3
                            call_ex_kw3 ::= expr
                                            build_tuple_unpack_with_call
                                            %s
                                            CALL_FUNCTION_EX
                            a%  
                            expr        ::= call_ex_kw4
                            call_ex_kw4 ::= expr
                                            expr
                                            expr
                                            CALL_FUNCTION_EX
                            )r/   r0   )Z
get_pos_kwlen	frozensetissubsetr"   r!   Zadd_unique_ruler$   r	   r   custom_classfunc_ruler#   r   r%   formatlocalsZseen_op_basenamesversion)r   r*   r   r(   Z
next_tokenZis_pypyZargs_posZargs_kwZnakZ
uniq_paramr+   values)r   r   r   r6   L  sT     




z$Python36Parser.custom_classfunc_rulec                s   t t| j|||||}|r |S |d dkrxt||d krx|| dkrx||d  dkrx||d  j||d  jkrxdS |d dkr|d }x&t|ts|d dkrdS |d }qW dS )	Nr   r      	LOAD_NAMESTORE_ANNOTATIONTr   F)r	   r   reduce_is_invalidr3   Zpattr
isinstancer   )r   r+   astr'   firstlastinvalidnt)r   r   r   r>     s&    

z Python36Parser.reduce_is_invalid)__name__
__module____qualname__PARSER_DEFAULT_DEBUGr
   r   r   r   r6   r>   __classcell__r   r   )r   r   r      s     `r   c               @   s   e Zd ZdS )Python36ParserSingleN)rE   rF   rG   r   r   r   r   rJ     s   rJ   __main__)PYTHON_VERSIONIS_PYPYg@)get_scannerzJUMP_BACK CONTINUE RETURN_END_IF COME_FROM
               LOAD_GENEXPR LOAD_ASSERT LOAD_SETCOMP LOAD_DICTCOMP LOAD_CLASSNAME
               LAMBDA_MARKER RETURN_LAST
            Nc             C   s   g | ]}t jd d|qS )z_\d+$ )resub).0tr   r   r   
<listcomp>  s    rT   c             C   s   g | ]}t jd d|qS )z_CONT$rO   )rP   rQ   )rR   rS   r   r   r   rT     s    )'__doc__
__future__r   Zuncompyle6.parserr   r   Zspark_parserr   rH   Zuncompyle6.parsers.parse35r   Zuncompyle6.scanners.tokr   r   rJ   rE   pZcheck_grammar
uncompyle6rL   rM   Z
check_setslhsrhsr'   Zright_recursiveZdup_rhsZuncompyle6.scannerrN   ssetZopcr*   unionsplitZ
opcode_setZremain_tokensrP   printr   r   r   r   <module>   s4      0


