o
     JAfY2                     @   s   	 d dl mZ d dlZd dlmZ eejej d Zeejd Z	dd e
dD Zdd e
dD ZG d	d
 d
ZedkrMd dlmZ eddd dS dS )    )	iskeywordN)pyparse_c                 C      g | ]}t |tv qS  )chr_ASCII_ID_CHARS.0xr   r   */usr/lib/python3.10/idlelib/hyperparser.py
<listcomp>       r      c                 C   r   r   )r   _ASCII_ID_FIRST_CHARSr	   r   r   r   r      r   c                   @   sZ   e Zd Zdd Zdd Zdd Zdd ZdddZeh dZ	e
dd ZdZdd ZdS )HyperParserc                    sJ  	 | _ |j  _}t|j|j}dd }|||}|js\|jD ]0}t	|| d}t
|d }	d| }
|||	|
d  |||	}|d usQ|dkrS nq#||pYd n#|d|}|ri|d }	nd	}	d| }
|||	|
d  |d |jd d
  _|
 _|  _ fddtt jD  _ | d S )Nc                 S   s   t t| S )N)intfloat)indexr   r   r   
index2line"   s   z(HyperParser.__init__.<locals>.index2line   z.0z%d.endz 
r   Zconsolez1.0c                    s4   g | ]}|d ko j | d  j |d  d kqS )r   r   )
bracketing)r
   iselfr   r   r   K   s
    z(HyperParser.__init__.<locals>.<listcomp>)editwintextr   ZParserZindentwidthZtabwidthr   Zprompt_last_lineZnum_context_linesmaxreprZset_codegetZfind_good_parse_startZ_build_char_in_string_funcZset_loZtag_prevrangecoderawtextstopatindexZget_last_stmt_bracketingr   rangelenisopener	set_index)r   r   r   r   parserr   lnocontextZstartatZstartatindexr#   Zbodrr   r   r   __init__   sB   




zHyperParser.__init__c                 C   s  	 t | jt | j|| j }|dk rtd| || _d| _| jt | jd k rU| j| jd  d | jk rU|  jd7  _| jt | jd k rU| j| jd  d | jk s7| jt | jd k r}| j| jd  d | jkr| j	| jd  s|  jd7  _d S d S d S d S )Nr   z(Index %s precedes the analyzed statementr   )
r%   r"   r   r    r#   
ValueErrorindexinrawtextindexbracketr   r&   )r   r   r.   r   r   r   r'   Q   s,   zHyperParser.set_indexc                 C   s(   	 | j | j o| j| j| j d  dv S )Nr   )"'r&   r/   r"   r   r   r   r   r   is_in_stringf   s   zHyperParser.is_in_stringc                 C   s*   	 | j | j  p| j| j| j d  dvS )Nr   )#r0   r1   r2   r   r   r   r   
is_in_coden   s   zHyperParser.is_in_code([{Fc                 C   s  	 | j | j d }| j}| j| r&| j| j | d  |vs&| j | d |krT|d8 }|dk r0d S t|| j | d }| j| r&| j| j | d  |vs&| j | d |ks&| jd }|t| j k r}| j | d |kr}|d7 }|t| j k r}| j | d |ksi| jd| jt| j| j | d  f }|t| j ks| j | d t| jkr|rd S | j}||fS | jd| jt| j| j | d d  f }||fS )Nr   r   z%s-%dc)	r   r/   r&   r"   minr%   r   r   r#   )r   ZopenersZ	mustcloseZbracketinglevelbeforeZafterZbeforeindexZ
afterindexr   r   r   get_surrounding_bracketst   sD   


z$HyperParser.get_surrounding_brackets>   FalseNoneTruec                 C   s  	 t }|}||kr9t||d  dk r9|t||d   r9|d8 }||kr9t||d  dk r9|t||d   s||krt||d  dkr|d |krod||d |   ro|d8 }|d |krod||d |   sY|d |krd||d |   r|d8 }|d |krd||d |   r|d8 }|||  sdS n||k rtt||  sdS ||k rt||| r||| | jvrdS || S )Nr   r      a   r   )_IS_ASCII_ID_CHARordisidentifier_IS_ASCII_ID_FIRST_CHARr   _ID_KEYWORDS)clsstrlimitposZis_ascii_id_charr   r   r   r   _eat_identifier   s@   	$$$$zHyperParser._eat_identifierz 	
\c           
      C   s   	 |   s	td| j}| j}| j}|| d }| j}|}d}	 	 ||kr3||d  | jv r3|d8 }n=|sH||krH||d  dkrH|d8 }d}n(||kro|dkro|||d  d  dkro|d8 }|| d }||d  d }nnq!|stn| |||}|r|| }|}d}nr||kr|| d }	|dkr||d  d |	kr|d8 }|dkr||d  d |	ks|| d |krn@|| d }|d8 }|| d }|}|| d	v rn&|| d
v r|dkr||d  dv r|d8 }|dkr||d  dv s|}nnq ||| j S )Nz?get_expression should only be called if index is inside a code.r   Tr   .r4   r?   Fz([z'"ZrRbBuU)r5   r-   r"   r   r/   r.   _whitespace_charsrI   )
r   r"   r   Z
brck_indexZ
brck_limitrH   Zlast_identifier_posZpostdot_phaseretlevelr   r   r   get_expression   sl   
CzHyperParser.get_expressionN)r6   F)__name__
__module____qualname__r,   r'   r3   r5   r9   	frozensetrD   classmethodrI   rK   rN   r   r   r   r   r      s    7
,
9r   __main__)mainz"idlelib.idle_test.test_hyperparserr?   )	verbosity)keywordr   stringZidlelibr   rR   ascii_lettersdigitsr   r   r$   r@   rC   r   rO   ZunittestrU   r   r   r   r   <module>   s       