
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aî&  ã                   @   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 )ÚMinNodez‰This 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   ú6/opt/alt/python38/lib64/python3.8/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 }|râ|j tkr^|j |¡ t|jƒt|jƒkrRt|jƒg}g |_|j}qn|j}d}qâ|j tkr®|j	 |¡ t|j	ƒt|jƒkr¢t
|j	ƒ}g |_	|j}qn|j}d}qâ|j tjkrÎ|jrÎ| |j¡ n| |j ¡ |j}q|S )z°Internal 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&   |   ¡ D ]}| ¡ }|r|  S q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*   | j D ]}| ¡ E dH  q| 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r�t| jƒdkrFt| jd |ƒ}nFttd�}| jD ]4}| j 	|¡d rlqVt||ƒ}|dk	rV|j 
|¡ qV�n| j tjkrút| jƒdkrættd�}| jD ]}t||ƒ}|rº|j 
|¡ qº|jsöd}nt| jd |ƒ}�n˜| j tjk�r’t| jd tjƒ�r>| jd jdk�r>t| jd |ƒS t| jd tjƒ�rd| jd jdk�s˜t| jƒdk�rœt| jd dƒ�rœ| jd jdk�rœdS d	}d}d}d
}d}	d
}
| jD ]d}|j tjk�rÖd
}|}n*|j tjk�rîd	}|}	n|j tjk�r |}t|dƒ�rº|jdk�rºd	}
�qº|
�rT| jd }t|dƒ�r^|jdk�r^| jd }n
| jd }|j tjk�rº|jdk�r„ttd�}n4tt|jƒ�r¦ttt|jƒd�}nttt|jƒd�}n\|j tjk�rþ|j d¡}|tk�rîtt| d�}nttj|d�}n|j tjk�rt||ƒ}|�rL|	jd jdk�r4d}n|	jd jdk�rHnt‚|�r’|dk	�r’|jdd… D ]&}t||ƒ}|dk	�rj|j 
|¡ �qj|�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   ú(ú[ÚvalueTFú=é   Úanyú')r   r   Ú*ú+r   )r   ÚsymsZMatcherr   ZAlternativesr   Úreduce_treer
   r   Úindexr   ZAlternativer   ZUnitÚ
isinstancer   ZLeafr0   Ú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   r8   g   s®    






ÿÿýüû






r8   c                    sÒ   t | tƒs| S t| ƒdkr"| d S g }g }dddddg‰g }d‰ | D ]d}tt|d	d
„ ƒƒrDtt|‡ fdd
„ƒƒr|| |¡ qDtt|‡fdd
„ƒƒrž| |¡ qD| |¡ qD|r´|} n|r¾|} n|rÆ|} t| td�S )z„Picks 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>þ   ó    z/get_characteristic_subpattern.<locals>.<lambda>c                    s   t | tƒo| ˆ kS rH   ©r:   r   rI   )Úcommon_charsr   r   rK      rL   c                    s   t | tƒo| ˆ kS rH   rM   rI   )Úcommon_namesr   r   rK     rL   )Úkey)r:   Úlistr   r3   Úrec_testr   Úmax)ZsubpatternsZsubpatterns_with_namesZsubpatterns_with_common_namesZsubpatterns_with_common_charsÚ
subpatternr   )rN   rO   r   r   í   s6    

ÿ
ÿr   c                 c   s8   | D ].}t |ttfƒr(t||ƒE dH  q||ƒV  qdS )zPTests test_func on all items of sequence and items of included
    sub-iterablesN)r:   rQ   r   rR   )ZsequenceZ	test_funcrJ   r   r   r   rR     s    rR   )N)r+   Ú r   Zpgen2r   r   Zpygramr   r   r7   r>   ZopmaprA   r   r<   r   r   Úobjectr
   r8   r   rR   r   r   r   r   Ú<module>   s   W
 %