
    f4                        d Z ddlmZ ddlZg dZ G d d      Z G d de      Z G d	 d
e      Z G d de      Z G d de      Z	 G d de      Z
 G d de      ZddZddZy)a  
Parser for parsing a regular expression.
Take a string representing a regular expression and return the root node of its
parse tree.

usage::

    root_node = parse_regex('(hello|world)')

Remarks:
- The regex parser processes multiline, it ignores all whitespace and supports
  multiple named groups with the same name and #-style comments.

Limitations:
- Lookahead is not supported.
    )annotationsN)RepeatVariableRegex	Lookaheadtokenize_regexparse_regexc                       e Zd ZdZddZddZy)NodezT
    Base class for all the grammar nodes.
    (You don't initialize this one.)
    c                    t        | |g      S N)NodeSequenceself
other_nodes     p/var/www/cvtools/html/venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/regex_parser.py__add__zNode.__add__&   s    T:.//    c                    t        | |g      S r   )AnyNoder   s     r   __or__zNode.__or__)   s    j)**r   Nr   r   returnr   r   r   r   r   )__name__
__module____qualname____doc__r   r    r   r   r   r       s    
0+r   r   c                  (    e Zd ZdZddZddZddZy)	r   z
    Union operation (OR operation) between several grammars. You don't
    initialize this yourself, but it's a result of a "Grammar1 | Grammar2"
    operation.
    c                    || _         y r   childrenr   r#   s     r   __init__zAnyNode.__init__4   	     r   c                4    t        | j                  |gz         S r   )r   r#   r   s     r   r   zAnyNode.__or__7   s    t}}
|344r   c                N    | j                   j                   d| j                  dS N()	__class__r   r#   r   s    r   __repr__zAnyNode.__repr__:   %    ..))*!DMM+<A>>r   Nr#   
list[Node]r   Noner   r   str)r   r   r   r   r%   r   r/   r   r   r   r   r   -   s    !5?r   r   c                  (    e Zd ZdZddZddZddZy)	r   z
    Concatenation operation of several grammars. You don't initialize this
    yourself, but it's a result of a "Grammar1 + Grammar2" operation.
    c                    || _         y r   r"   r$   s     r   r%   zNodeSequence.__init__D   r&   r   c                4    t        | j                  |gz         S r   )r   r#   r   s     r   r   zNodeSequence.__add__G   s    DMMZL899r   c                N    | j                   j                   d| j                  dS r)   r,   r.   s    r   r/   zNodeSequence.__repr__J   r0   r   Nr1   r   r4   )r   r   r   r   r%   r   r/   r   r   r   r   r   >   s    
!:?r   r   c                       e Zd ZdZddZddZy)r   z
    Regular expression.
    c                <    t        j                  |       || _        y r   )recompileregex)r   r>   s     r   r%   zRegex.__init__S   s    


5
r   c                N    | j                   j                   d| j                   dS )Nz(/z/))r-   r   r>   r.   s    r   r/   zRegex.__repr__X   s$    ..))*"TZZL;;r   N)r>   r5   r   r3   r4   r   r   r   r   r%   r/   r   r   r   r   r   N   s    
<r   r   c                  "    e Zd ZdZdddZddZy)r   z
    Lookahead expression.
    c                     || _         || _        y r   )	childnodenegative)r   rC   rD   s      r   r%   zLookahead.__init__a   s    " r   c                N    | j                   j                   d| j                  dS r)   r-   r   rC   r.   s    r   r/   zLookahead.__repr__e   s%    ..))*!DNN+=Q??r   N)F)rC   r   rD   boolr   r3   r4   r@   r   r   r   r   r   \   s    !@r   r   c                  "    e Zd ZdZdddZddZy)r   a  
    Mark a variable in the regular grammar. This will be translated into a
    named group. Each variable can have his own completer, validator, etc..

    :param childnode: The grammar which is wrapped inside this variable.
    :param varname: String.
    c                     || _         || _        y r   )rC   varname)r   rC   rJ   s      r   r%   zVariable.__init__r   s    "r   c                h    | j                   j                   d| j                  d| j                  dS )N(childnode=z
, varname=r+   )r-   r   rC   rJ   r.   s    r   r/   zVariable.__repr__v   s4    ..))*+dnn5GzRVR^R^Qaabccr   N) )rC   r   rJ   r5   r   r3   r4   r@   r   r   r   r   r   i   s    dr   r   c                  6    e Zd Z	 	 	 d	 	 	 	 	 	 	 	 	 ddZddZy)r   Nc                <    || _         || _        || _        || _        y r   )rC   
min_repeat
max_repeatgreedy)r   rC   rP   rQ   rR   s        r   r%   zRepeat.__init__{   s      #$$r   c                N    | j                   j                   d| j                  dS )NrL   r+   rF   r.   s    r   r/   zRepeat.__repr__   s%    ..))*+dnn5GqIIr   )r   NT)
rC   r   rP   intrQ   z
int | NonerR   rG   r   r3   r4   )r   r   r   r%   r/   r   r   r   r   r   z   sH     !%

 
 	

 
 

Jr   r   c                (   t        j                  dt         j                        }g }| ri|j                  |       }|rH| d|j	                          | |j	                         d } }|j                         s|j                  |       nt        d      | ri|S )z
    Takes a string, representing a regular expression as input, and tokenizes
    it.

    :param input: string, representing a regular expression.
    :returns: List of tokens.
    a  ^(
        \(\?P\<[a-zA-Z0-9_-]+\>  | # Start of named group.
        \(\?#[^)]*\)             | # Comment
        \(\?=                    | # Start of lookahead assertion
        \(\?!                    | # Start of negative lookahead assertion
        \(\?<=                   | # If preceded by.
        \(\?<                    | # If not preceded by.
        \(?:                     | # Start of group. (non capturing.)
        \(                       | # Start of group.
        \(?[iLmsux]              | # Flags.
        \(?P=[a-zA-Z]+\)         | # Back reference to named group
        \)                       | # End of group.
        \{[^{}]*\}               | # Repetition
        \*\? | \+\? | \?\?\      | # Non greedy repetition.
        \* | \+ | \?             | # Repetition
        \#.*\n                   | # Comment
        \\. |

        # Character group.
        \[
            ( [^\]\\]  |  \\.)*
        \]                  |

        [^(){}]             |
        .
    )NzCould not tokenize input regex.)r<   r=   VERBOSEmatchendisspaceappend	Exception)inputptokensmtokens        r   r   r      s     	

		4 	

7	A< F
GGEN 1557+U15579-=5E==?e$=>>  Mr   c                |    dg| ddd   z   ddd	fd        }t              dk7  rt        d      |S )
zN
    Takes a list of tokens from the tokenizer, and returns a parse tree.
    r+   Nc                >    t        |       dk(  r| d   S t        |       S )z7Turn list into sequence when it contains several items.   r   )lenr   )lsts    r   wrapzparse_regex.<locals>.wrap   s!    s8q=q6M$$r   c                    g g d fd} rωj                         }|j                  d      r(t                |dd       }j                  |       n|dv r|dk(  }t	        d   |      d<   nd|d	v r|d
k(  }t	        d   d|      d<   nE|dv r8g k(  rt        dt              z         |dk(  }t	        d   dd|      d<   n	|dk(  rj                         g n|dv rj                                 n|dk(  r"j                  t                d             n|dk(  r"j                  t                d             n|dk(  r |        S |j                  d      rni|j                  d      rt        | d      |j                  d      rt        |d      |j                         rnj                  t        |             rt        d      )!Nc                     g k(  r       S j                         t        D  cg c]
  }  |        c}       S c c} w r   )rZ   r   )ior_listresultrg   s    r   wrapped_resultz3parse_regex.<locals>._parse.<locals>.wrapped_result   s=    "}F|#v&9AQ9::9s   ?z(?P<   rb   )rJ   )*z*?ro   )rR   )+z+?rp   rd   )rP   rR   )?z??zNothing to repeat.rq   r   )rP   rQ   rR   |)r*   z(?:z(?!T)rD   z(?=Fr+   #{z#-style repetition not yet supportedz(?z not supportedzExpecting ')' tokenr   r   )
pop
startswithr   rZ   r   r[   reprr   rY   r   )	rm   tvariablerR   rk   rl   _parser^   rg   s	       @@r   r{   zparse_regex.<locals>._parse   s   $&	; 

A||F##FHa"g>h'k!c#F2Jv>r
k!c#F2J1VLr
k!R<#$84<$GHH#XF!'r
qQv"F2J cv&l"fh'ei4@Aei5ABc%''c"c"1#%H IJJd#1%~ 677eAh'k n -..r   r   zUnmatched parentheses.)rf   r2   r   r   ru   )re   r[   )regex_tokensrl   r{   r^   rg   s     @@@r   r	   r	      sL    
 TrT 22F%B/H XF
6{a011r   )r\   r5   r   	list[str])r|   r}   r   r   )r   
__future__r   r<   __all__r   r   r   r   r   r   r   r   r	   r   r   r   <module>r      s}   " # 	
+ 
+?d ?"?4 ? <D <
@ 
@dt d"JT J"2jWr   