B
    18\                 @   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   S/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/lib2to3/patcomp.pyr      s   r   c       	      c   sP   t jt jt jh}tt| j}x(|D ] }|\}}}}}||kr(|V  q(W 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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)convert)r
   pattern_grammarr   pattern_symbolssymsr   load_grammarSymbolspython_grammarZ	pygrammarpython_symbolspysymsDriverpattern_convert)selfZgrammar_filer   r   r   __init__(   s    
zPatternCompiler.__init__Fc          
   C   sp   t |}y| jj||d}W n2 tjk
rN } ztt|dW d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   parse_tokensr   
ParseErrorr   strcompile_node)r.   r   r0   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st|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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   )r4   ).0ch)r.   r   r   
<listcomp>O   s    z0PatternCompiler.compile_node.<locals>.<listcomp>N   r   c             S   s   g | ]
}|gqS r   r   )r8   ar   r   r   r:   R   s    )minmaxc                s   g | ]}  |qS r   )r4   )r8   r9   )r.   r   r   r:   V   s       )r?      rA   F)r   r&   MatcherchildrenAlternativeslenr	   WildcardPatternoptimizeAlternativeNegatedUnitcompile_basicNegatedPatternUnitAssertionErrorr   EQUALr   RepeaterSTARHUGEPLUSLBRACERBRACEget_intname)r.   nodeZaltspZunitspatternrV   nodesrepeatrC   childr=   r>   r   )r.   r   r4   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  rtdt	
t| S |dkrd }n,|dst| j|d }|d k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 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([)r=   r>   F)rE   rM   r   r   STRINGr3   r   Z
evalStringr   r	   LeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr+   r4   rC   NodePatternrF   )r.   rZ   r[   rW   r   r   content
subpatternr   r   r   rJ      s<    
zPatternCompiler.compile_basicc             C   s   |j tjkstt|jS )N)r   r   NUMBERrM   intr   )r.   rW   r   r   r   rU      s    zPatternCompiler.get_int)N)FF)N)r   r   r   r/   r7   r4   rJ   rU   r   r   r   r   r"   &   s
   

G
#r"   )rd   ra   rl   ZTOKENc             C   s.   | d   rtjS | tjkr&tj|  S d S d S )Nr   )isalphar   rd   r   opmap)r   r   r   r   rc      s
    

rc   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)number2symbolr	   NodeLeaf)r   Zraw_node_infor   r   rp   rC   r   r   r   r-      s    r-   c             C   s   t  | S )N)r"   r7   )rY   r   r   r   r7      s    r7   )__doc__
__author__r   pgen2r   r   r   r   r   r    r	   r
   	Exceptionr   r!   objectr"   rd   ra   rl   rf   rc   r-   r7   r   r   r   r   <module>	   s     
 		