3
”éÃ^á  ã               @   sh   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rdeƒ Z
e
jƒ  e
jƒ  d	S )
é    )ÚDEFAULT_DEBUG)ÚPythonParserSingle)ÚPython24Parserc                   s@   e Zd Zef‡ fdd„	Zdd„ Z‡ fdd„Z‡ fdd„Z‡  ZS )	ÚPython23Parserc                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/parse23.pyr      s    zPython23Parser.__init__c             C   s   dS )aq  
        # Python 2.4 only adds something like the below for if 1:
        # However we will just treat it as a noop (which of course messes up
        # simple verify of bytecode.
        # See also below in reduce_is_invalid where we check that the JUMP_FORWARD
        # target matches the COME_FROM target
        stmt     ::= if1_stmt
        if1_stmt ::= JUMP_FORWARD JUMP_IF_FALSE THEN POP_TOP COME_FROM
                     stmts
                     JUMP_FORWARD COME_FROM POP_TOP COME_FROM


        # Used to keep semantic positions the same across later versions
        # of Python
        _while1test ::= SETUP_LOOP JUMP_FORWARD JUMP_IF_FALSE POP_TOP COME_FROM

        while1stmt ::= _while1test l_stmts_opt JUMP_BACK
                       POP_TOP POP_BLOCK COME_FROM

        while1stmt ::= _while1test l_stmts_opt JUMP_BACK COME_FROM
                       POP_TOP POP_BLOCK COME_FROM

        # Python 2.3
        # The following has no "JUMP_BACK" after l_stmts because
        # l_stmts ends in a "break", "return", or "continue"
        while1stmt ::= _while1test l_stmts
                       POP_TOP POP_BLOCK

        # The following has a "COME_FROM" at the end which comes from
        # a "break" inside "l_stmts".
        while1stmt ::= _while1test l_stmts COME_FROM JUMP_BACK
                       POP_TOP POP_BLOCK COME_FROM
        while1stmt ::= _while1test l_stmts JUMP_BACK
                       POP_TOP POP_BLOCK

        list_comp  ::= BUILD_LIST_0 DUP_TOP LOAD_ATTR store list_iter del_stmt
        list_for   ::= expr for_iter store list_iter JUMP_BACK come_froms POP_TOP JUMP_BACK

        lc_body ::= LOAD_NAME expr CALL_FUNCTION_1 POP_TOP
        lc_body ::= LOAD_FAST expr CALL_FUNCTION_1 POP_TOP
        lc_body ::= LOAD_NAME expr LIST_APPEND
        lc_body ::= LOAD_FAST expr LIST_APPEND

        # "and" where the first part of the and is true,
        # so there is only the 2nd part to evaluate
        expr ::= and2
        and2 ::= _jump jmp_false COME_FROM expr COME_FROM

        alias       ::= IMPORT_NAME attributes store
        if_exp      ::= expr jmp_false expr JUMP_FORWARD expr COME_FROM
        Nr
   )r   Úargsr
   r
   r   Úp_misc23   s    zPython23Parser.p_misc23c                s   t t| ƒj||ƒ d S )N)r   r   Úcustomize_grammar_rules)r   ÚtokensZ	customize)r	   r
   r   r   D   s    z&Python23Parser.customize_grammar_rulesc                sN   t t| ƒj|||||ƒ}|r |S |d }|dkrJt|| jƒ|| jk S dS )Nr   Znop_stmtF)r   r   Úreduce_is_invalidÚintZpattrÚoffset)r   ZruleÚastr   ÚfirstÚlastÚinvalidÚlhs)r	   r
   r   r   G   s    

z Python23Parser.reduce_is_invalid)	Ú__name__Ú
__module__Ú__qualname__ÚPARSER_DEFAULT_DEBUGr   r   r   r   Ú__classcell__r
   r
   )r	   r   r   	   s   5r   c               @   s   e Zd ZdS )ÚPython23ParserSingleN)r   r   r   r
   r
   r
   r   r   U   s   r   Ú__main__N)Zspark_parserr   r   Zuncompyle6.parserr   Zuncompyle6.parsers.parse24r   r   r   r   ÚpZcheck_grammarZdump_grammarr
   r
   r
   r   Ú<module>   s   L