
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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                    s°  |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 |j ˆ jjk�st‚d}|j}t|ƒd
k�rR|d j tjk�rR|d j}|dd… }d}t|ƒdk�rŒ|d j ˆ jjk�rŒ|d }|dd… }ˆ  ||¡}|dk	�r˜|j ˆ jjk�s¶t‚|j}	|	d }
|
j tjk�rÞd}tj}nŠ|
j tjk�rød}tj}np|
j tjk�r^|	d j tjk�st‚t|	ƒdk�s.t‚ˆ  |	d ¡ }}t|	ƒdk�rhˆ  |	d
 ¡}n
d�sht‚|dk�s||dk�r˜| ¡ }tj|gg||d�}|dk	�r¨||_| ¡ 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     é   éÿÿÿÿ)r6   é   r8   F)r   r!   ZMatcherÚchildrenZAlternativesÚlenr	   ÚWildcardPatternÚoptimizeZAlternativeZNegatedUnitÚcompile_basicZNegatedPatternZUnitÚAssertionErrorr   ÚEQUALr   ZRepeaterÚSTARZHUGEÚPLUSÚLBRACEÚRBRACEÚget_intÚname)r$   ÚnodeZaltsÚpZunitsÚpatternrE   ÚnodesÚrepeatr9   Zchildr4   r5   r   r/   r   r(   C   sh    

 
"


zPatternCompiler.compile_nodec                 C   sn  t |ƒdkst‚|d }|jtjkrDtt |j¡ƒ}t	 
t|ƒ|¡S |jtjk�r|j}| ¡ r–|tkrttd| ƒ‚|dd … rˆt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 nV|jdk�r |  |d ¡S |jd	k�r\|d k�s:t‚|  |d ¡}t	j|ggddd
�S d�sjt|ƒ‚d S )Nr   r   zInvalid token: %rzCan't have details for tokenÚanyÚ_zInvalid symbol: %rú(ú[r3   F)r:   r>   r   r   ÚSTRINGr'   r   Z
evalStringr   r	   ZLeafPatternÚ_type_of_literalÚNAMEÚisupperÚ	TOKEN_MAPr   Ú
startswithÚgetattrr"   r(   r9   ZNodePatternr;   )r$   rI   rJ   rF   r   r   ZcontentÚ
subpatternr   r   r   r=   Š   s<    
zPatternCompiler.compile_basicc                 C   s   |j tjkst‚t|jƒS ©N)r   r   ÚNUMBERr>   Úintr   )r$   rF   r   r   r   rD   ­   s    zPatternCompiler.get_int)N)FF)N)r   r   r   r%   r+   r(   r=   rD   r   r   r   r   r    &   s
   

G
#r    )rQ   rO   rX   ZTOKENc                 C   s.   | d   ¡ rtjS | tjkr&tj|  S d S d S )Nr   )Úisalphar   rQ   r   Zopmap)r   r   r   r   rP   ¹   s
    

rP   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   r[   r9   r   r   r   r#   Â   s    r#   c                 C   s   t ƒ  | ¡S rW   )r    r+   )rH   r   r   r   r+   Ë   s    r+   )Ú__doc__Ú
__author__r   Zpgen2r   r   r   r   r   r   Ú r	   r
   Ú	Exceptionr   r   Úobjectr    rQ   rO   rX   rS   rP   r#   r+   r   r   r   r   Ú<module>   s"    
 ý		