
    Mh                        S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSK	J
r
  \
(       a  SSKJrJr  SrSS	 jrSS
 jrSS jr        SS jrSS jrg)z6
:func:`~pandas.eval` source string parsing functions
    )annotations)StringIO)	iskeywordN)TYPE_CHECKING)HashableIteratord   c                   U R                  5       (       a  [        U 5      (       d  U $ [        R                  R	                  5        VVs0 s H  u  pUS[
        R                  U    S3_M     nnnUR                  SSSSSSSSS	.5        S
R                  U  Vs/ s H  oR                  X5      PM     sn5      n SU  3n U R                  5       (       d  [        SU  S35      eU $ s  snnf s  snf )a  
Create valid Python identifiers from any string.

Check if name contains any special characters. If it contains any
special characters, the special characters will be replaced by
a special string and a prefix is added.

Raises
------
SyntaxError
    If the returned name is not a Python valid identifier, raise an exception.
    This can happen if there is a hashtag in the name, as the tokenizer will
    than terminate and not find the backtick.
    But also for characters that fall out of the range of (U+0001..U+007F).
__QUESTIONMARK__EXCLAMATIONMARK__DOLLARSIGN_
_EUROSIGN__DEGREESIGN__SINGLEQUOTE__DOUBLEQUOTE_) ?!$u   €   °'" BACKTICK_QUOTED_STRING_zCould not convert 'z' to a valid Python identifier.)isidentifierr   tokenizeEXACT_TOKEN_TYPESitemstokentok_nameupdatejoingetSyntaxError)namechartokvalspecial_characters_replacementss       Q/var/www/html/env/lib/python3.13/site-packages/pandas/core/computation/parsing.pycreate_valid_python_identifierr+      s     9T?? &77==?'?LD 	%..()++? $ ' $**!$   	
  77PTUPT77CPTUVD$TF+D/v5TUVVK5'( Vs   	$C%C+c                Z    U u  pU[         :X  a  [        R                  [        U5      4$ X4$ )a  
Clean up a column name if surrounded by backticks.

Backtick quoted string are indicated by a certain tokval value. If a string
is a backtick quoted token it will processed by
:func:`_create_valid_python_identifier` so that the parser can find this
string when the query is executed.
In this case the tok will get the NAME tokval.

Parameters
----------
tok : tuple of int, str
    ints correspond to the all caps constants in the tokenize module

Returns
-------
tok : Tuple[int, str]
    Either the input or token or the replacement values
)BACKTICK_QUOTED_STRINGr   NAMEr+   )toktoknumr(   s      r*   clean_backtick_quoted_toksr1   I   s1    ( NF''}}<VDDD>    c                x     [        SU  S35      n[        U5      S   n[        U5      $ ! [         a    U s $ f = f)ad  
Function to emulate the cleaning of a backtick quoted name.

The purpose for this function is to see what happens to the name of
identifier if it goes to the process of being parsed a Python code
inside a backtick quoted string and than being cleaned
(removed of any special characters).

Parameters
----------
name : hashable
    Name to be cleaned.

Returns
-------
name : hashable
    Returns the name after tokenizing and cleaning.

Notes
-----
    For some cases, a name cannot be converted to a valid Python identifier.
    In that case :func:`tokenize_string` raises a SyntaxError.
    In that case, we just return the name unmodified.

    If this name was used in the query string (this makes the query call impossible)
    an error will be raised by :func:`tokenize_backtick_quoted_string` instead,
    which is not caught and propagates to the user level.
`   )tokenize_stringnextr+   r%   )r&   	tokenizedr(   s      r*   clean_column_namer9   c   sF    :#avQK0	i#-f55 s   '* 99c                L    U  H  u  p4n  nUS:X  d  M  US   n  O   [         XW 4$ )aw  
Creates a token from a backtick quoted string.

Moves the token_generator forwards till right after the next backtick.

Parameters
----------
token_generator : Iterator[tokenize.TokenInfo]
    The generator that yields the tokens of the source string (Tuple[int, str]).
    The generator is at the first token after the backtick (`)

source : str
    The Python source code string.

string_start : int
    This is the start of backtick quoted string inside the source string.

Returns
-------
tok: Tuple[int, str]
    The token that represents the backtick quoted string.
    The integer is equal to BACKTICK_QUOTED_STRING (100).
r4   r5   )r-   )token_generatorsourcestring_startr   r(   start
string_ends          r*   tokenize_backtick_quoted_stringr@      s<    4 #25!QS=qJ #2
 "6z#BBBr2   c              #    #    [        U 5      R                  n[        R                  " U5      nU H(  u  p4n  nUS:X  a   [	        X US   S-   S9v   M#  X44v   M*     g! [
         a  n[        SU  S35      UeSnAff = f7f)z
Tokenize a Python source code string.

Parameters
----------
source : str
    The Python source code string.

Returns
-------
tok_generator : Iterator[Tuple[int, str]]
    An iterator yielding all tokens with only toknum and tokval (Tuple[ing, str]).
r4   r5   )r=   zFailed to parse backticks in 'z'.N)r   readliner   generate_tokensr@   	Exceptionr%   )r<   line_readerr;   r0   r(   r>   r   errs           r*   r6   r6      s      6"++K..{;O (7#q!S=X5#%(Q,  .  (7  X!$B6(""MNTWWXs(   <A?AA?
A<'A77A<<A?)r&   strreturnrG   )r/   tuple[int, str]rH   rI   )r&   r   rH   r   )r;   zIterator[tokenize.TokenInfo]r<   rG   r=   intrH   rI   )r<   rG   rH   zIterator[tuple[int, str]])__doc__
__future__r   ior   keywordr   r    r   typingr   collections.abcr   r   r-   r+   r1   r9   r@   r6    r2   r*   <module>rR      so    #        0f4"JC1C;>CNQCCD!r2   