
\[\P                 @   s  d  d l  Z  d  d l Z d  d l m Z d  d l m Z e d  \ Z Z Z	 Z
 Z e  j d e  j e  j B j Z e  j d e  j  j Z e  j d e  j e  j B j Z e  j d e  j  j Z e  j d	 e  j  j Z e  j d
 e  j  j Z Gd d   d e  Z Gd d   d  Z d S)    N)Mapping)partial   z
    ^
    [ \t]*
    (?: while
    |   else
    |   def
    |   return
    |   assert
    |   break
    |   class
    |   continue
    |   elif
    |   try
    |   except
    |   raise
    |   import
    |   yield
    )
    \b
z'
    [ \t]*
    (?: \# \S .* )?
    \n
aK  
    \""" [^"\\]* (?:
                     (?: \\. | "(?!"") )
                     [^"\\]*
                 )*
    (?: \""" )?

|   " [^"\\\n]* (?: \\. [^"\\\n]* )* "?

|   ''' [^'\\]* (?:
                   (?: \\. | '(?!'') )
                   [^'\\]*
                )*
    (?: ''' )?

|   ' [^'\\\n]* (?: \\. [^'\\\n]* )* '?
zM
    [ \t]*
    [^\s#\\]    # if we match, m.end()-1 is the interesting char
z_
    \s*
    (?: return
    |   break
    |   continue
    |   raise
    |   pass
    )
    \b
z
    [^[\](){}#'"\\]+
c               @   sU   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 d d  Z d
 S)StringTranslatePseudoMappingaT  Utility class to be used with str.translate()

    This Mapping class wraps a given dict. When a value for a key is
    requested via __getitem__() or get(), the key is looked up in the
    given dict. If found there, the value from the dict is returned.
    Otherwise, the default value given upon initialization is returned.

    This allows using str.translate() to make some replacements, and to
    replace all characters for which no replacement was specified with
    a given character instead of leaving them as-is.

    For example, to replace everything except whitespace with 'x':

    >>> whitespace_chars = ' \t\n\r'
    >>> preserve_dict = {ord(c): ord(c) for c in whitespace_chars}
    >>> mapping = StringTranslatePseudoMapping(preserve_dict, ord('x'))
    >>> text = "a + b\tc\nd"
    >>> text.translate(mapping)
    'x x x\tx\nx'
    c             C   s4   | |  _  | |  _ | j | d d  } | |  _ d  S)Nc             S   s   | |  |  S)N )key_getZ_defaultr   r   %/usr/lib/python3.4/idlelib/PyParse.pyr   z   s    z3StringTranslatePseudoMapping.__init__.<locals>._get)_non_defaultsZ_default_valuegetr   )selfZnon_defaultsdefault_valuer   r   r   r	   __init__v   s    		z%StringTranslatePseudoMapping.__init__c             C   s   |  j  |  S)N)r   )r   itemr   r   r	   __getitem__~   s    z(StringTranslatePseudoMapping.__getitem__c             C   s   t  |  j  S)N)lenr
   )r   r   r   r	   __len__   s    z$StringTranslatePseudoMapping.__len__c             C   s   t  |  j  S)N)iterr
   )r   r   r   r	   __iter__   s    z%StringTranslatePseudoMapping.__iter__Nc             C   s   |  j  |  S)N)r   )r   r   defaultr   r   r	   r      s    z StringTranslatePseudoMapping.get)	__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r	   r   a   s   r   c               @   sB  e  Z d  Z d d   Z d d   Z d e d d  Z d d	   Z i  Z e j	 d
 d   d D  e j	 d d   d D  e j	 d d   d D  e
 e d e d  Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z d Z d% d&   Z d Z d' d(   Z d S))Parserc             C   s   | |  _  | |  _ d  S)N)indentwidthtabwidth)r   r   r   r   r   r	   r      s    	zParser.__init__c             C   s>   t  |  d k s( | d d k s( t  | |  _ d |  _ d  S)Nr      
)r   AssertionErrorstrstudy_level)r   sr   r   r	   set_str   s    (	zParser.set_strNc       
      C   sT  |  j  d  } } | s d  St |  } x t d  D] } | j d d |  } | d k  r^ Pn  | j d d |  d } | | | |  } | r | | j    r | j   } Pn  | } q3 W| d  k r | |  } | r | | j    r | j   } n  | S| d } xC | | |  } | rL| j   \ }	 } | |	  sM|	 } qMqPq| S)Nr   z:
r   r   r   )r!   r   rangerfindstartspan)
r   Zis_char_in_string_synchrer!   poslimitZtriesimr#   r   r   r	   find_good_parse_start   s8    
	
zParser.find_good_parse_startc             C   sR   | d k s) |  j  | d d k s) t  | d k rN |  j  | d   |  _  n  d  S)Nr   r   r   )r!   r    )r   lor   r   r	   set_lo   s    )zParser.set_loc             c   s'   |  ] } t  |  t  d   f Vq d S)(N)ord).0cr   r   r	   	<genexpr>   s    zParser.<genexpr>z({[c             c   s'   |  ] } t  |  t  d   f Vq d S))N)r2   )r3   r4   r   r   r	   r5      s    z)}]c             c   s'   |  ] } t  |  t  |  f Vq d  S)N)r2   )r3   r4   r   r   r	   r5      s    z"'\
#r   xc             C   s  |  j  d k r d  Sd |  _  |  j } | j |  j  } | j d d  } | j d d  } | j d d  } | j d d  } | j d d  } t } d } } d g |  _ } | j } d t |  } } x| | k  r| | }	 | d } |	 d k rq n  |	 d k r7| d } | d k r | |  q q n  |	 d	 k rS| d } q n  |	 d
 k rx| r | d } q q n  |	 d k s|	 d k r|	 }
 | | d | d  |
 d k r|
 d }
 n  | } t |
  d } | | } x| | k  r| | }	 | d } |	 d k rqn  | | d | |  |
 k rF| | } Pn  |	 d k r| d } | d k r| d k r| |  n  Pqqn  |	 d k r| | k  st	  | | d k r| d } n  | d } qqqW| d | k rt
 } q t } q n  |	 d k r5| j d |  } | d k s t	  q n  |	 d k sGt	  | | k  sYt	  | | d k r| d } | d | k rt } qn  | d } q W| t
 k r| t k r| d k rt } n  | |  _ | t k | d | k k st	  | d | k r| |  n  d  S)Nr   Zxxxxxxxxr7   ZxxxxZxxz
xr   r   r1   r6   "'      \#r   r   )r"   r!   	translate_tranreplaceC_NONE	goodlinesappendr   r    C_STRING_FIRST_LINEC_STRING_NEXT_LINESfindC_BACKSLASH	C_BRACKETcontinuation)r   r!   rI   levelZlnorB   Z	push_goodr,   nchZquoteZfirstlnowr   r   r	   _study1   s    		
	



"






	
		"zParser._study1c             C   s   |  j    |  j S)N)rN   rI   )r   r   r   r	   get_continuation_typeh  s    
zParser.get_continuation_typec             C   s  |  j  d k r d  S|  j   d |  _  |  j |  j } } t |  d } t |  } x| | r | sj t  | } x@ t | | d | |  D]# } | j d d | d  d } q Wt | |  r | d } qX PqX W| d k r | d k s t  | } n  | | |  _	 |  _
 d } g  } | j }	 | d f g }
 xu| | k  rt | | |  } | r| j   } | d } x* | | k r| | d k r| d } qrW| | k r| | } n  | } | | k rPqn  | | } | d k r|	 |  |
 j | t |  f  | } | d } q5n  | d k rh| r9| d =n  | } | d } |
 j | t |  f  q5n  | d	 k s| d
 k r|
 j | t |  d f  | } t | | |  j   } |
 j | t |  f  q5n  | d k rM|
 j | t |  d f  | j d | |  d } | d k s.t  |
 j | t |  f  q5n  | d k s_t  | d } | | k  s{t  | | d k r| | | } n  | d } q5W| |  _ | r| d |  _ n  t |
  |  _ d  S)Nr:   r   r   r    z 	
z([{z)]}r8   r9   r=   r<   r   r   )r"   rN   r!   rB   r   r    r%   r&   _junkre
stmt_startstmt_endrC   _chew_ordinaryreend_match_stringrerF   lastchlastopenbracketpostuplestmt_bracketing)r   r!   rB   r,   pqZnothingrW   stackZ
push_stackZ
bracketingr-   ZnewprL   r   r   r	   _study2}  s    
		"!		






	zParser._study2c             C   s  |  j    |  j t k s t  |  j } |  j } t |  } | j d d |  d } } | d } x | | k  r t | |  } | r | j	   d } d } Pqg | j
 d |  d } } qg W| } } x | | d k r | d } q W|  j } t | | |  j |  j   | S)Nr   r   r   z 	)r^   rI   rH   r    rX   r!   r   r&   _itemrerU   rF   r   
expandtabsr   )r   jr!   rK   Zorigir,   r-   Zextrar   r   r	   compute_bracket_indent  s&    
		

	zParser.compute_bracket_indentc             C   s#   |  j    |  j } | d | d S)Nr   r:   r   )rN   rB   )r   rB   r   r   r	   get_num_lines_in_stmt	  s    
	zParser.get_num_lines_in_stmtc             C   s  |  j    |  j t k s t  |  j } |  j } x | | d k rQ | d } q4 W| } | j d |  d } d } } x| | k  r| | } | d k r | d } | d } q{ | d k r | r | d } n  | d } q{ | d k s | d k rt | | |  j   } q{ | d	 k r#Pq{ | d k ry| d
 k ry| d k s[| | d d k ry| | d d
 k ryd } Pq{ | d } q{ W| r| d } t	 j
 d | | |   d  k } n  | s| } x! | | d k r| d } qWn  t | |  j |  j |  j   d S)Nz 	r   r   r   z([{z)]}r8   r9   r=   =z=<>!z\s*\\z 	
)r^   rI   rG   r    r!   rR   rF   rV   rU   rematchr   r`   r   )r   r!   r,   startposendposfoundrJ   rL   r   r   r	   compute_backslash_indent  sJ    
		


 
%zParser.compute_backslash_indentc             C   sg   |  j    |  j |  j } } | } |  j } x* | | k  rX | | d k rX | d } q/ W| | |  S)Nz 	r   )r^   rR   rS   r!   )r   r,   rK   ra   r!   r   r   r	   get_base_indent_stringG  s    
	zParser.get_base_indent_stringc             C   s   |  j    |  j d k S)N:)r^   rW   )r   r   r   r	   is_block_openerR  s    
zParser.is_block_openerc             C   s#   |  j    t |  j |  j  d  k	 S)N)r^   _closerer!   rR   )r   r   r   r	   is_block_closerX  s    
zParser.is_block_closerc             C   s   |  j    |  j S)N)r^   rX   )r   r   r   r	   get_last_open_bracket_pos_  s    
z Parser.get_last_open_bracket_posc             C   s   |  j    |  j S)N)r^   rZ   )r   r   r   r	   get_last_stmt_bracketingh  s    
zParser.get_last_stmt_bracketing)r   r   r   r   r$   r)   r.   r0   r?   updater   r2   rN   rO   r^   rb   rd   rk   rl   rn   rp   rX   rq   rZ   rr   r   r   r   r	   r      s.   3	m	5r   )rf   syscollectionsr   	functoolsr   r%   rA   rG   rD   rE   rH   compileVERBOSE	MULTILINEsearchr)   rg   rQ   DOTALLrV   r_   ro   rT   r   r   r   r   r   r	   <module>   s   	*