�
{fc @ 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 d e
f d � � YZ d
� Z d e f d � � YZ i e j d
6e j d 6e j d 6d d 6Z d � Z d � Z d � Z d S( s� Pattern compiler.
The grammar is taken from PatternGrammar.txt.
The compiler compiles a pattern to a pytree.*Pattern instance.
s# Guido van Rossum i����Ni ( t drivert literalst tokent tokenizet parset grammar( t pytree( t pygramt PatternSyntaxErrorc B s e Z RS( ( t __name__t
__module__( ( ( s' /usr/lib64/python2.7/lib2to3/patcomp.pyR s c c sw t t j t j t j f � } t j t j | � j � } x7 | D]/ } | \ } } } } } | | k r@ | Vq@ q@ Wd S( s6 Tokenizes a string suppressing significant whitespace.N( t setR t NEWLINEt INDENTt DEDENTR t generate_tokenst StringIOt readline( t inputt skipt tokenst quintuplet typet valuet startt endt line_text( ( s' /usr/lib64/python2.7/lib2to3/patcomp.pyt tokenize_wrapper s
t PatternCompilerc B sA e Z d d � Z e e d � Z d � Z d d � Z d � Z RS( c C s� | d k r' t j | _ t j | _ n' t j | � | _ t j | j � | _ t j | _
t j | _ t j
| j d t �| _ d S( s^ Initializer.
Takes an optional alternative filename for the pattern grammar.
t convertN( t NoneR t pattern_grammarR t pattern_symbolst symsR t load_grammart Symbolst python_grammart pygrammart python_symbolst pysymst Drivert pattern_convert( t selft grammar_file( ( s' /usr/lib64/python2.7/lib2to3/patcomp.pyt __init__( s c C s} t | � } y | j j | d | �} Wn( t j k
rR } t t | � � � n X| rl | j | � | f S| j | � Sd S( s= Compiles a pattern string to a nested pytree.*Pattern object.t debugN( R R t parse_tokensR t
ParseErrorR t strt compile_node( R* R R- t with_treeR t roott e( ( s' /usr/lib64/python2.7/lib2to3/patcomp.pyt compile_pattern7 s c C sT | j | j j k r% | j d } n | j | j j k r� g | j d d d � D] } | j | � ^ qQ } t | � d k r� | d St j g | D] } | g ^ q� d d d d �} | j � S| j | j j
k r=g | j D] } | j | � ^ q� } t | � d k r| d St j | g d d d d �} | j � S| j | j j k r�| j | j d � } t j
| � } | j � Sd } | j } t | � d k r�| d j t j k r�| d j } | d } n d }
t | � d k r| d j | j j k r| d }
| d } n | j | |
� } |
d k r2|
j } | d } | j t j k rod }
t j } nx | j t j k r�d }
t j } nT | j t j k r�| j | d � }
} t | � d k r�| j | d � } q�n |
d k s�| d k r2| j � } t j | g g d |
d | �} q2n | d k rJ| | _ n | j � S(
sX Compiles a node, recursively.
This is one big switch on the node type.
i Ni i t mint maxi i����i ( R R! t Matchert childrent AlternativesR1 t lenR t WildcardPatternt optimizet Alternativet NegatedUnitt
compile_basict NegatedPatternR R t EQUALR t Repeatert STARt HUGEt PLUSt LBRACEt get_intt name( R* t nodet cht altst at pt unitst patternRI t nodest repeatR9 t childR6 R7 ( ( s' /usr/lib64/python2.7/lib2to3/patcomp.pyR1 C s^ 21
%
(
+
'c C s� | d } | j t j k rJ t t j | j � � } t j t | � | � S| j t j
k rX| j } | j � r� | t k r� t
d | � � n | d r� t
d � � n t j t | � S| d k r� d } nF | j d � st | j | d � } | d k rt
d | � � qn | d r?| j | d j d � g } n d } t j | | � Sna | j d k rx| j | d � S| j d k r�| j | d � } t j | g g d
d d d �Sd S( Ni s Invalid token: %ri s Can't have details for tokent anyt _s Invalid symbol: %rt (t [R6 R7 ( R R t STRINGt unicodeR t
evalStringR R t LeafPatternt _type_of_literalt NAMEt isuppert TOKEN_MAPR R t
startswitht getattrR' R1 R9 t NodePatternR<