o
     JAf                     @   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 )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   )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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   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   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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sJ 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sJ |j}	|	d }
|
j tjkrd}tj}nA|
j tjkrd}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   r)   .0Zchr%   r   r   
<listcomp>O       z0PatternCompiler.compile_node.<locals>.<listcomp>N   r   c                 S   s   g | ]}|gqS r   r   )r0   ar   r   r   r2   R   s    minmaxc                    r-   r   r.   r/   r1   r   r   r2   V   r3      )r9      r;   )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patternrG   nodesrepeatr<   childr7   r8   r   r1   r   r)   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 sJ | |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([r6   )r=   r   r   STRINGr(   r   Z
evalStringr   r	   ZLeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr#   r)   r<   ZNodePatternr>   )r%   rK   rL   rH   r   r   Zcontent
subpatternr   r   r   r@      s<   


zPatternCompiler.compile_basicc                 C   s   |j tjksJ t|jS N)r   r   NUMBERintr   )r%   rH   r   r   r   rF      s   
zPatternCompiler.get_intrZ   )FF)r   r   r   r&   r,   r)   r@   rF   r   r   r   r   r    &   s    


G#r    )rT   rR   r[   ZTOKENc                 C   s*   | d   r	tjS | tjv rtj|  S d S )Nr   )isalphar   rT   r   Zopmap)r   r   r   r   rS      s
   

rS   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)Znumber2symbolr	   ZNodeZLeaf)r   Zraw_node_infor   r   r^   r<   r   r   r   r$      s   r$   c                 C   s   t  | S rZ   )r    r,   )rJ   r   r   r   r,      s   r,   )__doc__
__author__r   Zpgen2r   r   r   r   r   r    r	   r
   	Exceptionr   r   objectr    rT   rR   r[   rV   rS   r$   r,   r   r   r   r   <module>   s$    
 		