a
    ze                     @   s   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#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.9/lib2to3/patcomp.pyr      s   r   c           	      c   sL   t jt jt jh}tt| j}|D ] }|\}}}}}||vr&|V  q&d S 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 u rt j| _t j| _nt|| _t | j| _t j| _	t j
| _tj| jtd| _d S )N)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   sr   t |}z| jj||d}W n4 tjyP } ztt|d W Y d }~n
d }~0 0 |rd| ||fS | |S d S )N)debug)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 ur>|j}	|	d }
|
j tjkrd}tj}nX|
j tjkrd}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 urN||_| S )Nr   c                    s   g | ]}  |qS r   r*   .0Zchr&   r   r   
<listcomp>O       z0PatternCompiler.compile_node.<locals>.<listcomp>   r   c                 S   s   g | ]
}|gqS r   r   )r0   ar   r   r   r2   R   r3   minmaxc                    s   g | ]}  |qS r   r.   r/   r1   r   r   r2   V   r3         )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patternrF   nodesrepeatr<   childr7   r8   r   r1   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vrbtd| |dd  rvtdtt| S |dkrd }n,|dst| j|d }|d u rt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([r6   )r   r   STRINGr)   r   Z
evalStringr   r	   ZLeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr$   r*   r<   ZNodePatternr>   )r&   rJ   rK   rG   r   r   Zcontent
subpatternr   r   r   r@      s8    
zPatternCompiler.compile_basicc                 C   s
   t |jS r   )intr   )r&   rG   r   r   r   rE      s    zPatternCompiler.get_int)N)FF)N)r   r   r   r'   r-   r*   r@   rE   r   r   r   r   r!   &   s
   

G
#r!   )rS   rQ   NUMBERZTOKENc                 C   s.   | d   rtjS | tjv r&tj|  S d S d S )Nr   )isalphar   rS   r   Zopmap)r   r   r   r   rR      s
    

rR   c                 C   s>   |\}}}}|s|| j v r*tj|||dS tj|||dS d S )N)context)Znumber2symbolr	   ZNodeZLeaf)r   Zraw_node_infor   r   r\   r<   r   r   r   r%      s    r%   c                 C   s   t  | S r   )r!   r-   )rI   r   r   r   r-      s    r-   )
__author__r   Zpgen2r   r   r   r   r   r    r	   r
   	Exceptionr   r    objectr!   rS   rQ   rZ   rU   rR   r%   r-   r   r   r   r   <module>   s     
 		