Ë
    #´˜jÙ&  ã                   óŽ   — 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y
)z0Utility functions used by the btm_matcher moduleé   )Úpytree)ÚgrammarÚtoken)Úpattern_symbolsÚpython_symbolséÿÿÿÿéþÿÿÿéýÿÿÿc                   ó0   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zy)	ÚMinNodez‰This class serves as an intermediate representation of the
    pattern tree during the conversion to sets of leaf-to-root
    subpatternsNc                 óf   — || _         || _        g | _        d| _        d | _        g | _        g | _        y )NF)ÚtypeÚnameÚchildrenÚleafÚparentÚalternativesÚgroup)Úselfr   r   s      ú#lib/python3.12/lib2to3/btm_utils.pyÚ__init__zMinNode.__init__   s4   € ØˆŒ	ØˆŒ	ØˆŒØˆŒ	ØˆŒØˆÔØˆ�
ó    c                 ó^   — t        | j                  «      dz   t        | j                  «      z   S )NÚ )Ústrr   r   )r   s    r   Ú__repr__zMinNode.__repr__   s"   € Ü�4—9‘9‹~ Ñ#¤c¨$¯)©)£nÑ4Ð4r   c                 óD  — | }g }|�r˜|j                   t        k(  r�|j                  j                  |«       t	        |j                  «      t	        |j
                  «      k(  r*t        |j                  «      g}g |_        |j                  }Œ†|j                  }d}	 |S |j                   t        k(  r�|j                  j                  |«       t	        |j                  «      t	        |j
                  «      k(  r*t        |j                  «      }g |_	        |j                  }�Œ|j                  }d}	 |S |j                   t        j                  k(  r(|j                  r|j                  |j                  «       n|j                  |j                   «       |j                  }|r�Œ˜|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!   sP  € ð ˆØˆÚØ�y‰yÔ-Ò-Ø×!Ñ!×(Ñ(¨Ô.Ü�t×(Ñ(Ó)¬S°·±Ó-?Ò?ä! $×"3Ñ"3Ó4Ð5�DØ(*�DÔ%ØŸ;™;�DØàŸ;™;�DØ�DØð, ˆð) �y‰yœJÒ&Ø—
‘
×!Ñ! $Ô'ä�t—z‘z“?¤c¨$¯-©-Ó&8Ò8Ü8¸¿¹ÓD�DØ!#�D”JØŸ;™;�DÙàŸ;™;�DØ�DØð ˆð �y‰yœL×-Ñ-Ò-°$·)²)à—‘˜DŸI™IÕ&à—‘˜DŸI™IÔ&à—;‘;ˆDóC ðD ˆr   c                 óZ   — | j                  «       D ]  }|j                  «       }|sŒ|c S  y)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   s(   € ð  —‘–ˆAØ—>‘>Ó#ˆDÚØ’ñ r   c              #   ó„   K  — | j                   D ]  }|j                  «       E d{  –—†  Œ | j                   s| –— yy7 Œ­w)z-Generator that returns the leaves of the treeN)r   r*   )r   Úchilds     r   r*   zMinNode.leaves`   s9   è ø€ à—]”]ˆEØ—|‘|“~×%Ñ%ð #à�}Š}Ø‹Jð ð &ús   ‚#A ¥>¦A )NN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r(   r,   r*   © r   r   r   r      s!   „ ñóò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   |«      }�nÍt        t        ¬«      }| j                  D ]K  }| j                  j                  |«      dz  rŒ"t        ||«      }|€Œ1|j                  j                  |«       ŒM �na| j                   t        j                  k(  r�t        | j                  «      dkD  r\t        t        ¬«      }| j                  D ],  }t        ||«      }|sŒ|j                  j                  |«       Œ. |j                  �sÔd}�nÐt        | j                  d   |«      }�nµ| j                   t        j                  k(  �r—t        | j                  d   t        j                   «      r5| j                  d   j"                  dk(  rt        | j                  d   |«      S t        | j                  d   t        j                   «      r| j                  d   j"                  dk(  sMt        | j                  «      dkD  r6t%        | j                  d   d«      r| j                  d   j"                  dk(  ryd	}d}d}d
}d}	d
}
| j                  D ]„  }|j                   t        j&                  k(  rd
}|}nA|j                   t        j(                  k(  rd	}|}	n|j                   t        j                  k(  r|}t%        |d«      sŒs|j"                  dk(  sŒƒd	}
Œ† |
r:| 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*        j4                  k(  rS|j"                  j7                  d«      }|t8        v rt        t8        |   ¬«      }nEt        t*        j,                  |¬«      }n)|j                   t        j                  k(  rt        ||«      }|rB|	j                  d   j"                  dk(  rd}n#|	j                  d   j"                  dk(  rnt:        ‚|r@|�>|j                  dd D ],  }t        ||«      }|€Œ|j                  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   sI  € ð €Hà‡y�y”D—L‘LÒ à�}‰}˜QÑˆà‡y�y”D×%Ñ%Ò%äˆt�}‰}Ó Ò"ä" 4§=¡=°Ñ#3°VÓ<ŠHô Ô$5Ô6ˆHàŸœ�Ø—=‘=×&Ñ& uÓ-¨aÒ/ØÜ% e¨XÓ6�ØÑ&Ø×%Ñ%×,Ñ,¨WÕ5ò 'ð 
�‰”d×&Ñ&Ò	&Üˆt�}‰}Ó Ò!ä¤JÔ/ˆHØŸœ�Ü% e¨XÓ6�ÚØ×%Ñ%×,Ñ,¨WÕ5ð 'ð ×$Ó$à’ô # 4§=¡=°Ñ#3°VÓ<ŠHà	�‰”d—i‘iÓ	Ü�t—}‘} QÑ'¬¯©Ô5Ø�M‰M˜!Ñ×"Ñ" cÒ)ä˜tŸ}™}¨QÑ/°Ó8Ð8Ü˜Ÿ™ aÑ(¬&¯+©+Ô6Ø�}‰}˜QÑ×%Ñ%¨Ò,ä�D—M‘MÓ" 1Ò$Ü�t—}‘} QÑ'¨Ô1Ø�}‰}˜QÑ×%Ñ%¨Ò,ààˆØˆØ ÐØˆØˆØ!Ðà—]”]ˆEØ�z‰zœTŸ\™\Ò)Ø�Ø$‘Ø—‘œtŸ}™}Ò,Ø#�Ø %‘Ø—‘œt×0Ñ0Ò0Ø$)Ð!Ü�u˜gÕ&¨5¯;©;¸#Ó+=Ø$(Ñ!ð #ñ àŸ™ aÑ(ˆIÜ�y 'Ô*¨y¯©À#Ò/Eà ŸM™M¨!Ñ,‘	àŸ™ aÑ(ˆIð �>‰>œ\×.Ñ.Ò.à�‰ %Ò'Ü"¬Ô1‘äœ<¨¯©Ô9Ü&¬G´LÀ)Ç/Á/Ó,RÔS‘Hä&¬G´F¸I¿O¹OÓ,LÔM‘Hà�^‰^œ|×2Ñ2Ò2ð —?‘?×(Ñ(¨Ó-ˆDØ”v‰~Ü"¬¨t©Ô5‘ä"¬×(9Ñ(9ÀÔE‘Ø�^‰^œt×0Ñ0Ò0Ü"Ð#4°fÓ=ˆHñ Ø×%Ñ% aÑ(×.Ñ.°#Ò5à‘Ø×'Ñ'¨Ñ*×0Ñ0°CÒ7àô *Ð)ñ ˜HÐ0Ø%×.Ñ.¨q°Ó4�ä% e¨XÓ6�ØÑ&Ø×%Ñ%×,Ñ,¨WÕ5ð	 5ñ
 Ø ˆŒØ€Or   c                 ó¬  ‡‡— t        | t        «      s| S t        | «      dk(  r| d   S g }g }g d¢Šg }dŠ| D ]~  }t        t	        |d„ «      «      sŒt        t	        |ˆfd„«      «      r|j                  |«       ŒDt        t	        |ˆfd„«      «      r|j                  |«       Œn|j                  |«       Œ€ |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¼©nr   c                 ó0   •— t        | t        «      xr | ‰v S rb   ©rG   r   )rc   Úcommon_charss    €r   rd   z/get_characteristic_subpattern.<locals>.<lambda>ÿ   s   ø€ ¤j°´CÓ&8Ò&N¸QÀ,Ð=NÐ&Nr   c                 ó0   •— t        | t        «      xr | ‰v S rb   rf   )rc   Úcommon_namess    €r   rd   z/get_characteristic_subpattern.<locals>.<lambda>  s   ø€ ¬
°1´cÓ(:Ò(P¸qÀLÐ?PÐ(Pr   )Ú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#   ì   sã   ù€ ô
 �k¤4Ô(ØÐÜ
ˆ;Ó˜ÒØ˜1‰~Ðð  ÐØ$&Ð!Ú6€LØ$&Ð!Ø€LÛ!ˆ
ÜŒx˜
Ñ$<Ó=Õ>Ü”8˜JÛNóPô Qà-×4Ñ4°ZÕ@Ü”X˜jÛPóRô Sà-×4Ñ4°ZÕ@ð '×-Ñ-¨jÕ9ð "ñ Ø,‰Ù	&Ø3‰Ù	&Ø3ˆäˆ{¤Ô$Ð$r   c              #   óˆ   K  — | D ]7  }t        |t        t        f«      rt        ||«      E d{  –—†  Œ. ||«      –— Œ9 y7 Œ­w)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     s=   è ø€ ó ˆÜ�aœ$¤˜Ô'Ü  9Ó-×-Ñ-á˜A“,Óñ	 à-ús   ‚+A­A ®Arb   )r2   Ú r   Úpgen2r   r   Úpygramr   r   r@   rN   ÚopmaprQ   r$   rL   r   r"   Úobjectr   rC   r#   rl   r3   r   r   Ú<module>r{      sZ   ðÙ 2å ß !ß 3à€Ø	€Ø	�‰€Ø€à€ØÐ Ø€
ôUˆfô UónBòJ#%óJr   