ó
è¾bc           @   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 <guido@python.org>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/lib/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@ | Vq@ 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/lib/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/lib/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/lib/python2.7/lib2to3/patcomp.pyt   compile_pattern7   s    c         C   sÊ  | 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	 ƒ  S| j  |  j j k sœt ‚ d } | j }	 t |	 ƒ d k rí|	 d j  t j k rí|	 d j } |	 d }	 n  d }
 t |	 ƒ d k r5|	 d j  |  j j k r5|	 d }
 |	 d  }	 n  |  j |	 |
 ƒ } |
 d k	 r¨|
 j  |  j j k snt ‚ |
 j } | d } | j  t j k r¥d } t j } n¸ | j  t j k rÉd } t j } n” | j  t j k rQ| d j  t j k s÷t ‚ t | ƒ d
 k st ‚ |  j | d ƒ } } t | ƒ d	 k r]|  j | d ƒ } q]n t s]t ‚ | d k su| d k r¨| j	 ƒ  } t j | g g d | d | ƒ} q¨n  | d k	 rÀ| | _ 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   (   i   i   (   R   R!   t   Matchert   childrent   AlternativesR1   t   lenR   t   WildcardPatternt   optimizet   Alternativet   NegatedUnitt   compile_basict   NegatedPatternt   Unitt   AssertionErrorR   R   t   EQUALR   t   Repeatert   STARt   HUGEt   PLUSt   LBRACEt   RBRACEt   get_intt   Falset   name(   R*   t   nodet   cht   altst   at   pt   unitst   patternRM   t   nodest   repeatR9   t   childR6   R7   (    (    s%   /usr/lib/python2.7/lib2to3/patcomp.pyR1   C   sh    21
%

	(+
	
'c         C   sù  t  | ƒ d k s t ‚ | d } | j t j k rb t t j | j ƒ ƒ } t	 j
 t | ƒ | ƒ S| j t j k rp| 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 ƒ s-t |  j | d  ƒ } | d  k r-t d | ƒ ‚ q-n  | d rW|  j | d j d ƒ g } n d  } t	 j | | ƒ Sns | j d k r|  j | d ƒ S| j d	 k rã| d  k s±t ‚ |  j | d ƒ } t	 j | g g d
 d d d ƒSt sõt | ƒ ‚ d  S(   Ni   i    s   Invalid token: %rs   Can't have details for tokent   anyt   _s   Invalid symbol: %rt   (t   [R6   R7   (   R;   RC   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<   RL   (   R*   RU   RV   RN   R   R   t   contentt
   subpattern(    (    s%   /usr/lib/python2.7/lib2to3/patcomp.pyR@   Š   s<    
	
	
 c         C   s%   | j  t j k s t ‚ t | j ƒ S(   N(   R   R   t   NUMBERRC   t   intR   (   R*   RN   (    (    s%   /usr/lib/python2.7/lib2to3/patcomp.pyRK   ­   s    N(	   R	   R
   R   R,   RL   R5   R1   R@   RK   (    (    (    s%   /usr/lib/python2.7/lib2to3/patcomp.pyR   &   s
   	G#Ra   R\   Ri   t   TOKENc         C   s9   |  d j  ƒ  r t j S|  t j k r1 t j |  Sd  Sd  S(   Ni    (   t   isalphaR   Ra   R   t   opmapR   (   R   (    (    s%   /usr/lib/python2.7/lib2to3/patcomp.pyR`   ¹   s
    c         C   sW   | \ } } } } | s' | |  j  k r= t j | | d | ƒSt j | | d | ƒSd S(   s9   Converts raw node information to a Node or Leaf instance.t   contextN(   t   number2symbolR   t   Nodet   Leaf(   R   t   raw_node_infoR   R   Rn   R9   (    (    s%   /usr/lib/python2.7/lib2to3/patcomp.pyR)   Â   s    c         C   s   t  ƒ  j |  ƒ S(   N(   R   R5   (   RT   (    (    s%   /usr/lib/python2.7/lib2to3/patcomp.pyR5   Ë   s    (   t   __doc__t
   __author__R   t   pgen2R    R   R   R   R   R   t    R   R   t	   ExceptionR   R   t   objectR   Ra   R\   Ri   R   Rc   R`   R)   R5   (    (    (    s%   /usr/lib/python2.7/lib2to3/patcomp.pyt   <module>	   s   .	



				