<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
a
    XC?h                     @   s   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	 d	eZd
d ZG dd deZejejejddZdd Zdd Zd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                   @   s   e Zd ZdS )PatternSyntaxErrorN)__name__
__module____qualname__ r   r   4/opt/alt/python39/lib64/python3.9/lib2to3/patcomp.pyr      s   r   c           	      c   sL   t jt jt jh}tt| j}|D ] }|\}}}}}||vr&|V  q&dS )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_textr   r   r   tokenize_wrapper   s    r   c                   @   s:   e Zd ZdddZdddZdd Zdd	d
Zdd ZdS )PatternCompilerNc                 C   sZ   |du rt j| _t j| _nt|| _t | j| _t j| _	t j
| _tj| jtd| _dS )z^Initializer.

        Takes an optional alternative filename for the pattern grammar.
        N)Zconvert)r
   Zpattern_grammarr   Zpattern_symbolssymsr   Zload_grammarZSymbolsZpython_grammarZ	pygrammarZpython_symbolspysymsZDriverpattern_convert)selfZgrammar_filer   r   r   __init__(   s    
zPatternCompiler.__init__Fc              
   C   sr   t |}z| jj||d}W n4 tjyP } ztt|dW Y d}~n
d}~0 0 |rd| ||fS | |S dS )z=Compiles a pattern string to a nested pytree.*Pattern object.)debugN)r   r   Zparse_tokensr   Z
ParseErrorr   strcompile_node)r$   r   r&   Z	with_treer   rooter   r   r   compile_pattern7   s    $zPatternCompiler.compile_patternc                    sV  |j  jjkr|jd }|j  jjkrz fdd|jddd D }t|dkrX|d S tjdd |D ddd}| S |j  jj	krʇ fd	d|jD }t|dkr|d S tj|gddd}| S |j  jj
kr |jdd }t|}| S d}|j}t|d
kr>|d j tjkr>|d j}|dd }d}t|dkrx|d j  jjkrx|d }|dd } ||}|dur>|j}	|	d }
|
j tjkrd}tj}nX|
j tjkrd}tj}n>|
j tjkr |	d  }}t|	dkr |	d
 }n |dks"|dkr>| }tj|gg||d}|durN||_| S )zXCompiles a node, recursively.

        This is one big switch on the node type.
        r   c                    s   g | ]}  |qS r   r(   .0Zchr$   r   r   
<listcomp>O       z0PatternCompiler.compile_node.<locals>.<listcomp>N   r   c                 S   s   g | ]
}|gqS r   r   )r.   ar   r   r   r0   R   r1   minmaxc                    s   g | ]}  |qS r   r,   r-   r/   r   r   r0   V   r1         )r   r!   ZMatcherchildrenZAlternativeslenr	   WildcardPatternoptimizeZAlternativeZNegatedUnitcompile_basicZNegatedPatternr   EQUALr   ZRepeaterSTARZHUGEPLUSLBRACEget_intname)r$   nodeZaltspZunitspatternrD   nodesrepeatr:   childr5   r6   r   r/   r   r(   C   s^    

 
"

zPatternCompiler.compile_nodec                 C   s@  |d }|j tjkr4tt|j}tt	||S |j tj
kr|j}| r|tvrbtd| |dd  rvtdtt| S |dkrd }n,|dst| j|d }|d u rtd| |dd  r| |d jd g}nd }t||S nH|jdkr| |d S |jd	kr<| |d }tj|ggddd
S d S )Nr   zInvalid token: %rr   zCan't have details for tokenany_zInvalid symbol: %r([r4   )r   r   STRINGr'   r   Z
evalStringr   r	   ZLeafPattern_type_of_literalNAMEisupper	TOKEN_MAPr   
startswithgetattrr"   r(   r:   ZNodePatternr<   )r$   rH   rI   rE   r   r   Zcontent
subpatternr   r   r   r>      s8    
zPatternCompiler.compile_basicc                 C   s
   t |jS N)intr   )r$   rE   r   r   r   rC      s    zPatternCompiler.get_int)N)FF)N)r   r   r   r%   r+   r(   r>   rC   r   r   r   r   r    &   s
   

G
#r    )rQ   rO   NUMBERZTOKENc                 C   s.   | d   rtjS | tjv r&tj|  S d S d S )Nr   )isalphar   rQ   r   Zopmap)r   r   r   r   rP      s
    

rP   c                 C   s>   |\}}}}|s|| j v r*tj|||dS tj|||dS dS )z9Converts raw node information to a Node or Leaf instance.)contextN)Znumber2symbolr	   ZNodeZLeaf)r   Zraw_node_infor   r   r[   r:   r   r   r   r#      s    r#   c                 C   s   t  | S rW   )r    r+   )rG   r   r   r   r+      s    r+   )__doc__
__author__r   Zpgen2r   r   r   r   r   r    r	   r
   	Exceptionr   r   objectr    rQ   rO   rY   rS   rP   r#   r+   r   r   r   r   <module>   s"    
 		