
    "e                         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y)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y)PatternSyntaxErrorN)__name__
__module____qualname__     !lib/python3.12/lib2to3/patcomp.pyr   r      s    r   r   c              #      K   t         j                  t         j                  t         j                  h}t	        j
                  t        j                  |       j                        }|D ]  }|\  }}}}}||vs|  yw)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%      si     MM5<<6D%%bkk%&8&A&ABF 	-6*eUCtOs   A3A=6A=c                   0    e Zd ZddZddZd ZddZd Zy)	PatternCompilerNc                    |+t         j                  | _        t         j                  | _        n>t        j                  |      | _        t        j                  | j                        | _        t         j                  | _	        t         j                  | _        t        j                  | j                  t              | _        y)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__(   sz    
 !11DL..DI!..|<DLt||4DI..++mmDLL/Jr   c                     t        |      }	 | j                  j                  ||      }|r| j                  |      |fS | j                  |      S # t        j                  $ r}t        t        |            dd}~ww xY w)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%+@D $$T*D00$$T**  	7$SV,$6	7s   A A=#A88A=c                     |j                   | j                  j                  k(  r|j                  d   }|j                   | j                  j                  k(  rx|j                  ddd   D cg c]  }| j                  |       }}t        |      dk(  r|d   S t        j                  |D cg c]  }|g c}dd      }|j                         S |j                   | j                  j                  k(  rd|j                  D cg c]  }| j                  |       }}t        |      dk(  r|d   S t        j                  |gdd      }|j                         S |j                   | j                  j                  k(  rC| j                  |j                  dd       }t        j                  |      }|j                         S |j                   | j                  j                  k(  sJ d}|j                  }	t        |	      dk\  r4|	d   j                   t        j                   k(  r|	d   j"                  }|	dd }	d}
t        |	      dk\  r0|	d   j                   | j                  j$                  k(  r
|	d   }
|	dd }	| j                  |	|
      }|
S|
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(  rj|d   j                   t        j.                  k(  sJ t        |      dv sJ | j1                  |d         x}}t        |      d	k(  r| j1                  |d         }nJ |dk7  s|dk7  r*|j                         }t        j                  |gg||      }|||_        |j                         S c c}w c c}w c c}w )
zXCompiles a node, recursively.

        This is one big switch on the node type.
        r   N   r   minmax   )rG      rI   )r    r,   MatcherchildrenAlternativesr=   lenr
   WildcardPatternoptimizeAlternativeNegatedUnitcompile_basicNegatedPatternUnitr   EQUALr!   RepeaterSTARHUGEPLUSLBRACERBRACEget_intname)r5   nodechaltsapunitspatternr]   nodesrepeatrK   childrE   rF   s                  r   r=   zPatternCompiler.compile_nodeC   sO    99		)))==#D99		...48MM#A#4FGbD%%b)GDG4yA~Aw&&T':':qIA::<99		---59]]CrT&&r*CEC5zQQx&&wA1=A::<99		---((qr):;G%%g.A::<yyDIINN**u:?uQx}};8>>D!"IEu:?uRy~~1C1CC2YF#2JE $$UF3;;$))"4"444HQKEzzUZZ'kkuzz)kku||+|((ELL88H// LL!55cx=A%,,x{3Cax3!8!**, 007)#3OGL!!s H (; Ds   *O1*
O6?O;c                    t        |      dk\  sJ |d   }|j                  t        j                  k(  rGt	        t        j                  |j                              }t        j                  t        |      |      S |j                  t        j                  k(  r|j                  }|j                         rB|t        vrt        d|z        |dd  rt        d      t        j                  t        |         S |dk(  rd }n8|j                  d      s't!        | j"                  |d       }|t        d|z        |dd  r#| j%                  |d   j&                  d         g}nd }t        j(                  |      S |j                  dk(  r| j%                  |d         S |j                  d	k(  r2|J | 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([rD   )rM   r    r   STRINGr<   r   
evalStringr!   r
   LeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr2   r=   rK   NodePatternrN   )r5   re   rf   r^   r!   r    content
subpatterns           r   rR   zPatternCompiler.compile_basic   s   5zQQx99$++DJJ78E%%&6u&=uEEYY%**$JJE}}	),-@5-HII9,-KLL)))E*:;;E>D))#."4;;t<D|01E1MNN9#00q1B1B11EFGG"G))$88ZZ3$$U1X..ZZ3>!**584J))J<.aQGGdr   c                 j    |j                   t        j                  k(  sJ t        |j                        S N)r    r   NUMBERintr!   )r5   r^   s     r   r\   zPatternCompiler.get_int   s#    yyELL((4::r   rz   )FF)r   r   r   r7   rA   r=   rR   r\   r   r   r   r'   r'   &   s    K
+E"N!Fr   r'   )rq   rm   r{   TOKENc                     | d   j                         rt        j                  S | t        j                  v rt        j                  |    S y )Nr   )isalphar   rq   r	   opmap)r!   s    r   rp   rp      s:    Qxzz	'--	}}U##r   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   rK   s         r   r4   r4      sF    %2"D%(47000{{47;;{{488r   c                 4    t               j                  |       S rz   )r'   rA   )rd   s    r   rA   rA      s    ,,W55r   )__doc__
__author__r   pgen2r   r   r   r   r   r	    r
   r   	Exceptionr   r%   objectr'   rq   rm   r{   rs   rp   r4   rA   r   r   r   <module>r      sw    3
 
 E D  	 	If IZ ZZ||||	96r   