� {fc@s�dZdZddlZddlmZmZmZmZmZm Z ddl m Z ddl m Z de fd ��YZd �Zd efd ��YZiejd 6ejd6ejd6dd6Zd�Zd�Zd�ZdS(s�Pattern compiler. The grammar is taken from PatternGrammar.txt. The compiler compiles a pattern to a pytree.*Pattern instance. s#Guido van Rossum i����Ni(tdrivertliteralsttokenttokenizetparsetgrammar(tpytree(tpygramtPatternSyntaxErrorcBseZRS((t__name__t __module__(((s'/usr/lib64/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'/usr/lib64/python2.7/lib2to3/patcomp.pyttokenize_wrappers   tPatternCompilercBsAeZdd�Zeed�Zd�Zdd�Zd�ZRS(cCs�|dkr'tj|_tj|_n'tj|�|_tj|j�|_tj |_ tj |_ tj |jdt�|_dS(s^Initializer. Takes an optional alternative filename for the pattern grammar. tconvertN(tNoneRtpattern_grammarRtpattern_symbolstsymsRt load_grammartSymbolstpython_grammart pygrammartpython_symbolstpysymstDrivertpattern_convert(tselft grammar_file((s'/usr/lib64/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(RRt parse_tokensRt ParseErrorRtstrt compile_node(R*RR-t with_treeRtrootte((s'/usr/lib64/python2.7/lib2to3/patcomp.pytcompile_pattern7s cCs�|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|jj kr�|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�t| �d kst�|j| d�} }t| �d kr]|j| d�}q]n ts]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!tMatchertchildrent AlternativesR1tlenRtWildcardPatterntoptimizet Alternativet NegatedUnitt compile_basictNegatedPatterntUnittAssertionErrorRRtEQUALRtRepeatertSTARtHUGEtPLUStLBRACEtRBRACEtget_inttFalsetname(R*tnodetchtaltstatptunitstpatternRMtnodestrepeatR9tchildR6R7((s'/usr/lib64/python2.7/lib2to3/patcomp.pyR1Csh21 %   (  +         '  cCs�t|�dkst�|d}|jtjkrbttj|j��}t j t |�|�S|jtj krp|j}|j �r�|tkr�td|��n|dr�td��nt j t|�S|dkr�d}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 dd d�Sts�t|��dS( NiisInvalid token: %rsCan't have details for tokentanyt_sInvalid symbol: %rt(t[R6R7(R;RCRRtSTRINGtunicodeRt evalStringRRt LeafPatternt_type_of_literaltNAMEtisuppert TOKEN_MAPRRt startswithtgetattrR'R1R9t NodePatternR<RL(R*RURVRNRRtcontentt subpattern((s'/usr/lib64/python2.7/lib2to3/patcomp.pyR@�s<          cCs%|jtjkst�t|j�S(N(RRtNUMBERRCtintR(R*RN((s'/usr/lib64/python2.7/lib2to3/patcomp.pyRK�sN( R R RR,RLR5R1R@RK(((s'/usr/lib64/python2.7/lib2to3/patcomp.pyR&s   G #RaR\RitTOKENcCs9|dj�rtjS|tjkr1tj|SdSdS(Ni(tisalphaRRaRtopmapR(R((s'/usr/lib64/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_infoRRRnR9((s'/usr/lib64/python2.7/lib2to3/patcomp.pyR)�scCst�j|�S(N(RR5(RT((s'/usr/lib64/python2.7/lib2to3/patcomp.pyR5�s(t__doc__t __author__Rtpgen2RRRRRRtRRt ExceptionRRtobjectRRaR\RiRRcR`R)R5(((s'/usr/lib64/python2.7/lib2to3/patcomp.pyt s . �