???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3

  \                 @   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/lib64/python3.6/lib2to3/patcomp.pyr      s   r   c       	      c   sP   t jt jt jh}tjtj| 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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krt j| _t j| _ntj|| _t j| j| _t j| _	t j
| _tj| jtd| _dS )z^Initializer.

        Takes an optional alternative filename for the pattern grammar.
        N)Z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   sn   t |}y| jj||d}W n0 tjk
rL } ztt|W Y dd}~X nX |r`| j||fS | j|S d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                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}|j S |j  jj	krʇ fd	d|jD }t|dkr|d S tj|gddd}|j S |j  jj
kr j|jdd }tj|}|j 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 } j||}|dk	r>|j}	|	d }
|
j tjkrd}tj}nX|
j tjkrd}tj}n>|
j tjkr j|	d  }}t|	dkr j|	d
 }n |dks"|dkr>|j }tj|gg||d}|dk	rN||_|j S )zXCompiles a node, recursively.

        This is one big switch on the node type.
        r   c                s   g | ]} j |qS r   )r(   ).0ch)r$   r   r   
<listcomp>O   s    z0PatternCompiler.compile_node.<locals>.<listcomp>N   r   c             S   s   g | ]
}|gqS r   r   )r,   ar   r   r   r.   R   s    )minmaxc                s   g | ]} j |qS r   )r(   )r,   r-   )r$   r   r   r.   V   s          r5   r5   )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patternr@   nodesrepeatr6   Zchildr1   r2   r   )r$   r   r(   C   s^    

 
"

zPatternCompiler.compile_nodec             C   s@  |d }|j tjkr4ttj|j}tjt	||S |j tj
kr|j}|j r|tkrbtd| |dd  rvtdtjt| S |dkrd }n,|jdst| j|d }|d krtd| |dd  r| j|d jd g}nd }tj||S nH|jdkr| j|d S |jd	kr<| j|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([)r1   r2   )r   r   STRINGr'   r   Z
evalStringr   r	   ZLeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr"   r(   r6   ZNodePatternr8   )r$   rD   rE   rA   r   r   Zcontent
subpatternr   r   r   r:      s8    
zPatternCompiler.compile_basicc             C   s
   t |jS )N)intr   )r$   rA   r   r   r   r?      s    zPatternCompiler.get_int)N)FF)N)r   r   r   r%   r+   r(   r:   r?   r   r   r   r   r    &   s
   

G
#r    )rL   rJ   NUMBERZTOKENc             C   s.   | d j  rtjS | tjkr&tj|  S d S d S )Nr   )isalphar   rL   r   Zopmap)r   r   r   r   rK      s
    

rK   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)Znumber2symbolr	   ZNodeZLeaf)r   Zraw_node_infor   r   rU   r6   r   r   r   r#      s    r#   c             C   s   t  j| S )N)r    r+   )rC   r   r   r   r+      s    r+   )__doc__
__author__r   Zpgen2r   r   r   r   r   r    r	   r
   	Exceptionr   r   objectr    rL   rJ   rS   rN   rK   r#   r+   r   r   r   r   <module>	   s     
 		