3
/*ä^–  ã               @   sd   d 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
S )z:
spark grammar differences over Python2.5 for Python 2.4.
é    )ÚPythonParserSingle)ÚDEFAULT_DEBUG)ÚPython25Parserc                   sH   e Zd Zef‡ fdd„	Zdd„ Zdd„ Z‡ fdd„Z‡ fd	d
„Z‡  Z	S )ÚPython24Parserc                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/parse24.pyr      s    zPython24Parser.__init__c             C   s   dS )a·  
        # 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     ::= nop_stmt
        nop_stmt ::= JUMP_FORWARD POP_TOP COME_FROM

        # 2.5+ has two LOAD_CONSTs, one for the number '.'s in a relative import
        # keep positions similar to simplify semantic actions

        import           ::= filler LOAD_CONST alias
        import_from      ::= filler LOAD_CONST IMPORT_NAME importlist POP_TOP
        import_from_star ::= filler LOAD_CONST IMPORT_NAME IMPORT_STAR

        importmultiple ::= filler LOAD_CONST alias imports_cont
        import_cont    ::= filler LOAD_CONST alias

        # Handle "if true else: ..." in Python 2.4
        stmt            ::= iftrue_stmt24
        iftrue_stmt24   ::= _ifstmts_jump24 suite_stmts COME_FROM
        _ifstmts_jump24 ::= c_stmts_opt JUMP_FORWARD POP_TOP

        # Python 2.5+ omits POP_TOP POP_BLOCK
        while1stmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK
                       POP_TOP POP_BLOCK COME_FROM
        while1stmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK
                       POP_TOP POP_BLOCK

        continue   ::= JUMP_BACK JUMP_ABSOLUTE

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

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

        # Python 2.5+:
        #  call_stmt ::= expr POP_TOP
        #  expr      ::= yield
        call_stmt ::= yield

        # Python 2.5+ adds POP_TOP at the end
        gen_comp_body ::= expr YIELD_VALUE

        # Python 2.4
        # Python 2.6, 2.7 and 3.3+ use kv3
        # Python 2.3- use kv
        kvlist ::= kvlist kv2
        kv2    ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR
        Nr
   )r   Úargsr
   r
   r   Úp_misc24   s    zPython24Parser.p_misc24c             C   s   | j dƒ d S )Nz!
        expr ::= if_exp
        )Úremove_rules)r   r
   r
   r   Úremove_rules_24J   s    zPython24Parser.remove_rules_24c                s<   | j dƒ tt| ƒj||ƒ | jƒ  | jdkr8d| jd< d S )Na  
        gen_comp_body ::= expr YIELD_VALUE POP_TOP
        kvlist        ::= kvlist kv3
        while1stmt    ::= SETUP_LOOP l_stmts JUMP_BACK COME_FROM
        while1stmt    ::= SETUP_LOOP l_stmts_opt JUMP_BACK COME_FROM
        while1stmt    ::= SETUP_LOOP returns COME_FROM
        whilestmt     ::= SETUP_LOOP testexpr returns POP_BLOCK COME_FROM
        with_cleanup  ::= LOAD_FAST DELETE_FAST WITH_CLEANUP END_FINALLY
        with_cleanup  ::= LOAD_NAME DELETE_NAME WITH_CLEANUP END_FINALLY
        withasstmt    ::= expr setupwithas store suite_stmts_opt POP_BLOCK LOAD_CONST COME_FROM with_cleanup
        with          ::= expr setupwith SETUP_FINALLY suite_stmts_opt POP_BLOCK LOAD_CONST COME_FROM with_cleanup
        stmt ::= with
        stmt ::= withasstmt
        g333333@ÚtokensÚnop_stmt)r   r   r   Úcustomize_grammar_rulesr   ÚversionZcheck_reduce)r   r   Z	customize)r	   r
   r   r   P   s    
z&Python24Parser.customize_grammar_rulesc       	         sú   t t| ƒj|||||ƒ}|s$|d kr(|S |d }|dkrxt|ƒ}d|  koVt|ƒk n  röt|| jƒ|| jk S n~|dkrö|t|ƒkr”|d8 }|| dkr¸||d  dkr¸|d8 }|| dkoô||d  dkoô||d  dkoô||d	  jd
kS dS )Nr   r   Z
try_excepté   Z	COME_FROMÚEND_FINALLYé   ÚPOP_TOPé   ÚJUMP_FORWARDF)r   r   Úreduce_is_invalidÚlenÚintZpattrÚoffsetÚkind)	r   ZruleÚastr   ÚfirstÚlastÚinvalidÚlhsÚl)r	   r
   r   r   d   s(    

z Python24Parser.reduce_is_invalid)
Ú__name__Ú
__module__Ú__qualname__ÚPARSER_DEFAULT_DEBUGr   r   r   r   r   Ú__classcell__r
   r
   )r	   r   r   
   s
   ;r   c               @   s   e Zd ZdS )ÚPython24ParserSingleN)r%   r&   r'   r
   r
   r
   r   r*   |   s   r*   Ú__main__N)Ú__doc__Zuncompyle6.parserr   Zspark_parserr   r(   Zuncompyle6.parsers.parse25r   r   r*   r%   ÚpZcheck_grammarr
   r
   r
   r   Ú<module>   s   r