o
    Š�bcŽ  ã                   @   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   ú&/usr/lib/python3.10/lib2to3/patcomp.pyr      s    r   c           	      c   sN   � t jt jt jh}t t | ¡j¡}|D ]}|\}}}}}||vr$|V  qdS )z6Tokenizes a string suppressing significant whitespace.N)	r   ÚNEWLINEÚINDENTÚDEDENTr   Úgenerate_tokensÚioÚStringIOÚreadline)	ÚinputÚskipÚtokensÚ	quintupleÚtypeÚvalueÚstartÚendÚ	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u 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)Úconvert)r
   Úpattern_grammarr   Úpattern_symbolsÚsymsr   Úload_grammarÚSymbolsÚpython_grammarÚ	pygrammarÚpython_symbolsÚpysymsÚDriverÚpattern_convert)ÚselfÚgrammar_filer   r   r   Ú__init__(   s   
zPatternCompiler.__init__Fc              
   C   sb   t |ƒ}z
| jj||d�}W n tjy" } ztt|ƒƒd‚d}~ww |r,|  |¡|fS |  |¡S )z=Compiles a pattern string to a nested pytree.*Pattern object.)ÚdebugN)r!   r   Úparse_tokensr   Ú
ParseErrorr   ÚstrÚcompile_node)r/   r   r2   Ú	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r=‡ fdd„|jddd… D ƒ}t|ƒdkr,|d S tjdd„ |D ƒddd�}| ¡ S |j ˆ jj	kre‡ fd	d„|jD ƒ}t|ƒdkrX|d S tj|gddd�}| ¡ S |j ˆ jj
krˆ  |jdd… ¡}t |¡}| ¡ S |j ˆ jjksˆJ ‚d}|j}t|ƒd
kr¦|d j tjkr¦|d j}|dd… }d}t|ƒdkrÁ|d j ˆ jjkrÁ|d }|dd… }ˆ  ||¡}|du�rA|j ˆ jjksÕJ ‚|j}	|	d }
|
j tjkrèd}tj}nA|
j tjkrôd}tj}n5|
j tjk�r'|	d j tjk�sJ ‚t|	ƒdv �sJ ‚ˆ  |	d ¡ }}t|	ƒdk�r&ˆ  |	d
 ¡}nJ ‚|dk�s3|dk�rA| ¡ }tj|gg||d�}|du�rI||_| ¡ S )zXCompiles a node, recursively.

        This is one big switch on the node type.
        r   c                    ó   g | ]}ˆ   |¡‘qS r   ©r6   ©Ú.0Úch©r/   r   r   Ú
<listcomp>O   ó    z0PatternCompiler.compile_node.<locals>.<listcomp>Né   r   c                 S   s   g | ]}|g‘qS r   r   )r>   Úar   r   r   rA   R   s    ©ÚminÚmaxc                    r;   r   r<   r=   r@   r   r   rA   V   rB   é   éÿÿÿÿ)rH   é   rJ   )r   r&   ÚMatcherÚchildrenÚAlternativesÚlenr	   ÚWildcardPatternÚoptimizeÚAlternativeÚNegatedUnitÚcompile_basicÚNegatedPatternÚUnitr   ÚEQUALr   ÚRepeaterÚSTARÚHUGEÚPLUSÚLBRACEÚRBRACEÚget_intÚname)r/   ÚnodeÚaltsÚpÚunitsÚpatternr^   ÚnodesÚrepeatrL   ÚchildrF   rG   r   r@   r   r6   C   sj   



€
zPatternCompiler.compile_nodec                 C   sZ  t |ƒdksJ ‚|d }|jtjkr"tt |j¡ƒ}t 	t
|ƒ|¡S |jtjkr�|j}| ¡ rJ|tvr9td| ƒ‚|dd … rCtdƒ‚t 	t| ¡S |dkrQd }n| d¡sgt| j|d ƒ}|d u rgtd| ƒ‚|dd … ry|  |d jd ¡g}nd }t ||¡S |jdkr�|  |d ¡S |jd	kr©|d u s˜J ‚|  |d ¡}tj|ggddd
�S J |ƒ‚)Nr   r   zInvalid token: %rzCan't have details for tokenÚanyÚ_zInvalid symbol: %rú(ú[rE   )rN   r   r   ÚSTRINGr5   r   Ú
evalStringr   r	   ÚLeafPatternÚ_type_of_literalÚNAMEÚisupperÚ	TOKEN_MAPr   Ú
startswithÚgetattrr,   r6   rL   ÚNodePatternrO   )r/   rd   re   r_   r   r   ÚcontentÚ
subpatternr   r   r   rS   Š   s<   


zPatternCompiler.compile_basicc                 C   s   |j tjksJ ‚t|jƒS ©N)r   r   ÚNUMBERÚintr   )r/   r_   r   r   r   r]   ­   s   
zPatternCompiler.get_intrw   )FF)r   r   r   r1   r:   r6   rS   r]   r   r   r   r   r"   &   s    


G#r"   )ro   rk   rx   ÚTOKENc                 C   s*   | d   ¡ r	tjS | tjv rtj|  S d S )Nr   )Úisalphar   ro   r   Úopmap)r   r   r   r   rn   ¹   s
   

rn   c                 C   s:   |\}}}}|s|| j v rtj|||d�S tj|||d�S )z9Converts raw node information to a Node or Leaf instance.)Úcontext)Únumber2symbolr	   ÚNodeÚLeaf)r   Úraw_node_infor   r   r}   rL   r   r   r   r.   Â   s   r.   c                 C   s   t ƒ  | ¡S rw   )r"   r:   )rc   r   r   r   r:   Ë   s   r:   )Ú__doc__Ú
__author__r   Úpgen2r   r   r   r   r   r   Ú r	   r
   Ú	Exceptionr   r!   Úobjectr"   ro   rk   rx   rq   rn   r.   r:   r   r   r   r   Ú<module>   s$    
 ý		