a
    g	g)                     @   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'   X/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/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&   r1   r'   r'   r(   __init__?   s    zTokenProxy.__init__r"   c                 c   s8   t | j}| j| z| V  W |  n
|  0 d S r$   )r   r3   r4   appendr)   )r&   release_ranger'   r'   r(   releaseD   s
    
zTokenProxy.release)pointr#   c                 C   sJ   | j d j}|t|k r || S |t|krBt| j}|| q |S d S )N)r4   r!   r%   nextr2   r6   )r&   r9   Zeaten_tokensr   r'   r'   r(   eatO   s    
zTokenProxy.eatc                 C   s   | S r$   r'   )r&   r'   r'   r(   __iter__Y   s    zTokenProxy.__iter__c                 C   sr   | j D ]N}|jd usJ |j|j }}|| j  kr<|k rn q|j| j|  } q`qt| j}|  jd7  _|S )Nr   )r4   r   r   r3   r!   r;   r2   )r&   r7   r   r   r   r'   r'   r(   __next__\   s    

zTokenProxy.__next__)tor#   c                 C   s,   z|  | W n ty"   Y dS 0 dS d S )NFT)r<   StopIteration)r&   r?   r'   r'   r(   can_advancel   s
    zTokenProxy.can_advance)r*   r+   r,   r   r5   r   r   r8   r-   r<   r=   r>   boolrA   r'   r'   r'   r(   r0   >   s   

r0   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 u rtt}|| _d S r$   )r   logging	getLoggerr*   rC   )r&   r   rC   r'   r'   r(   r5   x   s    
zDriver.__init__F)r!   debugr#   c                 C   s8  t |}t| j}|j|d d}d}g }d } }	 }
 }}d}|D ]}|\}}	}
}}|
||fkr||f|
ksJ ||f|
f|
\}}||k r|d||  7 }|}d}||k r|||| 7 }|}|tjtjfv r||	7 }|\}}|	drH|d7 }d}qH|t	j
krtj|	 }|rD|dus,J | jdt	j| |	| |t	jkrp|t|	 ||	 }d}d}	n$|t	jkr| }| ||\}}|tt||	||
fr|r| jd  q"d}|t	jt	jhv r|}|\}}|	drH|d7 }d}qH|
dusJ td	||	||
f|jdus2J |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)r0   r   Parserr   setupr   COMMENTr   endswithr   OPopmaprC   rF   tok_nameINDENTr6   r%   DEDENTpop_partially_consume_prefixZaddtokenr   r-   
ParseErrorrootnode)r&   r!   rF   rG   plinenocolumnZindent_columnstypevaluer   r   Z	line_textprefixZ	quintupleZs_linenoZs_column_prefixZ_indent_colr'   r'   r(   parse_tokens~   sr    



zDriver.parse_tokens)streamrF   r#   c                 C   s   t j|j| jd}| ||S )*Parse a stream and return the syntax tree.r   )r   generate_tokensreadliner   r^   )r&   r_   rF   r!   r'   r'   r(   parse_stream_raw   s    zDriver.parse_stream_rawc                 C   s   |  ||S )r`   )rd   )r&   r_   rF   r'   r'   r(   parse_stream   s    zDriver.parse_stream)filenameencodingrF   r#   c                 C   s@   t j|d|d}| ||W  d   S 1 s20    Y  dS )z(Parse a file and return the syntax tree.r)rg   N)ioopenre   )r&   rf   rg   rF   r_   r'   r'   r(   
parse_file   s    zDriver.parse_file)textrF   r#   c                 C   s$   t jt|j| jd}| ||S )z*Parse a string and return the syntax tree.ra   )r   rb   ri   StringIOrc   r   r^   )r&   rl   rF   r!   r'   r'   r(   parse_string   s    zDriver.parse_string)r\   rY   r#   c           	      C   s   g }d}d}d}|D ]}||7 }|rv|dkr|  r^||k r^d|}||t|d  f  S || d}d}d}q|dv r|d7 }q|dkrd}qd}qd||fS )NrH   r   FrI   z 	r   T)stripjoinr%   r6   )	r&   r\   rY   linescurrent_lineZcurrent_columnZwait_for_nlcharresr'   r'   r(   rT      s*    


z Driver._partially_consume_prefix)N)F)F)F)NF)F)r*   r+   r,   r   r	   r   r5   r   r   rB   r   r^   r   r
   rd   re   Pathrk   rn   r-   r   rT   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.txtrH   .z.pickle)	ospathsplitextrp   mapstrsysversion_infobasename)rv   rw   headtailnamer'   r'   r(   _generate_pickle_name   s    r   Grammar.txtTF)rv   gpsaveforcerC   r#   c                 C   s|   |du rt t}|du r"t| n|}|s4t|| sft| }|rxz|| W qx tyb   Y qx0 nt	
 }|| |S )z'Load the grammar (maybe from a pickle).N)rD   rE   r*   r   _newerr   Zgenerate_grammardumpOSErrorr   r   load)rv   r   r   r   rC   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)ry   rz   existsgetmtime)r   r   r'   r'   r(   r     s
    r   )packagegrammar_sourcerw   r#   c                 C   sj   t j|r*|rt||nd}t||dS tt j||}t| |}|dusTJ 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   )ry   rz   isfiler   r   r   pkgutilget_datar   r   loads)r   r   rw   r   Zpickled_namedatar   r'   r'   r(   load_packaged_grammar   s    
r   )argsr#   c                  G   sF   | st tjdd } tjtjtjdd | D ]}t|ddd q.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~   argvrD   basicConfigINFOstdoutr   )r   rv   r'   r'   r(   main8  s    r   __main__)N)r   NTFN)N)6__doc__
__author____all__ri   ry   rD   r   r~   typingr   r   r   r   r   r	   r
   r   r   r   r   r   
contextlibr   Zdataclassesr   r   rH   r   r   r   r   r   r   Zblib2to3.pytreer   Zblib2to3.pgen2.grammarr   Zblib2to3.pgen2.tokenizer   r}   ru   r   r0   objectr   r   rB   r   r   r   r   r*   exitr-   r'   r'   r'   r(   <module>   sV   8
9|     
 

