o
    hE)                     @   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	 ddl
mZmZ ddlmZ dd	l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 ddlmZ ddlmZm Z m!Z!m"Z"m#Z# ee$df Z%eG dd dZ&G dd dZ'G dd d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%Z,	d.d&e$d'e$dee% dejfd(d)Z-d*e$de*fd+d,Z.e/d-kre0e1e.   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)contextmanager)	dataclassfield)Logger)	IOAnyIterableIteratorListOptionalTupleUnioncast)Grammar)GoodTokenInfo)NL   )grammarparsepgentokentokenizez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/html/ai/venv/lib/python3.10/site-packages/blib2to3/pgen2/driver.pylock-   s   
zReleaseRange.lock)r   N)__name__
__module____qualname__int__annotations__r   r   r   listr   r   r	   r&   r$   r$   r$   r%   r   '   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"   r.   r$   r$   r%   __init__3   s   
zTokenProxy.__init__c                 c   s8    t | j}| j| z
| V  W |  d S |  w r    )r   r0   r1   appendr&   )r"   release_ranger$   r$   r%   release8   s   
zTokenProxy.releasepointc                 C   sP   | j d j}|t|k r|| S |t|kr&t| j}|| |t|ks|S )N)r1   r   r!   nextr/   r3   )r"   r6   eaten_tokensr   r$   r$   r%   eatC   s   

zTokenProxy.eatc                 C   s   | S r    r$   )r"   r$   r$   r%   __iter__M   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   )r1   r   r   r0   r   r8   r/   )r"   r4   r   r   r   r$   r$   r%   __next__P   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_advance`   s   zTokenProxy.can_advance)r   r-   )r'   r(   r)   r	   r2   r   r   r5   r*   r:   r;   r<   boolr?   r$   r$   r$   r%   r-   2   s    


r-   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'   rA   )r"   r   rA   r$   r$   r%   r2   l   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)r-   r   Parserr   setupr   COMMENTr   endswithr   OPopmaprA   rD   tok_nameINDENTr3   r!   DEDENTpop_partially_consume_prefixaddtokenr   r*   
ParseErrorrootnode)r"   r   rD   rE   plinenocolumnindent_columnstypevaluer   r   	line_textprefix	quintuples_linenos_column_prefix_indent_colr$   r$   r%   parse_tokensr   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   rc   )r"   rd   rD   r   r$   r$   r%   parse_stream_raw   s   zDriver.parse_stream_rawc                 C   s   |  ||S )re   )ri   )r"   rd   rD   r$   r$   r%   parse_stream   s   zDriver.parse_streamfilenameencodingc                 C   s<   t ||d}| ||W  d   S 1 sw   Y  dS )z(Parse a file and return the syntax tree.)rl   N)openrj   )r"   rk   rl   rD   rd   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.rf   )r   rg   ioStringIOrh   r   rc   )r"   ro   rD   r   r$   r$   r%   parse_string   s   zDriver.parse_stringr]   rX   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 )NrF   r   FrG   z 	r   T)stripjoinr!   r3   )	r"   r]   rX   linescurrent_linecurrent_columnwait_for_nlcharresr$   r$   r%   rR      s,   


z Driver._partially_consume_prefixr    )F)NF)r'   r(   r)   r   r   r   r2   r
   r   r@   r   rc   r   strri   rj   Pathrn   rr   r*   r   rR   r$   r$   r$   r%   r   k   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.txtrF   .z.pickle)	ospathsplitextrt   mapr{   sysversion_infobasename)r}   r~   headtailnamer$   r$   r%   _generate_pickle_name   s   r   Grammar.txtTFgpsaveforcerA   c                 C   s   |du r	t t}|du rt| n|}|st|| s6t| }|r4z|| W |S  ty3   Y |S w |S t	
 }|| |S )z'Load the grammar (maybe from a pickle).N)rB   rC   r'   r   _newerr   generate_grammardumpOSErrorr   r   load)r}   r   r   r   rA   gr$   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)levelrd   formatT)r   r   )tupler   argvrB   basicConfigINFOstdoutr   )r   r}   r$   r$   r%   main,  s   r   __main__r    )r   NTFN)2__doc__
__author____all__rp   rB   r   r   r   
contextlibr   dataclassesr   r   r   typingr   r	   r
   r   r   r   r   r   r   blib2to3.pgen2.grammarr   blib2to3.pgen2.tokenizer   blib2to3.pytreer   rF   r   r   r   r   r   r{   r|   r   r-   r   r   r@   r   r   r   r   r'   exitr*   r$   r$   r$   r%   <module>   sn   ,
9|


