
    I j                        S r SSKJ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\5      rSS jrSS jrg)z6
:func:`~pandas.eval` source string parsing functions
    )annotations)Enum)StringIO)	iskeywordN)TYPE_CHECKING)HashableIteratord   c                &   U R                  5       (       a  [        U 5      (       d  U $ S U  5       nSR                  S U 5       5      n [        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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 )aF  
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.
c           	   3  v   #    U  H/  nUS R                  S UR                  SS5       5       5      4v   M1     g7f) c              3  8   #    U  H  n[        U5      v   M     g 7f)N)chr).0bs     p/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/pandas/core/computation/parsing.py	<genexpr>;create_valid_python_identifier.<locals>.<genexpr>.<genexpr>+   s     J$IqCFF$Is   asciibackslashreplaceN)joinencode)r   cs     r   r   1create_valid_python_identifier.<locals>.<genexpr>*   s7      A 
BGGJAHHW6H$IJJKs   79r   c              3  X   #    U  H   u  pUR                  S X:w  a  SOS5      v   M"     g7f)\	_UNICODE__BACKSLASH_N)replace)r   r   	c_escapeds      r   r   r   .   s/      LA 	$q~=QQs   (*__QUESTIONMARK__EXCLAMATIONMARK__DOLLARSIGN_
_EUROSIGN__DEGREESIGN__SINGLEQUOTE__DOUBLEQUOTE__HASH_
_BACKTICK_)
 ?!$u   €   °'"#`BACKTICK_QUOTED_STRING_zCould not convert 'z' to a valid Python identifier.)isidentifierr   r   tokenizeEXACT_TOKEN_TYPESitemstokentok_nameupdategetSyntaxError)namegenchartokvalspecial_characters_replacementss        r   create_valid_python_identifierrC      s6    9T??C 77  D &77==?'?LD 	%..()++? $ ' $**!$   	
 77PTUPT77CPTUVD$TF+D/v5TUVVK3'& Vs   *$D<D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_STRINGr6   NAMErC   )toktoknumrA   s      r   clean_backtick_quoted_toksrI   R   s1    ( NF''}}<VDDD>    c                     [        U [        5      (       a  U R                  SS5      OU n [        SU  S35      n[	        U5      S   n[        U5      $ ! [         a    U s $ f = f)a  
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.
r3   z``   )
isinstancestrr   tokenize_stringnextrC   r=   )r>   	tokenizedrA   s      r   clean_column_namerR   l   sd    &*4T3*?*?t||C&T#avQK0	i#-f55 s   AA A"!A"c                  $    \ rS rSrSrSrSrSrSrg)
ParseState   r   rL          N)	__name__
__module____qualname____firstlineno__DEFAULTIN_BACKTICKIN_SINGLE_QUOTEIN_DOUBLE_QUOTE__static_attributes__rX   rJ   r   rT   rT      s    GKOOrJ   rT   c                   / n/ nSn[         R                  nU[        U 5      :  Ga  X   nU=S:X  Ga    U[         R                  :X  aC  U(       a"  UR                  SSR	                  U5      45        U/nUS-  n[         R
                  nMt  U[         R
                  :X  GaM  U[        U 5      S-
  :w  a  XS-      OSnUS:X  a)  UR                  U5        UR                  U5        US-  nM  UR                  U5        UR                  SSR	                  U5      45        / nUS-  n[         R                  nGM   =S	:X  aV    U[         R                  :X  a  [         R                  nOU[         R                  :X  av  XS-
     S
:w  ak  [         R                  nOZS:X  aU  U[         R                  :X  a  [         R                  nO0U[         R                  :X  a  XS-
     S
:w  a  [         R                  n UR                  U5        US-  nU[        U 5      :  a  GM  U(       a"  UR                  SSR	                  U5      45        U$ )a  
Splits a str into substrings along backtick characters (`).

Disregards backticks inside quotes.

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

Returns
-------
substrings: list[tuple[bool, str]]
    List of tuples, where each tuple has two elements:
    The first is a boolean indicating if the substring is backtick-quoted.
    The second is the actual substring.
r   r3   Fr   rL   NrV   Tr0   r   r1   )rT   r]   lenappendr   r^   r_   r`   )s
substringssubstriparse_stater@   	next_chars          r   _split_by_backtickrk      s   $ JF	A$$K
c!f*t*"4"44"))5"''&/*BC"VFFA","8"8K J$:$::-.#a&1*_a%4I C'd+i0Q  d+"))4*AB!#Q&0&8&8 *"4"44","<"<K!Z%?%??aAhRVFV","4"4K*"4"44","<"<K!Z%?%??aAhRVFV","4"4Kd	Qa c!f*d 5"''&/23rJ   c              #     #    SR                  S [        U 5       5       5      n [        U 5      R                  n[        R
                  " U5      nU H  u  p4    nX44v   M     g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]).
r   c              3  T   #    U  H  u  pU(       a  [        US S 5      OUv   M      g7f)rL   N)rC   )r   is_backtick_quoted	substrings      r   r   "tokenize_string.<locals>.<genexpr>   s9       .H) " +9Qr?; .Hs   &(N)r   rk   r   readliner6   generate_tokens)sourceline_readertoken_generatorrH   rA   r!   s         r   rO   rO      sg       WW  .@-G F 6"++K..{;O#21an $3s   A!A#)r>   rN   returnrN   )rG   tuple[int, str]rw   rx   )r>   r   rw   r   )re   rN   rw   zlist[tuple[bool, str]])rt   rN   rw   zIterator[tuple[int, str]])__doc__
__future__r   enumr   ior   keywordr   r9   r6   typingr   collections.abcr   r	   rE   rC   rI   rR   rT   rk   rO   rX   rJ   r   <module>r      sY    #         7t4< K\rJ   