a
    
d                     @   s   d Z dZddlZddlmZ ddlmZ ddlmZ ddlmZ dd	lm	Z	 dd
l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 )zPattern 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   )pygram)pytree)driver)grammar)literals)parse)token)tokenizec                   @   s   e Zd ZdS )PatternSyntaxErrorN)__name__
__module____qualname__ r   r   k/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/yapf_third_party/_ylib2to3/patcomp.pyr      s   r   c           	      c   sL   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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 )z^Initializer.

        Takes an optional alternative filename for the pattern grammar.
        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 )z=Compiles a pattern string to a nested pytree.*Pattern object.)debugN)r   r   Zparse_tokensr   
ParseErrorr   strcompile_node)r%   r   r'   Z	with_treer   rooter   r   r   compile_pattern:   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J 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ur|j  jjksJ |j}	|	d }
|
j tjkrd}tj}n|
j tjkrd}tj}np|
j tjkr^|	d j tjksJ t|	dv s.J  |	d  }}t|	dkrh |	d
 }n
dshJ |dks||dkr| }tj|gg||d}|dur||_| S )zXCompiles a node, recursively.

        This is one big switch on the node type.
        r   c                    s   g | ]}  |qS r   r*   .0chr%   r   r   
<listcomp>R       z0PatternCompiler.compile_node.<locals>.<listcomp>N   r   c                 S   s   g | ]
}|gqS r   r   )r0   ar   r   r   r3   U   r4   minmaxc                    s   g | ]}  |qS r   r.   r/   r2   r   r   r3   Y   r4      )r:      r<   F)r   r"   ZMatcherchildrenZAlternativeslenr   WildcardPatternoptimizeZAlternativeZNegatedUnitcompile_basicZNegatedPatternZUnitr	   EQUALr   ZRepeaterSTARZHUGEPLUSLBRACERBRACEget_intname)r%   nodeZaltspZunitspatternrH   nodesrepeatr=   childr8   r9   r   r2   r   r*   F   sh    

 
"


zPatternCompiler.compile_nodec                 C   sn  t |dksJ |d }|jtjkrDtt|j}t	t
||S |jtjkr|j}| r|tvrttd| |dd  rt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 nV|jdkr | |d S |jd	kr\|d u s:J | |d }tj|ggddd
S dsjJ |d S )Nr   r   zInvalid token: %rzCan't have details for tokenany_zInvalid symbol: %r([r7   F)r>   r   r	   STRINGr)   r   Z
evalStringr   r   ZLeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr#   r*   r=   ZNodePatternr?   )r%   rL   rM   rI   r   r   content
subpatternr   r   r   rA      s<    
zPatternCompiler.compile_basicc                 C   s   |j tjksJ t|jS N)r   r	   NUMBERintr   )r%   rI   r   r   r   rG      s    zPatternCompiler.get_int)N)FF)N)r   r   r   r&   r-   r*   rA   rG   r   r   r   r   r    )   s
   

G
#r    )rU   rS   r]   ZTOKENc                 C   s.   | d   rtjS | tjv r&tj|  S d S d S )Nr   )isalphar	   rU   r   opmap)r   r   r   r   rT      s
    

rT   c                 C   s>   |\}}}}|s|| j v r*tj|||dS tj|||dS dS )z9Converts raw node information to a Node or Leaf instance.)contextN)Znumber2symbolr   NodeZLeaf)r   Zraw_node_infor   r   ra   r=   r   r   r   r$      s    r$   c                 C   s   t  | S r\   )r    r-   )rK   r   r   r   r-      s    r-   )__doc__
__author__r    r   r   Zpgen2r   r   r   r   r	   r
   	Exceptionr   r   objectr    rU   rS   r]   rW   rT   r$   r-   r   r   r   r   <module>   s,   
 		