B
    v9aS2                 @   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rd dlmZ eddd dS )    )	iskeywordN)pyparse_c             C   s   g | ]}t |tkqS  )chr_ASCII_ID_CHARS).0xr   r   !/usr/lib/python3.7/hyperparser.py
<listcomp>   s    r      c             C   s   g | ]}t |tkqS r   )r   _ASCII_ID_FIRST_CHARS)r   r	   r   r   r
   r      s    c               @   s\   e Zd Zdd Zdd Zdd Zdd ZdddZedddhZ	e
dd ZdZdd ZdS )HyperParserc                sJ  | _ |j  _}t|j|j}dd }|||}|jsxh|jD ]^}t	|| d}t
|d }	d| }
|||	|
d  |||	}|d k	s|dkrFP qFW ||pd nF|d|}|r|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   ZlnocontextZstartatZstartatindexr   Zbodrr   )r   r
   __init__   s:    



zHyperParser.__init__c             C   s   t | jt | j|| j }|dk r2td| || _d| _x@| jt | jd k r~| j| jd  d | jk r~|  jd7  _q@W | jt | jd k r| j| jd  d | jkr| j	| jd  s|  jd7  _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k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kS )Nr   )#r+   r,   )r"   r*   r   r   )r   r   r   r
   
is_in_coden   s    zHyperParser.is_in_code([{Fc             C   sL  | j | j d }| j}x`| j| rL| j| j | d  |ksL| j | d |krv|d8 }|dk r`d S t|| j | d }qW | jd }x,|t| j k r| j | d |kr|d7 }qW | jd| jt| j| j | d  f }|t| j ks| j | d t| jkr|rd S | j}n.| 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bracketinglevelZbeforeZafterZbeforeindexZ
afterindexr   r   r
   get_surrounding_bracketst   s0    
""z$HyperParser.get_surrounding_bracketsTrueFalseNonec             C   sd  t }|}x<||krDt||d  dk rD|t||d   rD|d8 }q
W ||krt||d  dkrx0|d |krd||d |   r|d8 }qhW |d |krd||d |   r|d8 }|d |krd||d |   r|d8 }|||  s(dS n ||k r(tt||  s(dS ||k r\t||| r\||| | jkr\d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}xx||krf||d  | jkrf|d8 }qB|s||kr||d  dkr|d8 }d}qB||kr|dkr|||d  d  dkr|d8 }|| d }||d  d }qBP qBW |sP | |||}|r|| }|}d}q@||kr|| d }	x.|dkrT||d  d |	krT|d8 }q(W || d |krjP || d }|d8 }|| d }|}|| d	krn@|| d
krx*|dkr||d  dkr|d8 }qW |}P q@P q@W ||| j S )Nz?get_expression should only be called if index is inside a code.r   Tr   .r.   r8   Fz([z'"ZrRbBuU)r/   r(   r   r   r*   r)   _whitespace_charsrB   )
r   r   r   Z
brck_indexZ
brck_limitrA   Zlast_identifier_posZpostdot_phaseretlevelr   r   r
   get_expression   sb    

"zHyperParser.get_expressionN)r0   F)__name__
__module____qualname__r'   r#   r-   r/   r2   	frozensetr=   classmethodrB   rD   rG   r   r   r   r
   r      s   7
,:r   __main__)mainz"idlelib.idle_test.test_hyperparserr8   )	verbosity)keywordr   stringZidlelibr   rK   Zascii_lettersdigitsr   r   r    r9   r<   r   rH   ZunittestrN   r   r   r   r
   <module>   s     