§
    ZQdÙ&  ã                   óŒ   — 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	e¦  «        Zdd„Zd„ Zd„ Zd
S )z0Utility functions used by the btm_matcher moduleé   )Úpytree)ÚgrammarÚtoken)Úpattern_symbolsÚpython_symbolséÿÿÿÿéþÿÿÿéýÿÿÿc                   ó2   — e Zd ZdZdd„Zd„ Zd„ Zd„ Z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                 óh   — || _         || _        g | _        d| _        d | _        g | _        g | _        d S )NF)ÚtypeÚnameÚchildrenÚleafÚparentÚalternativesÚgroup)Úselfr   r   s      ú(/usr/lib/python3.11/lib2to3/btm_utils.pyÚ__init__zMinNode.__init__   s8   € ØˆŒ	ØˆŒ	ØˆŒØˆŒ	ØˆŒØˆÔØˆŒ
ˆ
ˆ
ó    c                 óZ   — t          | j        ¦  «        dz   t          | j        ¦  «        z   S )Nú )Ústrr   r   )r   s    r   Ú__repr__zMinNode.__repr__   s"   € Ý�4”9‰~Œ~ Ñ#¥c¨$¬)¡n¤nÑ4Ð4r   c                 óÐ  — | }g }|�r^|j         t          k    rr|j                             |¦  «         t	          |j        ¦  «        t	          |j        ¦  «        k    r$t          |j        ¦  «        g}g |_        |j        }Œ{|j        }d}nÜ|j         t          k    rq|j	                             |¦  «         t	          |j	        ¦  «        t	          |j        ¦  «        k    r#t          |j	        ¦  «        }g |_	        |j        }Œü|j        }d}n[|j         t          j        k    r"|j        r|                     |j        ¦  «         n|                     |j         ¦  «         |j        }|�°^|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Úsubps      r   Úleaf_to_rootzMinNode.leaf_to_root!   sZ  € ð ˆØˆØñ !	ØŒyÕ-Ò-Ð-ØÔ!×(Ò(¨Ñ.Ô.Ð.Ý�tÔ(Ñ)Ô)­S°´Ñ-?Ô-?Ò?Ð?å! $Ô"3Ñ4Ô4Ð5�DØ(*�DÔ%Øœ;�DØàœ;�DØ�DØàŒy�JÒ&Ð&Ø”
×!Ò! $Ñ'Ô'Ð'å�t”z‘?”?¥c¨$¬-Ñ&8Ô&8Ò8Ð8Ý8¸¼ÑDÔD�DØ!#�D”JØœ;�DØàœ;�DØ�DØàŒy�LÔ-Ò-Ð-°$´)Ð-à—’˜DœIÑ&Ô&Ð&Ð&à—’˜DœIÑ&Ô&Ð&à”;ˆDðC ñ !	ðD ˆr   c                 óh   — |                       ¦   «         D ]}|                     ¦   «         }|r|c S Œ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'   s      r   Úget_linear_subpatternzMinNode.get_linear_subpatternK   sJ   € ð  —’‘”ð 	ð 	ˆAØ—>’>Ñ#Ô#ˆDØð Ø���ðð	ð 	r   c              #   ól   K  — | j         D ]}|                     ¦   «         E d{V —† Œ| j         s| V — dS dS )z-Generator that returns the leaves of the treeN)r   r*   )r   Úchilds     r   r*   zMinNode.leaves`   s[   è è € à”]ð 	&ð 	&ˆEØ—|’|‘~”~Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØŒ}ð 	ØˆJˆJˆJˆJˆJð	ð 	r   )NN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r(   r,   r*   © r   r   r   r      so   € € € € € ðð ðð ð ð ð5ð 5ð 5ð(ð (ð (ðTð ð ð*ð ð ð ð r   r   Nc                 óÚ	  — d}| j         t          j        k    r| j        d         } | j         t          j        k    r t          | j        ¦  «        dk    rt          | j        d         |¦  «        }�nst          t          ¬¦  «        }| j        D ]L}| j         	                    |¦  «        dz  rŒ t          ||¦  «        }|�|j         
                    |¦  «         ŒM�n| j         t          j        k    r‹t          | j        ¦  «        dk    rVt          t          ¬¦  «        }| j        D ].}t          ||¦  «        }|r|j         
                    |¦  «         Œ/|j        sd}�n…t          | j        d         |¦  «        }�nh| j         t          j        k    �rRt          | j        d         t          j        ¦  «        r1| j        d         j        dk    rt          | j        d         |¦  «        S t          | j        d         t          j        ¦  «        r| j        d         j        dk    sIt          | j        ¦  «        dk    r3t%          | j        d         d¦  «        r| j        d         j        dk    rdS d	}d}d}d
}d}	d
}
| j        D ]j}|j         t          j        k    rd
}|}n1|j         t          j        k    rd	}|}	n|j         t          j        k    r|}t%          |d¦  «        r|j        dk    rd	}
Œk|
r6| 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.          ¬¦  «        }�nt%          t*          |j        ¦  «        r)t          t1          t*          |j        ¦  «        ¬¦  «        }n¾t          t1          t2          |j        ¦  «        ¬¦  «        }n•|j         t*          j        k    r[|j                             d¦  «        }|t8          v rt          t8          |         ¬¦  «        }nAt          t*          j        |¬¦  «        }n%|j         t          j        k    rt          ||¦  «        }|r7|	j        d         j        dk    rd}n|	j        d         j        dk    rnt:          ‚|r@|�>|j        dd…         D ].}t          ||¦  «        }|�|j         
                    |¦  «         Œ/|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   ÚsymsÚMatcherr   ÚAlternativesr    Úreduce_treer   r   Úindexr   ÚAlternativer"   ÚUnitÚ
isinstancer   ÚLeafr9   ÚhasattrÚDetailsÚRepeaterr$   r%   ÚTYPE_ANYÚgetattrÚpysymsÚSTRINGÚstripÚtokensÚNotImplementedErrorr   )r&   r   Únew_noder.   Úreducedr   Údetails_nodeÚalternatives_nodeÚhas_repeaterÚrepeater_nodeÚhas_variable_nameÚ	name_leafr   s                r   rC   rC   g   sè  € ð €Hà„y•D”LÒ Ð àŒ}˜QÔˆà„y•DÔ%Ò%Ð%åˆtŒ}ÑÔ Ò"Ð"å" 4¤=°Ô#3°VÑ<Ô<ˆH‰Hõ Õ$5Ð6Ñ6Ô6ˆHàœð 6ð 6�Ø”=×&Ò& uÑ-Ô-¨aÑ/ð ØÝ% e¨XÑ6Ô6�ØÐ&ØÔ%×,Ò,¨WÑ5Ô5Ð5øñ6ð 
Œ•dÔ&Ò	&Ð	&ÝˆtŒ}ÑÔ Ò!Ð!å¥JÐ/Ñ/Ô/ˆHØœð 6ð 6�Ý% e¨XÑ6Ô6�Øð 6ØÔ%×,Ò,¨WÑ5Ô5Ð5øØÔ$ð  à�ùõ # 4¤=°Ô#3°VÑ<Ô<ˆH‰Hà	Œ•d”iÒ	Ñ	Ý�t”} QÔ'­¬Ñ5Ô5ð 	9ØŒM˜!ÔÔ" cÒ)Ð)å˜tœ}¨QÔ/°Ñ8Ô8Ð8Ý˜œ aÔ(­&¬+Ñ6Ô6ð 	ØŒ}˜QÔÔ%¨Ò,Ð,å�D”MÑ"Ô" 1Ò$Ð$Ý�t”} QÔ'¨Ñ1Ô1ð %àŒ}˜QÔÔ%¨Ò,Ð,à�4àˆØˆØ ÐØˆØˆØ!Ðà”]ð 
	)ð 
	)ˆEØŒz�Tœ\Ò)Ð)Ø�Ø$��Ø”�tœ}Ò,Ð,Ø#�Ø %��Ø”�tÔ0Ò0Ð0Ø$)Ð!Ý�u˜gÑ&Ô&ð )¨5¬;¸#Ò+=Ð+=Ø$(Ð!øð ð 	)àœ aÔ(ˆIÝ�y 'Ñ*Ô*ð -¨y¬À#Ò/EÐ/Eà œM¨!Ô,�	øàœ aÔ(ˆIð Œ>�\Ô.Ò.Ð.àŒ %Ò'Ð'Ý"­Ð1Ñ1Ô1�‘å�<¨¬Ñ9Ô9ð NÝ&­GµLÀ)Ä/Ñ,RÔ,RÐSÑSÔS�H�Hå&­GµF¸I¼OÑ,LÔ,LÐMÑMÔM�H�HàŒ^�|Ô2Ò2Ð2ð ”?×(Ò(¨Ñ-Ô-ˆDØ•vˆ~ˆ~Ý"­¨t¬Ð5Ñ5Ô5��å"­Ô(9ÀÐEÑEÔE��ØŒ^�tÔ0Ò0Ð0Ý"Ð#4°fÑ=Ô=ˆHð ð 		*ØÔ% aÔ(Ô.°#Ò5Ð5à��ØÔ'¨Ô*Ô0°CÒ7Ð7àõ *Ð)ð ð 	6˜HÐ0Ø%Ô.¨q°¨tÔ4ð 6ð 6�å% e¨XÑ6Ô6�ØÐ&ØÔ%×,Ò,¨WÑ5Ô5Ð5øØð !Ø ˆŒØ€Or   c                 ó  ‡‡— t          | t          ¦  «        s| S t          | ¦  «        dk    r| d         S g }g }g d¢Šg }dŠ| D ]¡}t          t	          |d„ ¦  «        ¦  «        r�t          t	          |ˆfd„¦  «        ¦  «        r|                     |¦  «         ŒVt          t	          |ˆfd„¦  «        ¦  «        r|                     |¦  «         ŒŒ|                     |¦  «         Œ¢|r|} n	|r|} n|r|} t          | t          ¬¦  «        S )	z„Picks the most characteristic from a list of linear patterns
    Current order used is:
    names > common_names > common_chars
    r   r5   )ÚinÚforÚifÚnotÚNonez[]().,:c                 ó.   — t          | ¦  «        t          u S ©N)r   r   )Úxs    r   ú<lambda>z/get_characteristic_subpattern.<locals>.<lambda>ý   s   € ­d°1©g¬g½¨n€ r   c                 ó6   •— t          | t          ¦  «        o| ‰v S rb   ©rG   r   )rc   Úcommon_charss    €r   rd   z/get_characteristic_subpattern.<locals>.<lambda>ÿ   s   ø€ ¥j°µCÑ&8Ô&8Ð&N¸QÀ,Ð=N€ r   c                 ó6   •— t          | t          ¦  «        o| ‰v S rb   rf   )rc   Úcommon_namess    €r   rd   z/get_characteristic_subpattern.<locals>.<lambda>  s   ø€ ­
°1µcÑ(:Ô(:Ð(P¸qÀLÐ?P€ r   )Úkey)rG   Úlistr    r<   Úrec_testr   Úmax)ÚsubpatternsÚsubpatterns_with_namesÚsubpatterns_with_common_namesÚsubpatterns_with_common_charsÚ
subpatternrg   ri   s        @@r   r#   r#   ì   so  øø€ õ
 �k¥4Ñ(Ô(ð ØÐÝ
ˆ;ÑÔ˜ÒÐØ˜1Œ~Ðð  ÐØ$&Ð!Ø6Ð6Ð6€LØ$&Ð!Ø€LØ!ð 
:ð 
:ˆ
Ý�x˜
Ð$<Ð$<Ñ=Ô=Ñ>Ô>ð 		:Ý•8˜JØNÐNÐNÐNñPô Pñ Qô Qð :à-×4Ò4°ZÑ@Ô@Ð@Ð@Ý•X˜jØPÐPÐPÐPñRô Rñ Sô Sð :à-×4Ò4°ZÑ@Ô@Ð@Ð@ð '×-Ò-¨jÑ9Ô9Ð9øàð 4Ø,ˆˆØ	&ð 4Ø3ˆˆØ	&ð 4Ø3ˆåˆ{¥Ð$Ñ$Ô$Ð$r   c              #   ó”   K  — | D ]B}t          |t          t          f¦  «        rt          ||¦  «        E d{V —† Œ5 ||¦  «        V — ŒCdS )zPTests test_func on all items of sequence and items of included
    sub-iterablesN)rG   rk   r!   rl   )ÚsequenceÚ	test_funcrc   s      r   rl   rl     ss   è è € ð ð ð ˆÝ�a�$¥˜Ñ'Ô'ð 	Ý  9Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-à�)˜A‘,”,ÐÐÐÐð	ð r   rb   )r2   Ú r   Úpgen2r   r   Úpygramr   r   r@   rN   ÚopmaprQ   r$   rL   r   r"   Úobjectr   rC   r#   rl   r3   r   r   ú<module>r{      sè   ðØ 2Ð 2à Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à€Ø	€Ø	Œ€Ø€à€ØÐ Ø€
ðUð Uð Uð Uð Uˆfñ Uô Uð UðnBð Bð Bð BðJ#%ð #%ð #%ðJð ð ð ð r   