
\[\                 @   s  d  Z  d Z d d l 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 e j j e j j e  d  Z Gd	 d
   d
 e  Z d d   Z Gd d   d e  Z i e j d 6e j d 6e j d 6d d 6Z d d   Z d d   Z d d   Z d S)zPattern compiler.

The grammer 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)pygramzPatternGrammar.txtc               @   s   e  Z d  Z d S)PatternSyntaxErrorN)__name__
__module____qualname__ r   r   %/usr/lib/python3.4/lib2to3/patcomp.pyr      s   r   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)z6Tokenizes a string suppressing significant whitespace.N)
setr   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               @   sX   e  Z d  Z e d d  Z d d d d  Z d d   Z d d	 d
  Z d d   Z d S)PatternCompilerc             C   s^   t  j |  |  _ t j |  j  |  _ t j |  _ t j |  _	 t  j
 |  j d t |  _  d S)z^Initializer.

        Takes an optional alternative filename for the pattern grammar.
        convertN)r   Zload_grammarr   r
   ZSymbolssymsZpython_grammarZ	pygrammarZpython_symbolspysymsZDriverpattern_convert)selfZgrammar_filer   r   r   __init__-   s
    zPatternCompiler.__init__Fc             C   s   t  |  } y |  j j | d | } Wn: t j k
 rd } z t t |    WYd d } ~ Xn X| r~ |  j |  | f S|  j |  Sd 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_pattern8   s    %zPatternCompiler.compile_patternc                s  | j    j j k r% | j d } n  | j    j j k r   f d d   | j d d d  D } t |  d k r} | d St j d d   | D d d d	 d } | j   S| j    j j	 k r"  f d
 d   | j D } t |  d k r | d St j | g d d d	 d } | j   S| j    j j
 k rl  j | j d 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 d  } n  d } t |  d k r,| d j    j j k r,| d } | d d  } n    j | |  } | d k	 r| j    j j k se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 rH|	 d j  t j k st  t |	  d k st    j |	 d  } } t |	  d k rT  j |	 d  } qTn d sTt  | d k sl| d k r| j   } t j | g g d | d	 | } qn  | d k	 r| | _ n  | j   S)zXCompiles a node, recursively.

        This is one big switch on the node type.
        r   c                s   g  |  ] }   j  |   q Sr   )r*   ).0ch)r&   r   r   
<listcomp>P   s   	 z0PatternCompiler.compile_node.<locals>.<listcomp>N   r   c             S   s   g  |  ] } | g  q Sr   r   )r.   ar   r   r   r0   S   s   	 minmaxc                s   g  |  ] }   j  |   q Sr   )r*   )r.   r/   )r&   r   r   r0   W   s   	       Fr7   r7   r7   )r5   r6   )r   r#   ZMatcherchildrenZAlternativeslenr	   WildcardPatternoptimizeZAlternativeZNegatedUnitcompile_basicZNegatedPatternZUnitAssertionErrorr   EQUALr   ZRepeaterSTARZHUGEPLUSLBRACERBRACEget_intname)r&   nodeZaltspZunitspatternrD   nodesrepeatr8   Zchildr3   r4   r   )r&   r   r*   D   sh    )(


	(+
	
'zPatternCompiler.compile_nodeNc             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 r|| j } | j   r | t k r t d |   n  | d d   r t d   n  t	 j
 t |  S| d k r d  } nF | j d  s3t |  j | d   } | d  k r3t d |   q3n  | d d   rc|  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 Sd st |   d  S)Nr   r   zInvalid token: %rzCan't have details for tokenany_zInvalid symbol: %r([r3   r4   F)r9   r=   r   r   STRINGr)   r   Z
evalStringr   r	   ZLeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr$   r*   r8   ZNodePatternr:   )r&   rH   rI   rE   r   r   Zcontent
subpatternr   r   r   r<      s<    
		 zPatternCompiler.compile_basicc             C   s%   | j  t j k s t  t | j  S)N)r   r   NUMBERr=   intr   )r&   rE   r   r   r   rC      s    zPatternCompiler.get_int)	r   r   r   _PATTERN_GRAMMAR_FILEr'   r-   r*   r<   rC   r   r   r   r   r!   +   s
   G#r!   rP   rN   rV   ZTOKENc             C   s9   |  d j    r t j S|  t j k r1 t j |  Sd  Sd  S)Nr   )isalphar   rP   r   Zopmap)r   r   r   r   rO      s
    rO   c             C   sW   | \ } } } } | s' | |  j  k r= t j | | d | St j | | d | Sd S)z9Converts raw node information to a Node or Leaf instance.contextN)Znumber2symbolr	   ZNodeZLeaf)r   Zraw_node_infor   r   rZ   r8   r   r   r   r%      s    r%   c             C   s   t    j |   S)N)r!   r-   )rG   r   r   r   r-      s    r-   )__doc__
__author__r   osZpgen2r   r   r   r   r   r    r	   r
   pathjoindirname__file__rX   	Exceptionr   r    objectr!   rP   rN   rV   rR   rO   r%   r-   r   r   r   r   <module>	   s$   .	



		