Ë
    *�£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y)z6
:func:`~pandas.eval` source string parsing functions
é    )Úannotations)ÚEnum)ÚStringIO)Ú	iskeywordN)ÚTYPE_CHECKING)ÚHashableÚIteratoréd   c                ó  — | j                  «       rt        | «      s| S d„ | D «       }dj                  d„ |D «       «      } t        j                  j                  «       D ��ci c]  \  }}|dt        j                  |   › d�“Œ }}}|j                  dddddd	d
ddddœ
«       dj                  | D �cg c]  }|j                  ||«      ‘Œ c}«      } d| › �} | j                  «       st        d| › d�«      ‚| S c c}}w c c}w )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  óp   K  — | ].  }|d j                  d„ |j                  dd«      D «       «      f–— Œ0 y­w)Ú c              3  ó2   K  — | ]  }t        |«      –— Œ y ­w)N)Úchr)Ú.0Úbs     úAC:\FundamentalWorkbench\vendor\pandas\core\computation\parsing.pyÚ	<genexpr>z;create_valid_python_identifier.<locals>.<genexpr>.<genexpr>+   s   è ø€ ÐJÑ$I˜q”C˜—FÑ$Iùs   ‚ÚasciiÚbackslashreplaceN)ÚjoinÚencode)r   Úcs     r   r   z1create_valid_python_identifier.<locals>.<genexpr>*   s8   è ø€ ð áˆAð 
ˆB�G‰GÑJ A§H¡H¨WÐ6HÔ$IÓJÓJÔKÙùs   ‚46r   c              3  óT   K  — | ]   \  }}|j                  d ||k7  rdnd«      –— Œ" y­w)Ú\Ú	_UNICODE_Ú_BACKSLASH_N)Úreplace)r   r   Ú	c_escapeds      r   r   z1create_valid_python_identifier.<locals>.<genexpr>.   s1   è ø€ ð á‰LˆAˆyð 	×Ñ˜$¨q°Iª~¡À=×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_identifierrA      s5  € ð ×ÑÔ¤9¨T¤?Øˆñáó€Cð �7‰7ñ áóó €Dô &×7Ñ7×=Ñ=Ô?ô'á?‰LˆD�&ð 	�”%—.‘. Ñ(Ð)¨Ð+Ñ+Ø?ð $ñ 'ð $×*Ñ*àØ!Ø$ØØØ Ø Ø ØØñ	
ôð �7‰7ÑPTÓUÑPTÈÐ3×7Ñ7¸¸dÕCÐPTÑUÓV€DØ$ T FÐ+€Dà×ÑÔÜÐ/°¨vÐ5TÐUÓVÐVà€Kùó3'ùò& Vs   Á "C6Â0C<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_STRINGr4   ÚNAMErA   )ÚtokÚtoknumr?   s      r   Úclean_backtick_quoted_toksrG   R   s5   € ð( �N€FˆFØÔ'Ò'Ü�}‰}Ô<¸VÓDÐDÐDØ�6ˆ>Ðó    c                ó¾   — 	 t        | t        «      r| j                  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.
    r1   z``é   )Ú
isinstanceÚstrr   Útokenize_stringÚnextrA   r;   )r<   Ú	tokenizedr?   s      r   Úclean_column_namerP   l   sa   € ð&ä*4°T¼3Ô*?ˆt�|‰|˜C Ô&ÀTˆä# a¨ v¨Q KÓ0ˆ	Ü�i“ Ñ#ˆÜ-¨fÓ5Ð5øÜò ØŠðús   ‚AA ÁAÁAc                  ó   — e Zd ZdZdZdZdZy)Ú
ParseStater   rJ   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚDEFAULTÚIN_BACKTICKÚIN_SINGLE_QUOTEÚIN_DOUBLE_QUOTE© rH   r   rR   rR   Š   s   „ Ø€GØ€KØ€OØ�OrH   rR   c                óL  — g }g }d}t         j                  }|t        | «      k  �rÚ| |   }|xdk(  rù |t         j                  k(  r=|r"|j                  ddj	                  |«      f«       |g}|dz  }t         j
                  }Œk|t         j
                  k(  �rD|t        | «      dz
  k7  r| |dz      nd}|dk(  r(|j                  |«       |j                  |«       |dz  }ŒÇ|j                  |«       |j                  ddj	                  |«      f«       g }|dz  }t         j                  }�Œxd	k(  rT |t         j                  k(  rt         j                  }n†|t         j                  k(  rs| |dz
     d
k7  rht         j                  }nWdk(  rS|t         j                  k(  rt         j                  }n/|t         j                  k(  r| |dz
     d
k7  rt         j                  }	 |j                  |«       |dz  }|t        | «      k  r�ŒÚ|r"|j                  ddj	                  |«      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   r1   Fr   rJ   NrS   Tr.   r   r/   )rR   rX   ÚlenÚappendr   rY   rZ   r[   )ÚsÚ
substringsÚsubstrÚiÚparse_stater>   Ú	next_chars          r   Ú_split_by_backtickrf   ‘   sò  € ð$ €JØ€FØ	€AÜ×$Ñ$€KØ
Œc�!‹f‹*Ø�‰tˆàÝà¤*×"4Ñ"4Ò4ÙØ"×)Ñ)¨5°"·'±'¸&³/Ð*BÔCà"˜V�FØ˜‘F�AÜ",×"8Ñ"8�KØà ¤J×$:Ñ$:Ó:à-.´#°a³&¸1±*ª_  ! a¡%¢À4�IØ  CÒ'ØŸ™ dÔ+ØŸ™ iÔ0Ø˜Q™˜Ø ð Ÿ™ dÔ+Ø"×)Ñ)¨4°·±¸³Ð*AÔBà!#˜Ø˜Q™˜Ü&0×&8Ñ&8˜Ù Ýà¤*×"4Ñ"4Ò4Ü",×"<Ñ"<‘Kà!¤Z×%?Ñ%?Ò?ÀaÈÈAÉÁhÐRVÒFVÜ",×"4Ñ"4‘KÛà¤*×"4Ñ"4Ò4Ü",×"<Ñ"<‘Kà!¤Z×%?Ñ%?Ò?ÀaÈÈAÉÁhÐRVÒFVÜ",×"4Ñ"4‘KØ�‰�dÔØ	ˆQ‰ˆða Œc�!‹fŒ*ñd Ø×Ñ˜5 "§'¡'¨&£/Ð2Ô3àÐrH   c              #  óÈ   K  — dj                  d„ t        | «      D «       «      } t        | «      j                  }t	        j
                  |«      }|D ]  \  }}}}}||f–— Œ y­w)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  óF   K  — | ]  \  }}|rt        |d d «      n|–— Œ y­w)rJ   éÿÿÿÿN)rA   )r   Úis_backtick_quotedÚ	substrings      r   r   z"tokenize_string.<locals>.<genexpr>ï   s<   è ø€ ð ñ .HÑ)Ð 	ñ "ô +¨9°Q°r¨?Ô;àóñ .Hùs   ‚!N)r   rf   r   Úreadliner4   Úgenerate_tokens)ÚsourceÚline_readerÚtoken_generatorrF   r?   r   s         r   rM   rM   ß   sl   è ø€ ð  �W‰Wñ ô .@ÀÔ-Góó €Fô ˜6Ó"×+Ñ+€KÜ×.Ñ.¨{Ó;€Oã#2Ñˆ�˜˜1˜aØ�fˆnÓñ $3ùs   ‚A A")r<   rL   ÚreturnrL   )rE   útuple[int, str]rq   rr   )r<   r   rq   r   )r`   rL   rq   zlist[tuple[bool, str]])rn   rL   rq   zIterator[tuple[int, str]])Ú__doc__Ú
__future__r   Úenumr   Úior   Úkeywordr   r7   r4   Útypingr   Úcollections.abcr   r	   rC   rA   rG   rP   rR   rf   rM   r\   rH   r   Ú<module>rz      sY   ðñõ #å Ý Ý Û Û Ý  á÷ð Ð ó7ótó4ô<�ô óKô\rH   