o
    ^i(                     @   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
 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 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(					d0d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/e0e-   dS dS )1zZParser 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)IterableIterator)contextmanager)	dataclassfield)Logger)IOAnyOptionalUnioncast)Grammar)	TokenInfo)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"   Z/var/www/html/stock_analysis/be/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   (   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__4   s   
zTokenProxy.__init__c                 c   s8    t | j}| j| z
| V  W |  d S |  w r   )r   r.   r/   appendr$   )r    release_ranger"   r"   r#   release9   s   
zTokenProxy.releasepointc                 C   sP   | j d j}|t|k r|| S |t|kr&t| j}|| |t|ks|S )N)r/   r   r   nextr-   r1   )r    r4   eaten_tokensr   r"   r"   r#   eatD   s   

zTokenProxy.eatc                 C   s   | S r   r"   )r    r"   r"   r#   __iter__N   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   )r/   r   r   r.   r   r6   r-   )r    r2   r   r   r   r"   r"   r#   __next__Q   s   

zTokenProxy.__next__toc                 C   s&   z|  | W dS  ty   Y dS w )NFT)r8   StopIteration)r    r;   r"   r"   r#   can_advancea   s   zTokenProxy.can_advance)r   r+   )r%   r&   r'   r   r0   r   r   r3   r(   r8   r9   r:   boolr=   r"   r"   r"   r#   r+   3   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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%   r?   )r    r   r?   r"   r"   r#   r0   m   s   

zDriver.__init__Fr   debugc                 C   s2  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  n5d}|t	jt	jhv r|}|\}}|	dr|t	jt	jfvr|d7 }d}q$|
dusJ 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opmapr?   rB   tok_nameINDENTr1   r   DEDENTpop_partially_consume_prefixaddtokenr   r(   FSTRING_MIDDLETSTRING_MIDDLE
ParseErrorrootnode)r    r   rB   rC   plinenocolumnindent_columnstypevaluer   r   	line_textprefix	quintuples_linenos_column_prefix_indent_colr"   r"   r#   parse_tokenss   sz   




zDriver.parse_tokensfilenameencodingc                 C   s@   t ||d}| }W d   n1 sw   Y  | ||S )z(Parse a file and return the syntax tree.)re   N)openreadparse_string)r    rd   re   rB   streamtextr"   r"   r#   
parse_file   s   
zDriver.parse_filerj   c                 C   s   t j || jd}| ||S )z*Parse a string and return the syntax tree.)r   )r   r   rc   )r    rj   rB   r   r"   r"   r#   rh      s   zDriver.parse_stringr]   rX   c           	      C   s   g }d}d}d}|D ]J}||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krRd}q
d}q
d||fS )	NrD   r   FrE   z 	r   T)stripjoinr   r1   )	r    r]   rX   linescurrent_linecurrent_columnwait_for_nlcharresr"   r"   r#   rP      s0   


z Driver._partially_consume_prefixr   )F)NF)r%   r&   r'   r   r   r	   r0   r   r   r>   r   rc   Pathstrrk   rh   r(   tuplerP   r"   r"   r"   r#   r   l   s    I
"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.txtrD   .z.pickle)	ospathsplitextrn   maprv   sysversion_infobasename)rx   ry   headtailnamer"   r"   r#   _generate_pickle_name   s   r   Grammar.txtTFgpsaveforcer?   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)r@   rA   r%   r   _newerr   generate_grammardumpOSErrorr   r   load)rx   r   r   r   r?   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   ry   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)levelri   formatT)r   r   )rw   r   argvr@   basicConfigINFOstdoutr   )r   rx   r"   r"   r#   main+  s   r   __main__r   )r   NTFN)1__doc__
__author____all__ior@   r{   r   r   collections.abcr   r   
contextlibr   dataclassesr   r   r	   typingr
   r   r   r   r   blib2to3.pgen2.grammarr   blib2to3.pgen2.tokenizer   blib2to3.pytreer   rD   r   r   r   r   r   rv   ru   r   r+   r   r   r>   r   r   r   r   r%   exitr(   r"   r"   r"   r#   <module>   sp   
9z


