U e5dŽã@s dZdZddlZddlmZmZmZmZmZm Z ddl m Z ddl m Z Gdd „d e ƒZd d „ZGd d „d eƒZejejejddœZdd„Zdd„Zdd„ZdS)z�Pattern compiler. The grammar is taken from PatternGrammar.txt. The compiler compiles a pattern to a pytree.*Pattern instance. z#Guido van Rossum éNé)ÚdriverÚliteralsÚtokenÚtokenizeÚparseÚgrammar)Úpytree)Úpygramc@s eZdZdS)ÚPatternSyntaxErrorN)Ú__name__Ú __module__Ú __qualname__©rrú'/usr/lib64/python3.8/lib2to3/patcomp.pyr sr c csLtjtjtjh}t t |¡j¡}|D] }|\}}}}}||kr&|Vq&dS)z6Tokenizes a string suppressing significant whitespace.N) rÚNEWLINEÚINDENTÚDEDENTrÚgenerate_tokensÚioÚStringIOÚreadline) ÚinputÚskipÚtokensZ quintupleÚtypeÚvalueÚstartÚendZ line_textrrrÚtokenize_wrappers rc@s:eZdZd dd„Zddd„Zdd„Zdd d „Zd d „ZdS)ÚPatternCompilerNcCsZ|dkrtj|_tj|_nt |¡|_t |j¡|_tj|_ tj |_ tj |jt d�|_dS)z^Initializer. Takes an optional alternative filename for the pattern grammar. N)Zconvert)r Zpattern_grammarrZpattern_symbolsÚsymsrZ load_grammarZSymbolsZpython_grammarZ pygrammarZpython_symbolsÚpysymsZDriverÚpattern_convert)ÚselfZ grammar_filerrrÚ__init__(s  zPatternCompiler.__init__Fc Cspt|ƒ}z|jj||d�}Wn2tjk rN}ztt|ƒƒd‚W5d}~XYnX|rb| |¡|fS| |¡SdS)z=Compiles a pattern string to a nested pytree.*Pattern object.)ÚdebugN)rrZ parse_tokensrZ ParseErrorr ÚstrÚ compile_node)r$rr&Z with_treerÚrootÚerrrÚcompile_pattern7s zPatternCompiler.compile_patternc sV|jˆjjkr|jd}|jˆjjkrz‡fdd„|jddd…Dƒ}t|ƒdkrX|dStjdd„|Dƒddd�}| ¡S|jˆjj krʇfd d„|jDƒ}t|ƒdkr°|dStj|gddd�}| ¡S|jˆjj krþˆ  |jdd…¡}t  |¡}| ¡Sd}|j}t|ƒd k�r>|djt jk�r>|dj}|dd…}d}t|ƒdk�rx|d jˆjjk�rx|d }|dd …}ˆ  ||¡}|dk �r>|j} | d} | jt jk�r¶d} tj} nX| jt jk�rÐd} tj} n>| jt jk�rˆ | d¡} } t| ƒd k�rˆ | d ¡} n| dk�s"| dk�r>| ¡}tj|gg| | d�}|dk �rN||_| ¡S) zXCompiles a node, recursively. This is one big switch on the node type. rcsg|]}ˆ |¡‘qSr©r(©Ú.0Zch©r$rrÚ Osz0PatternCompiler.compile_node..NércSsg|] }|g‘qSrr)r.Úarrrr0Rs©ÚminÚmaxcsg|]}ˆ |¡‘qSrr,r-r/rrr0Vsééÿÿÿÿé)rr!ZMatcherÚchildrenZ AlternativesÚlenr ÚWildcardPatternÚoptimizeZ AlternativeZ NegatedUnitÚ compile_basicZNegatedPatternrÚEQUALrZRepeaterÚSTARZHUGEÚPLUSÚLBRACEÚget_intÚname) r$ÚnodeZaltsÚpZunitsÚpatternrCÚnodesÚrepeatr9Zchildr4r5rr/rr(Cs^       "    zPatternCompiler.compile_nodecCs@|d}|jtjkr4tt |j¡ƒ}t t |ƒ|¡S|jtj krô|j}|  ¡r„|t krbt d|ƒ‚|dd…rvt dƒ‚t t |¡S|dkr’d}n,| d¡s¾t|j|dƒ}|dkr¾t d|ƒ‚|dd…râ| |djd¡g}nd}t ||¡SnH|jdk�r| |d¡S|jd k�r<| |d¡}tj|ggddd �SdS) NrzInvalid token: %rrzCan't have details for tokenÚanyÚ_zInvalid symbol: %rú(ú[r3)rrÚSTRINGr'rZ evalStringrr Z LeafPatternÚ_type_of_literalÚNAMEÚisupperÚ TOKEN_MAPr Ú startswithÚgetattrr"r(r9Z NodePatternr;)r$rGrHrDrrZcontentÚ subpatternrrrr=Šs8         zPatternCompiler.compile_basiccCs t|jƒS©N)Úintr)r$rDrrrrB­szPatternCompiler.get_int)N)FF)N)r r rr%r+r(r=rBrrrrr &s   G #r )rOrMÚNUMBERZTOKENcCs.|d ¡rtjS|tjkr&tj|SdSdS)Nr)ÚisalpharrOrZopmap)rrrrrN¹s    rNcCs>|\}}}}|s||jkr*tj|||d�Stj|||d�SdS)z9Converts raw node information to a Node or Leaf instance.)ÚcontextN)Z number2symbolr ZNodeZLeaf)rZ raw_node_inforrrYr9rrrr#Âs r#cCs tƒ |¡SrU)r r+)rFrrrr+Ësr+)Ú__doc__Ú __author__rZpgen2rrrrrrÚr r Ú Exceptionr rÚobjectr rOrMrWrQrNr#r+rrrrÚs"    ý