B
    Khh)                 @   s  d Z dZddgZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ d	d
lmZmZmZmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ee'df Z(eG dd dZ)G dd dZ*G dd de+Z,d'e(ee( edddZ-d(eee e.e.ee  e$dddZ/eee.dddZ0d)e'eee( ej$d d!d"Z1ee.d#d$d%Z2e3d&kre4e5e2   dS )*zZParser driver.

This provides a high-level interface to parse a file into a syntax tree.

z#Guido van Rossum <guido@python.org>Driverload_grammar    N)AnycastIOIterableListOptionalTextIteratorTupleTypeVarGenericUnion)contextmanager)	dataclassfield   )grammarparsetokentokenizepgen)Logger)NL)Grammar)GoodTokenInfozos.PathLike[str]c               @   sJ   e Zd ZU eed< dZee ed< eedZ	e
e ed< ddddZdS )	ReleaseRangestartNend)default_factorytokens)returnc             C   s   t | j}| j| | _d S )N)lenr!   r   r   )selfZtotal_eaten r%   8/tmp/pip-install-vv81h98y/black/blib2to3/pgen2/driver.pylock9   s    
zReleaseRange.lock)__name__
__module____qualname__int__annotations__r   r	   r   listr!   r   r   r'   r%   r%   r%   r&   r   3   s   
r   c               @   sn   e Zd ZeddddZeed  dddZeedd	d
Z	d dddZ
edddZeedddZdS )
TokenProxyN)	generatorr"   c             C   s   || _ d| _g | _d S )Nr   )_tokens_counter_release_ranges)r$   r/   r%   r%   r&   __init__?   s    zTokenProxy.__init__)r"   c             c   s0   t | j}| j| z
| V  W d |  X d S )N)r   r1   r2   appendr'   )r$   release_ranger%   r%   r&   releaseD   s
    

zTokenProxy.release)pointr"   c             C   sN   | j d j}|t|k r || S x$|t|krDt| j}|| q"W |S d S )N)r2   r!   r#   nextr0   r4   )r$   r7   Zeaten_tokensr   r%   r%   r&   eatO   s    
zTokenProxy.eatc             C   s   | S )Nr%   )r$   r%   r%   r&   __iter__Y   s    zTokenProxy.__iter__c             C   st   x`| j D ]L}|jd k	st|j|j }}|| j  kr>|k rn q|j| j|  }P qW t| j}|  jd7  _|S )Nr   )r2   r   AssertionErrorr   r1   r!   r9   r0   )r$   r5   r   r   r   r%   r%   r&   __next__\   s    
zTokenProxy.__next__)tor"   c             C   s,   y|  | W n tk
r"   dS X dS d S )NFT)r:   StopIteration)r$   r>   r%   r%   r&   can_advancel   s
    zTokenProxy.can_advance)r(   r)   r*   r   r3   r   r   r6   r+   r:   r;   r=   boolr@   r%   r%   r%   r&   r.   >   s   

r.   c               @   s   e Zd Zdeee ddddZdee e	e
dddZdee e	e
d	d
dZdee e	e
d	ddZdeee e	e
dddZdee	e
dddZeeeeef dddZdS )r   N)r   loggerr"   c             C   s"   || _ |d krtt}|| _d S )N)r   logging	getLoggerr(   rB   )r$   r   rB   r%   r%   r&   r3   x   s    
zDriver.__init__F)r!   debugr"   c             C   s:  t |}t| j}|j|d d}d}g }d } }	 }
 }}d}x|D ]}|\}}	}
}}|
||fkr||f|
kst||f|
f|
\}}||k r|d||  7 }|}d}||k r|||| 7 }|}|tjtjfkr||	7 }|\}}|		drL|d7 }d}qL|t
jkrtj|	 }|rH|dk	s0t| jdt
j| |	| |t
jkrt|t|	 ||	 }d}d}	n$|t
jkr| }| ||\}}|tt||	||
fr|r| jd P d}|t
jt
jhkr|}|\}}|		drL|d7 }d}qLW |
dk	sttd	||	||
f|jdk	s4t|jS )
z4Parse a series of tokens and return the syntax tree.)proxyr   r   N 
z%s %r (prefix=%r)zStop.zincomplete input)r.   r   Parserr   setupr<   r   COMMENTr   endswithr   OPopmaprB   rE   tok_nameINDENTr4   r#   DEDENTpop_partially_consume_prefixZaddtokenr   r+   
ParseErrorrootnode)r$   r!   rE   rF   plinenocolumnZindent_columnstypevaluer   r   Z	line_textprefixZ	quintupleZs_linenoZs_column_prefixZ_indent_colr%   r%   r&   parse_tokens~   sp    


zDriver.parse_tokens)streamrE   r"   c             C   s   t j|j| jd}| ||S )z*Parse a stream and return the syntax tree.)r   )r   generate_tokensreadliner   r]   )r$   r^   rE   r!   r%   r%   r&   parse_stream_raw   s    zDriver.parse_stream_rawc             C   s   |  ||S )z*Parse a stream and return the syntax tree.)ra   )r$   r^   rE   r%   r%   r&   parse_stream   s    zDriver.parse_stream)filenameencodingrE   r"   c          	   C   s(   t j|d|d}| ||S Q R X dS )z(Parse a file and return the syntax tree.r)rd   N)ioopenrb   )r$   rc   rd   rE   r^   r%   r%   r&   
parse_file   s    zDriver.parse_file)textrE   r"   c             C   s$   t jt|j| jd}| ||S )z*Parse a string and return the syntax tree.)r   )r   r_   rf   StringIOr`   r   r]   )r$   ri   rE   r!   r%   r%   r&   parse_string   s    zDriver.parse_string)r[   rX   r"   c       	      C   s   g }d}d}d}x|D ]}||7 }|rt|dkr|  r\||k r\d|}||t|d  fS || d}d}d}q|dkr|d7 }q|dkrd}qd}qW d||fS )NrG   r   FrH   z 	r   T)stripjoinr#   r4   )	r$   r[   rX   linescurrent_lineZcurrent_columnZwait_for_nlcharresr%   r%   r&   rS      s*    



z Driver._partially_consume_prefix)N)F)F)F)NF)F)r(   r)   r*   r   r	   r   r3   r   r   rA   r   r]   r   r
   ra   rb   Pathrh   rk   r+   r   rS   r%   r%   r%   r&   r   w   s   B)gt	cache_dirr"   c             C   s\   t j| \}}|dkrd}|| dtttj d }|rTt j|t j|S |S d S )Nz.txtrG   .z.pickle)	ospathsplitextrm   mapstrsysversion_infobasename)rs   rt   headtailnamer%   r%   r&   _generate_pickle_name   s    r   Grammar.txtTF)rs   gpsaveforcerB   r"   c             C   s~   |dkrt t}|dkr"t| n|}|s4t|| sht| }|rzy|| W qz tk
rd   Y qzX nt	
 }|| |S )z'Load the grammar (maybe from a pickle).N)rC   rD   r(   r   _newerr   Zgenerate_grammardumpOSErrorr   r   load)rs   r   r   r   rB   gr%   r%   r&   r      s    


)abr"   c             C   s8   t j| sdS t j|s dS t j| t j|kS )z0Inquire whether file a was written since file b.FT)rv   rw   existsgetmtime)r   r   r%   r%   r&   r     s
    r   )packagegrammar_sourcert   r"   c             C   sj   t j|r*|rt||nd}t||dS tt j||}t| |}|dk	sTtt	
 }|| |S )a  Normally, loads a pickled grammar by doing
        pkgutil.get_data(package, pickled_grammar)
    where *pickled_grammar* is computed from *grammar_source* by adding the
    Python version and using a ``.pickle`` extension.

    However, if *grammar_source* is an extant file, load_grammar(grammar_source)
    is called instead. This facilitates using a packaged grammar file when needed
    but preserves load_grammar's automatic regeneration behavior when possible.

    N)r   )rv   rw   isfiler   r   r}   pkgutilget_datar<   r   r   loads)r   r   rt   r   Zpickled_namedatar   r%   r%   r&   load_packaged_grammar   s    
r   )argsr"   c              G   sJ   | st tjdd } tjtjtjdd x| D ]}t|ddd q0W dS )zMain program, when run as a script: produce grammar pickle files.

    Calls load_grammar for each argument, a path to a grammar text file.
    r   Nz%(message)s)levelr^   formatT)r   r   )tupler{   argvrC   basicConfigINFOstdoutr   )r   rs   r%   r%   r&   main8  s    
r   __main__)N)r   NTFN)N)6__doc__
__author____all__rf   rv   rC   r   r{   typingr   r   r   r   r   r	   r
   r   r   r   r   r   
contextlibr   Zdataclassesr   r   rG   r   r   r   r   r   r   Zblib2to3.pytreer   Zblib2to3.pgen2.grammarr   Zblib2to3.pgen2.tokenizer   rz   rr   r   r.   objectr   r   rA   r   r   r   r   r(   exitr+   r%   r%   r%   r&   <module>   s@   89|    

