§
    	�’j  ã                  ó²   — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	Z	ddl
Z
ddlmZ erddlmZmZ d	Zdd„Zdd„Zdd„Z G d„ de¦  «        Zdd„Zdd„ZdS ) z6
:func:`~pandas.eval` source string parsing functions
é    )Úannotations)ÚEnum)ÚStringIO)Ú	iskeywordN)ÚTYPE_CHECKING)ÚHashableÚIteratoréd   ÚnameÚstrÚreturnc                óÒ  ‡— |                       ¦   «         rt          | ¦  «        s| S d„ | D ¦   «         }d                     d„ |D ¦   «         ¦  «        } d„ t          j                             ¦   «         D ¦   «         Š‰                     ddddd	d
dddddœ
¦  «         d                     ˆfd„| D ¦   «         ¦  «        } d| › �} |                       ¦   «         st          d| › d�¦  «        ‚| S )aj  
    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  ó€   K  — | ]9}|d                       d„ |                     dd¦  «        D ¦   «         ¦  «        fV — Œ:dS )Ú c              3  ó4   K  — | ]}t          |¦  «        V — Œd S )N)Úchr)Ú.0Úbs     úMC:\Projects\DSCons\.venv\Lib\site-packages\pandas\core\computation\parsing.pyú	<genexpr>z;create_valid_python_identifier.<locals>.<genexpr>.<genexpr>+   s(   è è € ÐJÐJ˜q•C˜‘F”FÐJÐJÐJÐJÐJÐJó    ÚasciiÚbackslashreplaceN)ÚjoinÚencode)r   Úcs     r   r   z1create_valid_python_identifier.<locals>.<genexpr>*   se   è è € ð ð àð 
ˆB�GŠGÐJÐJ A§H¢H¨WÐ6HÑ$IÔ$IÐJÑJÔJÑJÔJÐKðð ð ð ð ð r   r   c              3  óX   K  — | ]%\  }}|                      d ||k    rdnd¦  «        V — Œ&dS )ú\Ú	_UNICODE_Ú_BACKSLASH_N)Úreplace)r   r   Ú	c_escapeds      r   r   z1create_valid_python_identifier.<locals>.<genexpr>.   sV   è è € ð ð áˆAˆyð 	×Ò˜$¨q°Iª~¨~  À=ÑQÔQðð ð ð ð ð r   c                óB   — i | ]\  }}|d t           j        |         › d �“ŒS )Ú_)ÚtokenÚtok_name)r   ÚcharÚtokvals      r   ú
<dictcomp>z2create_valid_python_identifier.<locals>.<dictcomp>6   sA   € ð 'ð 'ð 'áˆD�&ð 	Ð+•%”. Ô(Ð+Ð+Ð+ð'ð 'ð 'r   r$   Ú_QUESTIONMARK_Ú_EXCLAMATIONMARK_Ú_DOLLARSIGN_Ú
_EUROSIGN_Ú_DEGREESIGN_Ú_SINGLEQUOTE_Ú_DOUBLEQUOTE_Ú_HASH_Ú
_BACKTICK_)
ú Ú?ú!ú$u   â‚¬õ   Â°ú'ú"ú#ú`c                ó<   •— g | ]}‰                      ||¦  «        ‘ŒS © )Úget)r   r'   Úspecial_characters_replacementss     €r   ú
<listcomp>z2create_valid_python_identifier.<locals>.<listcomp>I   s*   ø€ ÐUÐUÐUÈÐ3×7Ò7¸¸dÑCÔCÐUÐUÐUr   ÚBACKTICK_QUOTED_STRING_zCould not convert 'z' to a valid Python identifier.)Úisidentifierr   r   ÚtokenizeÚEXACT_TOKEN_TYPESÚitemsÚupdateÚSyntaxError)r   Úgenr?   s     @r   Úcreate_valid_python_identifierrI      sT  ø€ ð ×ÒÑÔð ¥9¨T¡?¤?ð Øˆðð àðñ ô €Cð �7Š7ð ð àðñ ô ñ ô €Dð'ð 'å%Ô7×=Ò=Ñ?Ô?ð'ñ 'ô 'Ð#ð $×*Ò*àØ!Ø$ØØØ Ø Ø ØØð	
ð 	
ñô ð ð �7Š7ÐUÐUÐUÐUÐPTÐUÑUÔUÑVÔV€DØ+ TÐ+Ð+€Dà×ÒÑÔð WÝÐU°ÐUÐUÐUÑVÔVÐVà€Kr   Útokútuple[int, str]c                ó`   — | \  }}|t           k    rt          j        t          |¦  «        fS ||fS )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_STRINGrC   ÚNAMErI   )rJ   Útoknumr(   s      r   Úclean_backtick_quoted_toksrP   R   s9   € ð( �N€FˆFØÕ'Ò'Ð'ÝŒ}Õ<¸VÑDÔDÐDÐDØ�6ˆ>Ðr   r   c                óð   — 	 t          | t          ¦  «        r|                      dd¦  «        n| } t          d| › d�¦  «        }t	          |¦  «        d         }t          |¦  «        S # t          $ r | cY S w xY w)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.
    r;   z``é   )Ú
isinstancer   r!   Útokenize_stringÚnextrI   rG   )r   Ú	tokenizedr(   s      r   Úclean_column_namerW   l   s…   € ð&å*4°T½3Ñ*?Ô*?ÐIˆt�|Š|˜C Ñ&Ô&Ð&ÀTˆå# K¨ K K KÑ0Ô0ˆ	Ý�i‘” Ô#ˆÝ-¨fÑ5Ô5Ð5øÝð ð ð Øˆˆˆðøøøs   ‚A#A& Á&A5Á4A5c                  ó   — e Zd ZdZdZdZdZdS )Ú
ParseStater   rR   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚDEFAULTÚIN_BACKTICKÚIN_SINGLE_QUOTEÚIN_DOUBLE_QUOTEr=   r   r   rY   rY   Š   s"   € € € € € Ø€GØ€KØ€OØ€O€O€Or   rY   Úsúlist[tuple[bool, str]]c                ó€  — g }g }d}t           j        }|t          | ¦  «        k     �rë| |         }|xdk    �r |t           j        k    rA|r*|                     dd                     |¦  «        f¦  «         |g}|dz  }t           j        }Œv|t           j        k    r­|t          | ¦  «        dz
  k    r| |dz            nd}|dk    r0|                     |¦  «         |                     |¦  «         |dz  }Œß|                     |¦  «         |                     dd                     |¦  «        f¦  «         g }|dz  }t           j        }�Œ3n�xd	k    rJ |t           j        k    rt           j        }ny|t           j        k    r| |dz
           d
k    rt           j        }nMdk    rH|t           j        k    rt           j        }n+|t           j        k    r| |dz
           d
k    rt           j        }|                     |¦  «         |dz  }|t          | ¦  «        k     �°ë|r*|                     dd                     |¦  «        f¦  «         |S )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   r;   Fr   rR   NrZ   Tr8   r   r9   )rY   r_   ÚlenÚappendr   r`   ra   rb   )rc   Ú
substringsÚsubstrÚiÚparse_stater'   Ú	next_chars          r   Ú_split_by_backtickrm   ‘   sO  € ð$ €JØ€FØ	€AÝÔ$€KØ
�c�!‰fŒfŠ*‰*Ø�ŒtˆàØ�’‘�à¥*Ô"4Ò4Ð4Øð DØ"×)Ò)¨5°"·'²'¸&±/´/Ð*BÑCÔCÐCà"˜V�FØ˜‘F�AÝ",Ô"8�KØà ¥JÔ$:Ò:Ð:à-.µ#°a±&´&¸1±*ª_¨_  ! a¡%¤ À4�IØ  CÒ'Ð'ØŸš dÑ+Ô+Ð+ØŸš iÑ0Ô0Ð0Ø˜Q™˜Ø ð Ÿš dÑ+Ô+Ð+Ø"×)Ò)¨4°·²¸±´Ð*AÑBÔBÐBà!#˜Ø˜Q™˜Ý&0Ô&8˜Ù ð# ;ð$ �’��à¥*Ô"4Ò4Ð4Ý",Ô"<�K�Kà!¥ZÔ%?Ò?Ð?ÀaÈÈAÉÄhÐRVÒFVÐFVÝ",Ô"4�KøØ’�à¥*Ô"4Ò4Ð4Ý",Ô"<�K�Kà!¥ZÔ%?Ò?Ð?ÀaÈÈAÉÄhÐRVÒFVÐFVÝ",Ô"4�KØ�Š�dÑÔÐØ	ˆQ‰ˆða �c�!‰fŒfŠ*‰*ðd ð 4Ø×Ò˜5 "§'¢'¨&¡/¤/Ð2Ñ3Ô3Ð3àÐr   ÚsourceúIterator[tuple[int, str]]c              #  óÔ   K  — d                      d„ t          | ¦  «        D ¦   «         ¦  «        } t          | ¦  «        j        }t	          j        |¦  «        }|D ]\  }}}}}||fV — ŒdS )a$  
    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  óR   K  — | ]"\  }}|rt          |d d…         ¦  «        n|V — Œ#dS )rR   éÿÿÿÿN)rI   )r   Úis_backtick_quotedÚ	substrings      r   r   z"tokenize_string.<locals>.<genexpr>ï   s[   è è € ð ð ñ *Ð 	ð "ðÕ*¨9°Q°r°T¬?Ñ;Ô;Ð;àð	ð ð ð ð ð r   N)r   rm   r   ÚreadlinerC   Úgenerate_tokens)rn   Úline_readerÚtoken_generatorrO   r(   r$   s         r   rT   rT   ß   s›   è è € ð  �WŠWð ð õ .@ÀÑ-GÔ-Gðñ ô ñ ô €Fõ ˜6Ñ"Ô"Ô+€KÝÔ.¨{Ñ;Ô;€Oà#2ð ð Ñˆ�˜˜1˜aØ�fˆnÐÐÐÐðð r   )r   r   r   r   )rJ   rK   r   rK   )r   r   r   r   )rc   r   r   rd   )rn   r   r   ro   )Ú__doc__Ú
__future__r   Úenumr   Úior   Úkeywordr   r%   rC   Útypingr   Úcollections.abcr   r	   rM   rI   rP   rW   rY   rm   rT   r=   r   r   ú<module>r€      sS  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø  Ð  Ð  Ð  Ð  Ð  àð ðð ð ð ð ð ð ð ð Ð ð7ð 7ð 7ð 7ðtð ð ð ð4ð ð ð ð<ð ð ð ð �ñ ô ð ðKð Kð Kð Kð\ð ð ð ð ð r   