\d&dZddlmZddlmZmZddlmZmZeZ eZ ej Z eZ dZdZdZGdd eZdd Zd Zd Zd S)z0Utility functions used by the btm_matcher module)pytree)grammartoken)pattern_symbolspython_symbolsc2eZdZdZddZdZdZdZdZdS) MinNodezThis class serves as an intermediate representation of the pattern tree during the conversion to sets of leaf-to-root subpatternsNch||_||_g|_d|_d|_g|_g|_dS)NF)typenamechildrenleafparent alternativesgroup)selfrrs "..\python\lib\lib2to3\btm_utils.py__init__zMinNode.__init__s8      cZt|jdzt|jzS)N )strrr)rs r__repr__zMinNode.__repr__s"49~~#c$)nn44rc|}g}|r^|jtkrr|j|t |jt |jkr$t |jg}g|_|j}{|j}d}n|jtkrq|j |t |j t |jkr#t|j }g|_ |j}|j}d}n[|jtj kr"|j r||j n||j|j}|^|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!sZ! y---!((...t())S-?-???!$"3445D(*D%;D;DDyJ&& !!$'''tz??c$-&8&8888DDD!#DJ;D;DDyL---$)- DI&&&& DI&&&;DC! D rch|D]}|}|r|cSdS)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_subpatternKsJ   A>>##D     rc#lK|jD]}|Ed{V|js|VdSdS)z-Generator that returns the leaves of the treeN)rr*)rchilds rr*zMinNode.leaves`s[] & &E||~~ % % % % % % % %} JJJJJ  r)NN) __name__ __module__ __qualname____doc__rrr(r,r*rrr r so555(((T*rr Nc d}|jtjkr |jd}|jtjkrt |jdkrt |jd|}nstt}|jD]L}|j |dzr t ||}||j |Mn|jtj krt |jdkrVtt}|jD].}t ||}|r|j |/|jsd}nt |jd|}nh|jtj krRt|jdtjr1|jdjdkrt |jd|St|jdtjr|jdjdksIt |jdkr3t%|jddr|jdjdkrdSd }d}d}d }d} d } |jD]j}|jtjkrd }|}n1|jtjkrd }|} n|jtjkr|}t%|dr |jd krd } k| r6|jd} t%| dr| jdkr |jd } n |jd} | jt*jkr| jd krtt.}nt%t*| jr)tt1t*| j}ntt1t2| j}n| jt*jkr[| jd} | t8vrtt8| }nAtt*j| }n%| jtjkrt ||}|r7| jdjdkrd}n| jdjdkrnt:|r@|>|jddD].}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)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 rrCrCgsH yDL  }Q yD%%% t}   " ""4=#3V<\. . .%''"111<99N&GL)/,R,RSSSHH&GFIO,L,LMMMHH ^|2 2 2?((--Dv~~"t 555" (9EEE ^t0 0 0"#4f==H  *%a(.#55'*0C77*)  6H0%.qt4 6 6%eX66&%,,W555!  Orct|ts|St|dkr|dSg}g}gdg}d|D]}tt |drtt |fdr||Vtt |fdr|||||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..sd1ggnrc6t|to|vSrbrGr)rc common_charss rrdz/get_characteristic_subpattern..sjC&8&8&NQ,=Nrc6t|to|vSrbrf)rc common_namess rrdz/get_characteristic_subpattern..s 1c(:(:(PqL?Pr)key)rGlistr r<rec_testrmax) subpatternssubpatterns_with_namessubpatterns_with_common_namessubpatterns_with_common_chars subpatternrgris @@rr#r#so k4 ( ( ;1~ $&!666L$&!L! : : x $<$<== > > :8JNNNNPPQQ :-44Z@@@@XjPPPPRRSS :-44Z@@@@'--j9994, &43 &43 { $ $ $$rc#K|D]B}t|ttfrt||Ed{V5||VCdS)zPTests test_func on all items of sequence and items of included sub-iterablesN)rGrkr!rl)sequence test_funcrcs rrlrlss a$ ' ' 9-- - - - - - - - -)A,,     rrb)r2rpgen2rrpygramrrr@rNopmaprQr$rLrr"objectr rCr#rlr3rrr{s22!!!!!!!!33333333     UUUUUfUUUnBBBBJ#%#%#%Jr