
    d                         d Z dZddlZddlmZmZmZmZmZm	Z	 ddl
mZ ddl
mZ  G d d	e          Zd
 Z G d de          Zej        ej        ej        ddZd Zd Zd ZdS )zPattern compiler.

The grammar is taken from PatternGrammar.txt.

The compiler compiles a pattern to a pytree.*Pattern instance.
z#Guido van Rossum <guido@python.org>    N   )driverliteralstokentokenizeparsegrammar)pytree)pygramc                       e Zd ZdS )PatternSyntaxErrorN)__name__
__module____qualname__     !  /croot/python-split_1694437901252/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/python3.11/lib2to3/patcomp.pyr   r      s        Dr   r   c              #      K   t           j        t           j        t           j        h}t	          j        t          j        |           j                  }|D ]}|\  }}}}}||vr|V  dS )z6Tokenizes a string suppressing significant whitespace.N)	r   NEWLINEINDENTDEDENTr   generate_tokensioStringIOreadline)	inputskiptokens	quintupletypevaluestartend	line_texts	            r   tokenize_wrapperr%      ss      M5<6D%bk%&8&8&ABBF  	-6*eUCtOOO r   c                   2    e Zd ZddZd	dZd ZddZd ZdS )
PatternCompilerNc                 L   |#t           j        | _        t           j        | _        n7t          j        |          | _        t          j        | j                  | _        t           j        | _	        t           j
        | _        t          j        | j        t                    | _        dS )z^Initializer.

        Takes an optional alternative filename for the pattern grammar.
        N)convert)r   pattern_grammarr	   pattern_symbolssymsr   load_grammarSymbolspython_grammar	pygrammarpython_symbolspysymsDriverpattern_convert)selfgrammar_files     r   __init__zPatternCompiler.__init__(   su    
 !1DL.DII!.|<<DLt|44DI.+mDL/JJJr   Fc                     t          |          }	 | j                            ||          }n4# t          j        $ r"}t          t          |                    dd}~ww xY w|r|                     |          |fS |                     |          S )z=Compiles a pattern string to a nested pytree.*Pattern object.)debugN)r%   r   parse_tokensr   
ParseErrorr   strcompile_node)r5   r   r9   	with_treer   rootes          r   compile_patternzPatternCompiler.compile_pattern7   s    !%((	7;++F%+@@DD 	7 	7 	7$SVV,,$6	7 	+$$T**D00$$T***s   . AAAc                     |j          j        j        k    r|j        d         }|j          j        j        k    rl fd|j        ddd         D             }t          |          dk    r|d         S t          j        d |D             dd          }|                                S |j          j        j	        k    rZ fd|j        D             }t          |          dk    r|d         S t          j        |gdd          }|                                S |j          j        j
        k    rJ                     |j        dd                   }t          j        |          }|                                S |j          j        j        k    sJ d}|j        }t          |          d	k    r2|d         j         t          j        k    r|d         j        }|dd         }d}t          |          dk    r-|d
         j          j        j        k    r|d
         }|dd
         }                     ||          }|:|j          j        j        k    sJ |j        }	|	d         }
|
j         t          j        k    rd}t          j        }n|
j         t          j        k    rd}t          j        }n|
j         t          j        k    r||	d
         j         t          j        k    sJ t          |	          dv sJ                      |	d                   x}}t          |	          dk    r                     |	d	                   }nJ |dk    s|dk    r-|                                }t          j        |gg||          }|||_        |                                S )zXCompiles a node, recursively.

        This is one big switch on the node type.
        r   c                 :    g | ]}                     |          S r   r=   .0chr5   s     r   
<listcomp>z0PatternCompiler.compile_node.<locals>.<listcomp>O   s'    GGGbD%%b))GGGr   N   r   c                     g | ]}|gS r   r   )rF   as     r   rH   z0PatternCompiler.compile_node.<locals>.<listcomp>R   s    ':':':':':':r   minmaxc                 :    g | ]}                     |          S r   rD   rE   s     r   rH   z0PatternCompiler.compile_node.<locals>.<listcomp>V   s'    CCCrT&&r**CCCr      )rP      rR   )r    r,   MatcherchildrenAlternativeslenr
   WildcardPatternoptimizeAlternativeNegatedUnitcompile_basicNegatedPatternUnitr   EQUALr!   RepeaterSTARHUGEPLUSLBRACERBRACEget_intname)r5   nodealtspunitspatternrf   nodesrepeatrT   childrM   rN   s   `            r   r=   zPatternCompiler.compile_nodeC   s]    9	)))=#D9	...GGGGDM##A#4FGGGD4yyA~~Aw&':':T':':':qIIIA::<<9	---CCCCT]CCCE5zzQQx&wA1===A::<<9	---((qrr):;;G%g..A::<<yDIN****u::??uQx};;8>D!""IEu::??uRy~1CCC2YF#2#JE $$UF33;$)"44444HQKEzUZ''kuz))ku|++|(EL8888H//// LL!555cx==A%%,,x{33Caxx3!88!**,, 07)#3OOOGL!!!r   c                    t          |          dk    sJ |d         }|j        t          j        k    rHt	          t          j        |j                            }t          j	        t          |          |          S |j        t          j        k    r|j        }|                                rS|t          vrt          d|z            |dd          rt          d          t          j	        t          |                   S |dk    rd }n?|                    d          s*t!          | j        |d           }|t          d|z            |dd          r(|                     |d         j        d                   g}nd }t          j        ||          S |j        dk    r|                     |d                   S |j        d	k    r8|J |                     |d                   }t          j        |ggdd
          S J |            )Nr   r   zInvalid token: %rzCan't have details for tokenany_zInvalid symbol: %r([rL   )rV   r    r   STRINGr<   r   
evalStringr!   r
   LeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr2   r=   rT   NodePatternrW   )r5   rl   rm   rg   r!   r    content
subpatterns           r   r[   zPatternCompiler.compile_basic   s   5zzQQx9$$+DJ7788E%&6u&=&=uEEEY%*$$JE}} 9	)),-@5-HIII9 M,-KLLL))E*:;;;E>>DD))#.. O"4;t<<D|01E1MNNN9 ##00q1B11EFFGGG"G)$888Z3$$U1X...Z3>>>**5844J)J<.aQGGGGdr   c                 X    |j         t          j        k    sJ t          |j                  S N)r    r   NUMBERintr!   )r5   rg   s     r   re   zPatternCompiler.get_int   s%    yEL((((4:r   r   )FF)r   r   r   r7   rA   r=   r[   re   r   r   r   r'   r'   &   sw        K K K K
+ 
+ 
+ 
+E" E" E"N! ! ! !F    r   r'   )rx   rt   r   TOKENc                     | d                                          rt          j        S | t          j        v rt          j        |          S d S )Nr   )isalphar   rx   r	   opmap)r!   s    r   rw   rw      sA    Qx z	'-		}U##tr   c                     |\  }}}}|s	|| j         v rt          j        |||          S t          j        |||          S )z9Converts raw node information to a Node or Leaf instance.)context)number2symbolr
   NodeLeaf)r	   raw_node_infor    r!   r   rT   s         r   r4   r4      sS    %2"D%( 947000{47;;;;{48888r   c                 D    t                                          |           S r   )r'   rA   )rk   s    r   rA   rA      s    ,,W555r   )__doc__
__author__r   pgen2r   r   r   r   r   r	    r
   r   	Exceptionr   r%   objectr'   rx   rt   r   rz   rw   r4   rA   r   r   r   <module>r      s=    3
 
			 E D D D D D D D D D D D D D D D            	 	 	 	 	 	 	 	  I I I I If I I IZ Z|| 	  9 9 96 6 6 6 6r   