o
    =Zc*                     @   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.de(dee( defddZ-					d/dedee de.de.d ee  de$fd!dZ/d"ed#ede.fd$d%Z0	d.d&e'd'edee( dej$fd(d)Z1d*ede.fd+d,Z2e3d-kre4e5e2   dS dS )0zZParser 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                   @   sF   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ZdS )
ReleaseRangestartNend)default_factorytokensreturnc                 C   s   t | j}| j| | _d S N)lenr!   r   r   )selftotal_eaten r'   K/var/www/chikooza/env/lib/python3.10/site-packages/blib2to3/pgen2/driver.pylock9   s   
zReleaseRange.lock)r"   N)__name__
__module____qualname__int__annotations__r   r	   r   listr!   r   r   r)   r'   r'   r'   r(   r   3   s
   
 r   c                   @   sp   e Zd ZdeddfddZeded  fddZdedefd	d
Z	dddZ
defddZdedefddZdS )
TokenProxy	generatorr"   Nc                 C   s   || _ d| _g | _d S )Nr   )_tokens_counter_release_ranges)r%   r1   r'   r'   r(   __init__?   s   
zTokenProxy.__init__c                 c   s8    t | j}| j| z
| V  W |  d S |  w r#   )r   r3   r4   appendr)   )r%   release_ranger'   r'   r(   releaseD   s   
zTokenProxy.releasepointc                 C   sP   | j d j}|t|k r|| S |t|kr&t| j}|| |t|ks|S )N)r4   r!   r$   nextr2   r6   )r%   r9   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 ]'}|jd usJ |j|j}}|| j  kr|k r*n q|j| j|  } n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__toc                 C   s&   z|  | W dS  ty   Y dS w )NFT)r=   StopIteration)r%   r@   r'   r'   r(   can_advancel   s   zTokenProxy.can_advance)r"   r0   )r*   r+   r,   r   r5   r   r   r8   r-   r=   r>   r?   boolrB   r'   r'   r'   r(   r0   >   s    


r0   c                	   @   s   e Zd Zddedee ddfddZddee d	e	de
fd
dZddee d	e	de
fddZddee d	e	de
fddZ	ddedee d	e	de
fddZdded	e	de
fddZdededeeef fddZdS )r   Nr   loggerr"   c                 C   s"   || _ |d u rtt}|| _d S r#   )r   logging	getLoggerr*   rD   )r%   r   rD   r'   r'   r(   r5   x   s   

zDriver.__init__Fr!   debugc                 C   s   t |}t| j}|j|d d}d}g }d } }	 }
 }}d}|D ]}|\}}	}
}}|
||fkrc||f|
ksAJ ||f|
f|
\}}||k rU|d||  7 }|}d}||k rc|||| 7 }|}|tjtjfv r||	7 }|\}}|	dr~|d7 }d}q$|t	j
krtj|	 }|r|dusJ | jdt	j| |	| |t	jkr|t|	 ||	 }d}d}	n|t	jkr| }| ||\}}|tt||	||
fr|r| jd  n,d}|t	jt	jhv r|}|\}}|	dr|d7 }d}q$|
dusJ td	||	||
f|jdusJ |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opmaprD   rG   tok_nameINDENTr6   r$   DEDENTpop_partially_consume_prefixaddtokenr   r-   
ParseErrorrootnode)r%   r!   rG   rH   plinenocolumnindent_columnstypevaluer   r   	line_textprefix	quintuples_linenos_column_prefix_indent_colr'   r'   r(   parse_tokens~   st   





zDriver.parse_tokensstreamc                 C   s   t j|j| jd}| ||S )*Parse a stream and return the syntax tree.r   )r   generate_tokensreadliner   rf   )r%   rg   rG   r!   r'   r'   r(   parse_stream_raw   s   zDriver.parse_stream_rawc                 C   s   |  ||S )rh   )rl   )r%   rg   rG   r'   r'   r(   parse_stream   s   zDriver.parse_streamfilenameencodingc                 C   s@   t j|d|d}| ||W  d   S 1 sw   Y  dS )z(Parse a file and return the syntax tree.r)ro   N)ioopenrm   )r%   rn   ro   rG   rg   r'   r'   r(   
parse_file   s   
$zDriver.parse_filetextc                 C   s$   t jt|j| jd}| ||S )z*Parse a string and return the syntax tree.ri   )r   rj   rq   StringIOrk   r   rf   )r%   rt   rG   r!   r'   r'   r(   parse_string   s   zDriver.parse_stringr`   r[   c           	      C   s   g }d}d}d}|D ]C}||7 }|r;|dkr:|  r/||k r/d|}||t|d  f  S || d}d}d}q
|dv rD|d7 }q
|dkrKd}q
d}q
d||fS )NrI   r   FrJ   z 	r   T)stripjoinr$   r6   )	r%   r`   r[   linescurrent_linecurrent_columnwait_for_nlcharresr'   r'   r(   rU      s,   


z Driver._partially_consume_prefixr#   )F)NF)r*   r+   r,   r   r	   r   r5   r   r   rC   r   rf   r   r
   rl   rm   Pathrs   rv   r-   r   rU   r'   r'   r'   r(   r   w   s"    B
"gt	cache_dirr"   c                 C   sX   t j| \}}|dkrd}|| dtttj d }|r*t j|t j|S |S )Nz.txtrI   .z.pickle)	ospathsplitextrx   mapstrsysversion_infobasename)r   r   headtailnamer'   r'   r(   _generate_pickle_name   s   r   Grammar.txtTFgpsaveforcerD   c              
   C   s   |du r	t t}|du rt| n|}|st|| sQ|d|  t| }|rO|d| z|| W |S  t	yN } z|d| W Y d}~|S d}~ww |S t
 }|| |S )z'Load the grammar (maybe from a pickle).Nz!Generating grammar tables from %szWriting grammar tables to %szWriting failed: %s)rE   rF   r*   r   _newerinfor   generate_grammardumpOSErrorr   r   load)r   r   r   r   rD   ger'   r'   r(   r      s(   


abc                 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)r   r   existsgetmtime)r   r   r'   r'   r(   r     s
   r   packagegrammar_sourcec                 C   sj   t j|r|rt||nd}t||dS tt j||}t| |}|dus*J 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   )r   r   isfiler   r   r   pkgutilget_datar   r   loads)r   r   r   r   pickled_namedatar   r'   r'   r(   load_packaged_grammar!  s   
r   argsc                  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)levelrg   formatT)r   r   )tupler   argvrE   basicConfigINFOstdoutr   )r   r   r'   r'   r(   main9  s   r   __main__r#   )r   NTFN)6__doc__
__author____all__rq   r   rE   r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   
contextlibr   dataclassesr   r   rI   r   r   r   r   r   r   blib2to3.pytreer   blib2to3.pgen2.grammarr   blib2to3.pgen2.tokenizer   r   r   r   r0   objectr   r   rC   r   r   r   r   r*   exitr-   r'   r'   r'   r(   <module>   sn   8
9|


