
    daf&                         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_symbolsc                   0    e Zd ZdZddZd Zd Zd Zd Zy)	MinNodezThis 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      ,/root/Python-3.12.4/Lib/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"    499~#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 )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subps      r   leaf_to_rootzMinNode.leaf_to_root!   sP    yy--!!((.t(()S-??!$"3"345D(*D%;;D;;DD, ) yyJ&

!!$'tzz?c$--&888DD!#DJ;;D;;DD  yyL---$))DII&DII&;;DC 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`   s>     ]] 	&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(  rt        | j                        dk  rt        | j                  d   |      }nt        t              }| j                  D ]K  }| j                  j                  |      dz  r"t        ||      }|1|j                  j                  |       M na| j                   t        j                  k(  rt        | j                        dkD  r\t        t              }| j                  D ],  }t        ||      }|s|j                  j                  |       . |j                  sd}nt        | j                  d   |      }n| j                   t        j                  k(  rt        | 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.              }nt%        t*        |j"                        r%t        t1        t*        |j"                              }nt        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   s]    HyyDLL }}QyyD%%%t}}""4==#3V<H $56H 6==&&u-a/%eX6&%%,,W56 
d&&	&t}}!J/H 6%eX6%%,,W56 $$ #4==#3V<H	dii	t}}Q'5MM!""c)t}}Q/88a(&++6}}Q%%,DMM"1$t}}Q'1}}Q%%, !]] 
	)EzzT\\)$t}},# %t000$)!ug&5;;#+=$(!
	) a(Iy'*y#/E MM!,	a(I >>\...%'"1<9&GL)//,RSH&GFIOO,LMH^^|222 ??((-Dv~"t5"(9(9E^^t000"#4f=H %%a(..#5''*00C7 *) H0%..q4 6%eX6&%%,,W5	6
  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 )	zPicks 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    d1gn r   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&NQ,=N r   c                 0    t        | t              xr | v S rb   rf   )rc   common_namess    r   rd   z/get_characteristic_subpattern.<locals>.<lambda>  s    
1c(:(PqL?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#      s    
 k4(
;1~  $&!6L$&!L! 
:
x
$<=>8JNP Q-44Z@XjPR S-44Z@ '--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     sB       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   