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

  \&                 @   s|   d Z ddlmZ ddlmZmZ ddlmZmZ eZ	eZ
ejZeZdZdZdZG dd deZdd
dZdd Zdd Zd	S )z0Utility functions used by the btm_matcher module   )pytree)grammartoken)pattern_symbolspython_symbols      c               @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )MinNodezThis class serves as an intermediate representation of the
    pattern tree during the conversion to sets of leaf-to-root
    subpatternsNc             C   s.   || _ || _g | _d| _d | _g | _g | _d S )NF)typenamechildrenleafparentalternativesgroup)selfr
   r    r   )/usr/lib64/python3.6/lib2to3/btm_utils.py__init__   s    zMinNode.__init__c             C   s   t | jd t | j S )N )strr
   r   )r   r   r   r   __repr__   s    zMinNode.__repr__c             C   s   | }g }x|r|j tkr`|jj| t|jt|jkrTt|jg}g |_|j}q
n|j}d}P |j tkr|j	j| t|j	t|jkrt
|j	}g |_	|j}q
n|j}d}P |j tjkr|jr|j|j n|j|j  |j}q
W |S )zInternal method. Returns a characteristic path of the
        pattern tree. This method must be run for all leaves until the
        linear subpatterns are merged into a singleN)r
   TYPE_ALTERNATIVESr   appendlenr   tupler   
TYPE_GROUPr   get_characteristic_subpatterntoken_labelsNAMEr   )r   nodesubpr   r   r   leaf_to_root!   s8    



zMinNode.leaf_to_rootc             C   s&   x | j  D ]}|j }|r
|S q
W dS )a  Drives the leaf_to_root method. The reason that
        leaf_to_root must be run multiple times is because we need to
        reject 'group' matches; for example the alternative form
        (a | b c) creates a group [b c] that needs to be matched. Since
        matching multiple linear patterns overcomes the automaton's
        capabilities, leaf_to_root merges each group into a single
        choice based on 'characteristic'ity,

        i.e. (a|b c) -> (a|b) if b more characteristic than c

        Returns: The most 'characteristic'(as defined by
          get_characteristic_subpattern) path for the compiled pattern
          tree.
        N)leavesr"   )r   lr!   r   r   r   get_linear_subpatternK   s    zMinNode.get_linear_subpatternc             c   s.   x| j D ]}|j E dH  qW | j s*| V  dS )z-Generator that returns the leaves of the treeN)r   r#   )r   childr   r   r   r#   `   s    zMinNode.leaves)NN)	__name__
__module____qualname____doc__r   r   r"   r%   r#   r   r   r   r   r	      s   
	*r	   Nc             C   s  d}| j tjkr| jd } | j tjkrt| jdkrFt| jd |}nJttd}x>| jD ]4}| jj	|d rnqXt||}|dk	rX|jj
| qXW n| j tjkrt| jdkrttd}x(| jD ]}t||}|r|jj
| qW |jsd}nt| jd |}n| j tjkrt| jd tjrH| jd jdkrHt| jd |S t| jd tjrn| jd jdkst| jdkrt| jd dr| jd jdkrdS d	}d}d}d
}d}	d
}
xn| jD ]d}|j tjkrd
}|}n*|j tjkrd	}|}	n|j tjkr|}t|dr|jdkrd	}
qW |
rb| jd }t|drl|jdkrl| jd }n
| jd }|j tjkr|jdkrttd}n4tt|jrttt|jd}nttt|jd}n\|j tjkr|jjd}|tkrtt| d}nttj|d}n|j tjkr$t||}|rZ|	jd jdkrBd}n|	jd jdkrVnt|r|dk	rx8|jdd D ]&}t||}|dk	rz|jj
| qzW |r||_|S )z
    Internal function. Reduces a compiled pattern tree to an
    intermediate representation suitable for feeding the
    automaton. This also trims off any optional pattern elements(like
    [a], a*).
    N    r   )r
   r   ([valueTF=r   any')r
   r   *+)r
   symsZMatcherr   ZAlternativesr   reduce_treer	   r   indexr   ZAlternativer   ZUnit
isinstancer   ZLeafr.   hasattrZDetailsZRepeaterr   r   TYPE_ANYgetattrpysymsSTRINGstriptokensNotImplementedErrorr   )r    r   Znew_noder&   Zreducedr   Zdetails_nodeZalternatives_nodeZhas_repeaterZrepeater_nodeZhas_variable_nameZ	name_leafr   r   r   r   r6   g   s    











r6   c                s   t | ts| S t| dkr"| d S g }g }dddddgg }d xl| D ]d}tt|d	d
 rFtt| fdd
r~|j| qFtt|fdd
r|j| qF|j| qFW |r|} n|r|} n|r|} t| tdS )zPicks the most characteristic from a list of linear patterns
    Current order used is:
    names > common_names > common_chars
    r   r+   inforifnotNonez[]().,:c             S   s   t | tkS )N)r
   r   )xr   r   r   <lambda>   s    z/get_characteristic_subpattern.<locals>.<lambda>c                s   t | to|  kS )N)r8   r   )rF   )common_charsr   r   rG      s    c                s   t | to|  kS )N)r8   r   )rF   )common_namesr   r   rG     s    )key)r8   listr   r0   rec_testr   max)ZsubpatternsZsubpatterns_with_namesZsubpatterns_with_common_namesZsubpatterns_with_common_chars
subpatternr   )rH   rI   r   r      s2    

r   c             c   s<   x6| D ].}t |ttfr*t||E dH  q||V  qW dS )zPTests test_func on all items of sequence and items of included
    sub-iterablesN)r8   rK   r   rL   )ZsequenceZ	test_funcrF   r   r   r   rL     s    
rL   r4   )N)r*    r   Zpgen2r   r   Zpygramr   r   r5   r<   Zopmapr?   r   r:   r   r   objectr	   r6   r   rL   r   r   r   r   <module>   s   W
 %