3 \��@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.6/lib2to3/patcomp.pyr sr c csPtjtjtjh}tjtj|�j�}x(|D] }|\}}}}}||kr(|Vq(WdS)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|_ntj|�|_tj|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__FcCsnt|�}y|jj||d�}Wn0tjk rL}ztt|���WYdd}~XnX|r`|j|�|fS|j|�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_pattern7szPatternCompiler.compile_patternc s�|j�jjkr|jd}|j�jjkrz�fdd�|jddd�D�}t|�dkrX|dStjdd�|D�ddd�}|j�S|j�jj krʇfd d�|jD�}t|�dkr�|dStj|gddd�}|j�S|j�jj kr��j |jdd��}tj |�}|j�S|j�jj k�st�d}|j}t|�d k�rR|djtjk�rR|dj}|dd�}d}t|�dk�r�|d j�jjk�r�|d}|dd�}�j ||�}|dk �r�|j�jjk�s�t�|j} | d} | jtjk�r�d} tj} n�| jtjk�r�d} tj} np| jtjk�r^| djtjk�st�t| �dk�s.t��j| d�} } t| �d k�rh�j| d �} n d �sht�| dk�s|| dk�r�|j�}tj|gg| | d�}|dk �r�||_|j�S)zXCompiles a node, recursively. This is one big switch on the node type. rcsg|]}�j|��qSr)r()�.0�ch)r$rr� Osz0PatternCompiler.compile_node..N�rcSsg|] }|g�qSrr)r,�arrrr.Rs)�min�maxcsg|]}�j|��qSr)r()r,r-)r$rrr.Vs��F�����r5r5r5)r3r4)rr!ZMatcher�childrenZ Alternatives�lenr �WildcardPattern�optimizeZ AlternativeZ NegatedUnit� compile_basicZNegatedPatternZUnit�AssertionErrorr�EQUALrZRepeater�STARZHUGE�PLUS�LBRACE�RBRACE�get_int�name) r$�nodeZalts�pZunits�patternrB�nodes�repeatr6Zchildr1r2r)r$rr(Csh       "     zPatternCompiler.compile_nodecCsnt|�dkst�|d}|jtjkrDttj|j��}t j t |�|�S|jtj k�r|j}|j �r�|tkrttd|��|dd�r�td��t j t|�S|dkr�d}n,|jd�s�t|j|d�}|dkr�td|��|dd�r�|j|djd�g}nd}t j||�SnV|jdk�r |j|d�S|jd k�r\|dk�s:t�|j|d�}t j|ggddd �Sd �sjt|��dS) NrrzInvalid token: %rzCan't have details for token�any�_zInvalid symbol: %r�(�[)r1r2F)r7r;rr�STRINGr'rZ evalStringrr Z LeafPattern�_type_of_literal�NAME�isupper� TOKEN_MAPr � startswith�getattrr"r(r6Z NodePatternr8)r$rFrGrCrrZcontent� subpatternrrrr:�s<        zPatternCompiler.compile_basiccCs|jtjkst�t|j�S)N)rr�NUMBERr;�intr)r$rCrrrrA�szPatternCompiler.get_int)N)FF)N)r r rr%r+r(r:rArrrrr &s   G #r )rNrLrTZTOKENcCs.|dj�rtjS|tjkr&tj|SdSdS)Nr)�isalpharrNrZopmap)rrrrrM�s    rMcCs>|\}}}}|s||jkr*tj|||d�Stj|||d�SdS)z9Converts raw node information to a Node or Leaf instance.)�contextN)Z number2symbolr ZNodeZLeaf)rZ raw_node_inforrrWr6rrrr#�s r#cCs t�j|�S)N)r r+)rErrrr+�sr+)�__doc__� __author__rZpgen2rrrrrr�r r � Exceptionr r�objectr rNrLrTrPrMr#r+rrrr� s