��Qc@sdZdZddlZddlZddlmZmZmZmZm Z m
Z
ddlmZddlm
Z
ejjejje�d�Zd efd
��YZd�Zdefd
��YZiejd6ejd6ejd6dd6Zd�Zd�Zd�ZdS(s�Pattern compiler.
The grammer is taken from PatternGrammar.txt.
The compiler compiles a pattern to a pytree.*Pattern instance.
s#Guido van Rossum <[email protected]>i�Ni(tdrivertliteralsttokenttokenizetparsetgrammar(tpytree(tpygramsPatternGrammar.txttPatternSyntaxErrorcBseZRS((t__name__t
__module__(((s%/sys/lib/python2.7/lib2to3/patcomp.pyRsc cswttjtjtjf�}tjtj|�j�}x7|D]/}|\}}}}}||kr@|Vq@q@WdS(s6Tokenizes a string suppressing significant whitespace.N( tsetRtNEWLINEtINDENTtDEDENTRtgenerate_tokenstStringIOtreadline( tinputtskipttokenst quintuplettypetvaluetstarttendt line_text((s%/sys/lib/python2.7/lib2to3/patcomp.pyttokenize_wrapper!s
tPatternCompilercBsAeZed�Zeed�Zd�Zdd�Zd�Z RS(cCs^tj|�|_tj|j�|_tj|_tj|_ tj
|jdt�|_dS(s^Initializer.
Takes an optional alternative filename for the pattern grammar.
tconvertN(Rtload_grammarRRtSymbolstsymstpython_grammart pygrammartpython_symbolstpysymstDrivertpattern_convert(tselftgrammar_file((s%/sys/lib/python2.7/lib2to3/patcomp.pyt__init__-s
cCs}t|�}y|jj|d|�}Wn(tjk
rR}tt|���nX|rl|j|�|fS|j|�SdS(s=Compiles a pattern string to a nested pytree.*Pattern object.tdebugN(RRtparse_tokensRt
ParseErrorRtstrtcompile_node(R'RR*t with_treeRtrootte((s%/sys/lib/python2.7/lib2to3/patcomp.pytcompile_pattern8sc Cs�|j|jjkr%|jd}n|j|jjkr�g|jddd�D]}|j|�^qQ}t|�dkr�|dStjg|D]}|g^q�dddd�}|j �S|j|jj
kr=g|jD]}|j|�^q�t|�dkr|dStj|gdddd�}|j �S|j|jjkr�|j|jd�}tj
|�}|j �S|j|jjks�t�d}|j} t| �dkr� djtjkr� dj}| d} nd}
t| �dkr5| dj|jjkr5| d}
| d } n|j| |
�}|
dk r�|
j|jjksnt�|
j}|d}|jtjkr�d}
tj}n�|jtjkr�d}
tj}n�|jtjkrQ|djtjks��t|�d
kst�|j|d�}
}t|�d kr]|j|d�}q]nts]t�|
dksu|dkr�|j �}tj|ggd|
d|�}q�n|dk r�||_n|j �S(sXCompiles a node, recursively.
This is one big switch on the node type.
iNiitmintmaxii�i(ii(RR tMatchertchildrentAlternativesR.tlenRtWildcardPatterntoptimizetAlternativetNegatedUnitt
compile_basictNegatedPatterntUnittAssertionErrortNoneRtEQUALRtRepeatertSTARtHUGEtPLUStLBRACEtRBRACEtget_inttFalsetname(R'tnodetchtaltstatptunitstpatternRKtnodestrepeatR6tchildR3R4((s%/sys/lib/python2.7/lib2to3/patcomp.pyR.Dsh21
%
(
+
'cCs�t|�dkst�|d}|jtjkrbttj|j��}t j
t|�|�S|jtjkrp|j}|j
�r�|tkr�td|��n|dr�td��nt j
t|�S|dkr�}nF|jd�s-t|j|d�}|dkr-td|��q-n|drW|j|djd�g}nd}t j||�Sns|jdkr�|j|d�S|jd kr�dks�t�|j|d�}t j|ggd
ddd�Sts�|��dS(NiisInvalid token: %rsCan't have details for tokentanyt_sInvalid symbol: %rt(t[R3R4(R8R@RRtSTRINGtunicodeRt
evalStringRRtLeafPatternt_type_of_literaltNAMEtisuppert TOKEN_MAPRRAt
startswithtgetattrR$R.R6tNodePatternR9RJ(R'RSRTRLRRtcontentt
subpattern((s%/sys/lib/python2.7/lib2to3/patcomp.pyR=�s<
cCs%|jtjkst�t|j�S(N(RRtNUMBERR@tintR(R'RL((s%/sys/lib/python2.7/lib2to3/patcomp.pyRI�sN(
R R
t_PATTERN_GRAMMAR_FILER)RJR2R.RAR=RI(((s%/sys/lib/python2.7/lib2to3/patcomp.pyR+s
G#R_RZRgtTOKENcCs9|dj�rtjS|tjkr1tj|SdSdS(Ni(tisalphaRR_RtopmapRA(R((s%/sys/lib/python2.7/lib2to3/patcomp.pyR^�s
cCsW|\}}}}|s'||jkr=tj||d|�Stj||d|�SdS(s9Converts raw node information to a Node or Leaf instance.tcontextN(t
number2symbolRtNodetLeaf(Rt
raw_node_infoRRRmR6((s%/sys/lib/python2.7/lib2to3/patcomp.pyR&�scCst�j|�S(N(RR2(RR((s%/sys/lib/python2.7/lib2to3/patcomp.pyR2�s( t__doc__t
__author__tosRtpgen2RRRRRRtRRtpathtjointdirnamet__file__Rit ExceptionRRtobjectRR_RZRgRARaR^R&R2(((s%/sys/lib/python2.7/lib2to3/patcomp.pyt<module> s$.
�
|