
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aŽ  ã                   @   s    d Z dZddlZddlmZmZmZmZmZm	Z	 ddl
mZ ddl
mZ G dd	„ d	eƒZd
d„ ZG dd„ deƒZejejejddœZdd„ Zdd„ Zdd„ ZdS )z�Pattern compiler.

The grammar is taken from PatternGrammar.txt.

The compiler compiles a pattern to a pytree.*Pattern instance.
z#Guido van Rossum <guido@python.org>é    Né   )ÚdriverÚliteralsÚtokenÚtokenizeÚparseÚgrammar)Úpytree)Úpygramc                   @   s   e Zd ZdS )ÚPatternSyntaxErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú4/opt/alt/python38/lib64/python3.8/lib2to3/patcomp.pyr      s   r   c           	      c   sL   t jt jt jh}t t | ¡j¡}|D ] }|\}}}}}||kr&|V  q&dS )z6Tokenizes a string suppressing significant whitespace.N)	r   ÚNEWLINEÚINDENTÚDEDENTr   Úgenerate_tokensÚioÚStringIOÚreadline)	ÚinputÚskipÚtokensZ	quintupleÚtypeÚvalueÚstartÚendZ	line_textr   r   r   Útokenize_wrapper   s    r   c                   @   s:   e Zd Zddd„Zddd„Zdd„ Zdd	d
„Zdd„ ZdS )ÚPatternCompilerNc                 C   sZ   |dkrt j| _t j| _nt |¡| _t  | j¡| _t j| _	t j
| _tj| jtd�| _dS )z^Initializer.

        Takes an optional alternative filename for the pattern grammar.
        N)Zconvert)r
   Zpattern_grammarr   Zpattern_symbolsÚsymsr   Zload_grammarZSymbolsZpython_grammarZ	pygrammarZpython_symbolsÚpysymsZDriverÚpattern_convert)ÚselfZgrammar_filer   r   r   Ú__init__(   s    
zPatternCompiler.__init__Fc              
   C   sp   t |ƒ}z| jj||d�}W n2 tjk
rN } ztt|ƒƒd‚W 5 d}~X Y nX |rb|  |¡|fS |  |¡S dS )z=Compiles a pattern string to a nested pytree.*Pattern object.)ÚdebugN)r   r   Zparse_tokensr   Z
ParseErrorr   ÚstrÚcompile_node)r$   r   r&   Z	with_treer   ÚrootÚer   r   r   Úcompile_pattern7   s     zPatternCompiler.compile_patternc                    sV  |j ˆ jjkr|jd }|j ˆ jjkrz‡ fdd„|jddd… D ƒ}t|ƒdkrX|d S tjdd„ |D ƒddd�}| ¡ S |j ˆ jj	krÊ‡ fd	d„|jD ƒ}t|ƒdkr°|d S tj|gddd�}| ¡ S |j ˆ jj
krþˆ  |jdd… ¡}t |¡}| ¡ S d}|j}t|ƒd
k�r>|d j tjk�r>|d j}|dd… }d}t|ƒdk�rx|d j ˆ jjk�rx|d }|dd… }ˆ  ||¡}|dk	�r>|j}	|	d }
|
j tjk�r¶d}tj}nX|
j tjk�rÐd}tj}n>|
j tjk�rˆ  |	d ¡ }}t|	ƒdk�rˆ  |	d
 ¡}n |dk�s"|dk�r>| ¡ }tj|gg||d�}|dk	�rN||_| ¡ S )zXCompiles a node, recursively.

        This is one big switch on the node type.
        r   c                    s   g | ]}ˆ   |¡‘qS r   ©r(   ©Ú.0Zch©r$   r   r   Ú
<listcomp>O   s     z0PatternCompiler.compile_node.<locals>.<listcomp>Né   r   c                 S   s   g | ]
}|g‘qS r   r   )r.   Úar   r   r   r0   R   s     ©ÚminÚmaxc                    s   g | ]}ˆ   |¡‘qS r   r,   r-   r/   r   r   r0   V   s     é   éÿÿÿÿé   )r   r!   ZMatcherÚchildrenZAlternativesÚlenr	   ÚWildcardPatternÚoptimizeZAlternativeZNegatedUnitÚcompile_basicZNegatedPatternr   ÚEQUALr   ZRepeaterÚSTARZHUGEÚPLUSÚLBRACEÚget_intÚname)r$   ÚnodeZaltsÚpZunitsÚpatternrC   ÚnodesÚrepeatr9   Zchildr4   r5   r   r/   r   r(   C   s^    

 
"

zPatternCompiler.compile_nodec                 C   s@  |d }|j tjkr4tt |j¡ƒ}t t	|ƒ|¡S |j tj
krô|j}| ¡ r„|tkrbtd| ƒ‚|dd … rvtdƒ‚t t| ¡S |dkr’d }n,| d¡s¾t| j|d ƒ}|d kr¾td| ƒ‚|dd … râ|  |d jd ¡g}nd }t ||¡S nH|jdk�r|  |d ¡S |jd	k�r<|  |d ¡}tj|ggddd
�S d S )Nr   zInvalid token: %rr   zCan't have details for tokenÚanyÚ_zInvalid symbol: %rú(ú[r3   )r   r   ÚSTRINGr'   r   Z
evalStringr   r	   ZLeafPatternÚ_type_of_literalÚNAMEÚisupperÚ	TOKEN_MAPr   Ú
startswithÚgetattrr"   r(   r9   ZNodePatternr;   )r$   rG   rH   rD   r   r   ZcontentÚ
subpatternr   r   r   r=   Š   s8    
zPatternCompiler.compile_basicc                 C   s
   t |jƒS ©N)Úintr   )r$   rD   r   r   r   rB   ­   s    zPatternCompiler.get_int)N)FF)N)r   r   r   r%   r+   r(   r=   rB   r   r   r   r   r    &   s
   

G
#r    )rO   rM   ÚNUMBERZTOKENc                 C   s.   | d   ¡ rtjS | tjkr&tj|  S d S d S )Nr   )Úisalphar   rO   r   Zopmap)r   r   r   r   rN   ¹   s
    

rN   c                 C   s>   |\}}}}|s|| j kr*tj|||d�S tj|||d�S dS )z9Converts raw node information to a Node or Leaf instance.)ÚcontextN)Znumber2symbolr	   ZNodeZLeaf)r   Zraw_node_infor   r   rY   r9   r   r   r   r#   Â   s    r#   c                 C   s   t ƒ  | ¡S rU   )r    r+   )rF   r   r   r   r+   Ë   s    r+   )Ú__doc__Ú
__author__r   Zpgen2r   r   r   r   r   r   Ú r	   r
   Ú	Exceptionr   r   Úobjectr    rO   rM   rW   rQ   rN   r#   r+   r   r   r   r   Ú<module>   s"    
 ý		