g&dZddlmZddlmZmZddlmZmZeZ eZ ejZ eZ dZdZdZGdd eZdd Zd Zd Zy )z0Utility functions used by the btm_matcher module)pytree)grammartoken)pattern_symbolspython_symbolsc0eZdZdZddZdZdZdZdZy) MinNodezThis class serves as an intermediate representation of the pattern tree during the conversion to sets of leaf-to-root subpatternsNcf||_||_g|_d|_d|_g|_g|_y)NF)typenamechildrenleafparent alternativesgroup)selfrrs 8/opt/alt/python312/lib64/python3.12/lib2to3/btm_utils.py__init__zMinNode.__init__s4      c^t|jdzt|jzS)N )strrr)rs r__repr__zMinNode.__repr__s"499~#c$))n44rcD|}g}|r|jtk(r|jj|t |jt |j k(r*t |jg}g|_|j}|j}d} |S|jtk(r|jj|t |jt |j k(r*t|j}g|_ |j}|j}d} |S|jtjk(r(|jr|j|jn|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)rTYPE_ALTERNATIVESrappendlenrtupler TYPE_GROUPrget_characteristic_subpattern token_labelsNAMEr)rnodesubps r leaf_to_rootzMinNode.leaf_to_root!sPyy--!!((.t(()S-??!$"3"345D(*D%;;D;;DD, )yyJ& !!$'tzz?c$--&888DD!#DJ;;D;;DD yyL---$)) DII& DII&;;DCD rcZ|jD]}|j}|s|cSy)aDrives 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()rlr's rget_linear_subpatternzMinNode.get_linear_subpatternKs( A>>#D rc#K|jD]}|jEd{|js|yy7w)z-Generator that returns the leaves of the treeN)rr*)rchilds rr*zMinNode.leaves`s9]]E||~ % %#}}J &s#A>A)NN) __name__ __module__ __qualname____doc__rrr(r,r*rrr r s!5(T*rr Nc d}|jtjk(r|jd}|jtjk(rt |jdkrt |jd|}ntt}|jD]K}|jj|dzr"t ||}|1|jj|Mna|jtjk(rt |jdkDr\tt}|jD],}t ||}|s|jj|.|jsd}nt |jd|}n|jtjk(rt|jdtj r5|jdj"dk(rt |jd|St|jdtj r|jdj"dk(sMt |jdkDr6t%|jddr|jdj"dk(ryd }d}d}d }d} d } |jD]}|jtj&k(rd }|}nA|jtj(k(rd }|} n|jtjk(r|}t%|dss|j"d k(sd } | r:|jd} t%| dr.| j"dk(r|jd } n|jd} | jt*j,k(r| j"d k(rtt.}nt%t*| j"r%tt1t*| j"}ntt1t2| j"}n| jt*j4k(rS| j"j7d} | t8vrtt8| }nEtt*j,| }n)| jtjk(r t ||}|rB| jdj"dk(rd}n#| jdj"dk(rnt:|r@|>|jddD],}t ||}||jj|.|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)rr([valueTF=any')rr*+r)rsymsMatcherr Alternativesr reduce_treer rindexr Alternativer"Unit isinstancerLeafr9hasattrDetailsRepeaterr$r%TYPE_ANYgetattrpysymsSTRINGstriptokensNotImplementedErrorr) r&rnew_noder.reducedr details_nodealternatives_node has_repeater repeater_nodehas_variable_name name_leafrs rrCrCgsIH yyDLL }}Q yyD%%% t}}  ""4==#3V>\.. .%'"1<9&GL)//,RSH&GFIOO,LMH ^^|22 2??((-Dv~"t 5" (9(9E ^^t00 0"#4f=H %%a(..#5''*00C7*) H0%..q4%eX6&%%,,W5 5   Orct|ts|St|dk(r|dSg}g}gdg}d|D]~}tt |dstt |fdr|j |Dtt |fdr|j |n|j ||r|}n |r|}n|r|}t |tS) zPicks the most characteristic from a list of linear patterns Current order used is: names > common_names > common_chars rr5)inforifnotNonez[]().,:c$t|tuSN)rr)xs rz/get_characteristic_subpattern..s d1gnrc0t|txr|vSrbrGr)rc common_charss rrdz/get_characteristic_subpattern..sjC&8&NQ,=N&Nrc0t|txr|vSrbrf)rc common_namess rrdz/get_characteristic_subpattern..s 1c(:(PqL?P(Pr)key)rGlistr r<rec_testrmax) subpatternssubpatterns_with_namessubpatterns_with_common_namessubpatterns_with_common_chars subpatternrgris @@rr#r#s k4 ( ;1~ $&!6L$&!L! x $<= >8JNPQ-44Z@XjPRS-44Z@'--j9", &3 &3 { $$rc#K|D]7}t|ttfrt||Ed{.||9y7w)zPTests test_func on all items of sequence and items of included sub-iterablesN)rGrkr!rl)sequence test_funcrcs rrlrls= a$ '9- - -A,   -s+AAArb)r2rpgen2rrpygramrrr@rNopmaprQr$rLrr"objectr rCr#rlr3rrr{sZ2!3     UfUnBJ#%Jr