��Qc@s�dZddlmZddlmZmZddlmZmZeZ eZ
ejZeZ
dZdZdZdefd ��YZd
d
�Zd�Zd�Zd
S(s0Utility functions used by the btm_matcher modulei(tpytree(tgrammarttoken(tpattern_symbolstpython_symbolsi�i�i�tMinNodecBsAeZdZddd�Zd�Zd�Zd�Zd�ZRS(s�This class serves as an intermediate representation of the
pattern tree during the conversion to sets of leaf-to-root
subpatternscCsC||_||_g|_t|_d|_g|_g|_dS(N( ttypetnametchildrentFalsetleaftNonetparenttalternativestgroup(tselfRR((s'/sys/lib/python2.7/lib2to3/btm_utils.pyt__init__s cCst|j�dt|j�S(Nt (tstrRR(R((s'/sys/lib/python2.7/lib2to3/btm_utils.pyt__repr__scCsU|}g}xB|rP|jtkr�|jj|�t|j�t|j�kr|t|j�g}g|_|j}qq�|j}d}Pn|jt kr|j
j|�t|j
�t|j�kr�|j
�}g|_
|j}qq|j}d}Pn|jtj
kr4|jr4|j|j�n|j|j�|j}qW|S(s�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(RtTYPE_ALTERNATIVESR
tappendtlenRttupleRRt
TYPE_GROUPRtget_characteristic_subpatternttoken_labelstNAMER(Rtnodetsubp((s'/sys/lib/python2.7/lib2to3/btm_utils.pytleaf_to_root!s8
cCs1x*|j�D]}|j�}|r
|Sq
WdS(s�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(tleavesR(RtlR((s'/sys/lib/python2.7/lib2to3/btm_utils.pytget_linear_subpatternKsccsEx-|jD]"}x|j�D]}|VqWq
W|jsA|VndS(s-Generator that returns the leaves of the treeN(RR(Rtchildtx((s'/sys/lib/python2.7/lib2to3/btm_utils.pyR`s
N( t__name__t
__module__t__doc__RRRRR!R(((s'/sys/lib/python2.7/lib2to3/btm_utils.pyRs * c
Csd}|jtjkr(|jd}n|jtjkr�t|j�dkrht|jd|�}q�dt �}x�|jD]P}|jj
|�dr�q�nt||�}|dk r�|jj|�q�q�Wn$|jtjkrxt|j�dkr_tdt
�}x9|jD].}t||�}|r|jj|�qqW|jsud}quq�|jd|�}n�|jtjkr�|jdtj�r�|jdjdkr�t|jd|�St|jdtj�r�jdjdks=t|j�dkrAt|jdd�rA|jdjdkrAdSt}d}d}t}d} t}
x�|jD]�}|jtjkr�t}|}n<|jtjkr�t}|} n|jtjkr�|}nt|d�ro|jdkrot}
qoqoW|
rA|jd}t|d�rN|jdkrN|jd }qNn
|jd}|jtjkr�|jd
kr�tdt�}qTtt|j�r�tdtt|j��}qTtdtt|j��}n�|jtjkr0|jjd�}|tkrtdt|�}qTtdtjd|�}n$|jtjkrTt||�}n|r�| jdjd
kryd}q�| jdjdkr�q�t �n|r�dk r�|jdd!D]4}t||�}|dk r�|jj|�q�q�Wq�|r||_!n|S(s�
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*).
iiRit(t[tvaluet=itanyt'Rt*t+i�N("RRtsymstMatcherRtAlternativesRtreduce_treeRRtindexRtAlternativeRtUnitt
isinstanceRtLeafR)thasattrtTrueR tDetailstRepeaterRRtTYPE_ANYtgetattrtpysymstSTRINGtstripttokenstNotImplementedErrorR(
RRtnew_nodeR"treducedR
tdetails_nodetalternatives_nodethas_repeatert
repeater_nodethas_variable_namet name_leafR((s'/sys/lib/python2.7/lib2to3/btm_utils.pyR2hs�
cs,t|t�s|St|�dkr-|dSg}g}dddddg�g}d�x�|D]�}tt|d ���ratt|�fd
���r�|j|�q�t|�fd���r�|j|�q�j|�qaqaW|r�}n|r
|}n|r|}nt|dt�S(
s�Picks the most characteristic from a list of linear patterns
Current order used is:
names > common_names > common_chars
iitintfortiftnotRs[]().,:cSst|�tkS(N(RR(R#((s'/sys/lib/python2.7/lib2to3/btm_utils.pyt<lambda>�scst|t�o|�kS(N(R6R(R#(tcommon_chars(s'/sys/lib/python2.7/lib2to3/btm_utils.pyROscst|t�o|�kS(N(R6R(R#(tcommon_names(s'/sys/lib/python2.7/lib2to3/btm_utils.pyROstkey(R6tlistRR+trec_testRtmax(tsubpatternstsubpatterns_with_namestsubpatterns_with_common_namestsubpatterns_with_common_charst
subpattern((RPRQs'/sys/lib/python2.7/lib2to3/btm_utils.pyR�s2
ccsWxP|D]H}t|ttf�rDx*t||�D]}|Vq2Wq||�VqWdS(sPTests test_func on all items of sequence and items of included
sub-iterablesN(R6RSRRT(tsequencet test_funcR#ty((s'/sys/lib/python2.7/lib2to3/btm_utils.pyRTs
N(R&tRtpgen2RRtpygramRRR/R>topmapRARR<RRtobjectRRR2RRT(((s'/sys/lib/python2.7/lib2to3/btm_utils.pyt<module>s X�%
|