ž zyMa£c@sdZdZddlZddlZddlmZmZmZmZm Z m Z ddl m Z ddl m Z ejjejjeƒdƒZGd d „d eƒZd d „ZGd d„deƒZiejd6ejd6ejd6dd6Zdd„Zdd„Zdd„ZdS(uPattern compiler. The grammer is taken from PatternGrammar.txt. The compiler compiles a pattern to a pytree.*Pattern instance. u#Guido van Rossum iNi(udriveruliteralsutokenutokenizeuparseugrammar(upytree(upygramuPatternGrammar.txtcBs|EeZdZdS(uPatternSyntaxErrorN(u__name__u __module__u __qualname__(u __locals__((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyuPatternSyntaxErrorsuPatternSyntaxErrorc cswttjtjtjfƒ}tjtj|ƒj ƒ}x7|D]/}|\}}}}}||kr@|Vq@q@WdS(u6Tokenizes a string suppressing significant whitespace.N( usetutokenuNEWLINEuINDENTuDEDENTutokenizeugenerate_tokensuiouStringIOureadline( uinputuskiputokensu quintupleutypeuvalueustartuendu line_text((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyutokenize_wrapper!s   utokenize_wrappercBs\|EeZdZedd„Zd d dd„Zdd„Zd dd„Z d d „Z d S( uPatternCompilercCs^tj|ƒ|_tj|jƒ|_tj|_tj|_ tj |jdt ƒ|_dS(u^Initializer. Takes an optional alternative filename for the pattern grammar. uconvertN( udriveru load_grammarugrammarupygramuSymbolsusymsupython_grammaru pygrammarupython_symbolsupysymsuDriverupattern_convert(uselfu grammar_file((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyu__init__-s   uPatternCompiler.__init__cCst|ƒ}y|jj|d|ƒ}Wn:tjk rd}ztt|ƒƒ‚WYdd}~XnX|r~|j|ƒ|fS|j|ƒSdS(u=Compiles a pattern string to a nested pytree.*Pattern object.udebugN(utokenize_wrapperudriveru parse_tokensuparseu ParseErroruPatternSyntaxErrorustru compile_node(uselfuinputudebugu with_treeutokensurootue((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyucompile_pattern8s %uPatternCompiler.compile_patternc sK|jˆjjkr%|jd}n|jˆjjkr¯‡fdd†|jddd…Dƒ}t|ƒdkr}|dStjdd„|Dƒddd dƒ}|jƒS|jˆjj kr"‡fd d†|jDƒ}t|ƒdkrú|dStj|gddd dƒ}|jƒS|jˆjj krlˆj |jdd…ƒ}tj |ƒ}|jƒSd}|j}t|ƒd krÃ|djtjkrÃ|dj}|dd…}nd}t|ƒdkr|d jˆjjkr|d}|dd…}nˆj ||ƒ}|dk r)|j} | d} | jtjkrfd} tj} nx| jtjkrŠd} tj} nT| jtjkrÞˆj| dƒ} } t| ƒd krÞˆj| d ƒ} qÞn| dksö| dkr)|jƒ}tj|ggd| d | ƒ}q)n|dk rA||_n|jƒS(uXCompiles a node, recursively. This is one big switch on the node type. icsg|]}ˆj|ƒ‘qS((u compile_node(u.0uch(uself(u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyu Ps u0PatternCompiler.compile_node..NiicSsg|]}|g‘qS(((u.0ua((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyu Ss uminumaxcsg|]}ˆj|ƒ‘qS((u compile_node(u.0uch(uself(u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyu Ws iiiÿÿÿÿiÿÿÿÿiÿÿÿÿ(utypeusymsuMatcheruchildrenu AlternativesulenupytreeuWildcardPatternuoptimizeu Alternativeu NegatedUnitu compile_basicuNegatedPatternuNoneutokenuEQUALuvalueuRepeateruSTARuHUGEuPLUSuLBRACEuget_intuname( uselfunodeualtsupuunitsupatternunameunodesurepeatuchildrenuchilduminumax((uselfu4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyu compile_nodeDs^)(    ( +       '  uPatternCompiler.compile_nodecCsÉ|d}|jtjkrJttj|jƒƒ}tjt |ƒ|ƒS|jtj krd|j}|j ƒrÀ|t krt d|ƒ‚n|dd…r¯t dƒ‚ntjt |ƒS|dkrÕd}nF|jdƒst|j|dƒ}|dkrt d|ƒ‚qn|dd…rK|j|djdƒg}nd}tj||ƒSna|jdkr„|j|dƒS|jd krÅ|j|dƒ}tj|ggd dd dƒSdS( NiuInvalid token: %riuCan't have details for tokenuanyu_uInvalid symbol: %ru(u[uminumax(utypeutokenuSTRINGustruliteralsu evalStringuvalueupytreeu LeafPatternu_type_of_literaluNAMEuisupperu TOKEN_MAPuPatternSyntaxErroruNoneu startswithugetattrupysymsu compile_nodeuchildrenu NodePatternuWildcardPattern(uselfunodesurepeatunodeuvalueutypeucontentu subpattern((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyu compile_basic‹s8        uPatternCompiler.compile_basiccCs t|jƒS(N(uintuvalue(uselfunode((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyuget_int®suPatternCompiler.get_intNF( u__name__u __module__u __qualname__u_PATTERN_GRAMMAR_FILEu__init__uFalseucompile_patternu compile_nodeuNoneu compile_basicuget_int(u __locals__((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyuPatternCompiler+s   G#uPatternCompileruNAMEuSTRINGuNUMBERuTOKENcCs9|djƒrtjS|tjkr1tj|SdSdS(Ni(uisalphautokenuNAMEugrammaruopmapuNone(uvalue((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyu_type_of_literalºs  u_type_of_literalcCsW|\}}}}|s'||jkr=tj||d|ƒStj||d|ƒSdS(u9Converts raw node information to a Node or Leaf instance.ucontextN(u number2symbolupytreeuNodeuLeaf(ugrammaru raw_node_infoutypeuvalueucontextuchildren((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyupattern_convertÃsupattern_convertcCstƒj|ƒS(N(uPatternCompilerucompile_pattern(upattern((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyucompile_patternÌsucompile_pattern( u__doc__u __author__uiouosupgen2udriveruliteralsutokenutokenizeuparseugrammaruupytreeupygramupathujoinudirnameu__file__u_PATTERN_GRAMMAR_FILEu ExceptionuPatternSyntaxErrorutokenize_wrapperuobjectuPatternCompileruNAMEuSTRINGuNUMBERuNoneu TOKEN_MAPu_type_of_literalupattern_convertucompile_pattern(((u4/opt/alt/python33/lib64/python3.3/lib2to3/patcomp.pyu s$  .  ‰