o
    bE!                     @   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 ddl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 eedf 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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(e)e&   dS 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IOIterableListOptionalTextTupleUnion   )grammarparsetokentokenizepgen)Logger)_ConvertNL)Grammarzos.PathLike[str]c                	   @   s   e Zd Z		ddede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   convertloggerreturnc                 C   s(   || _ |d u rtt}|| _|| _d S N)r   logging	getLogger__name__r   r   )selfr   r   r    r   T/var/www/secure340b-portal/env/lib/python3.10/site-packages/blib2to3/pgen2/driver.py__init__-   s
   

zDriver.__init__Ftokensdebugc                 C   s  t | j| j}|  d}d}g }d } } }	 }
}d}|D ]}|\}}}	}
}|	||fkr_||f|	ks=J ||f|	f|	\}}||k rQ|d||  7 }|}d}||k r_|||| 7 }|}|tjtjfv r{||7 }|
\}}|drz|d7 }d}q |t	j
krtj| }|r| jdt	j| || |t	jkr|t| || }d}d}n|t	jkr| }| ||\}}|||||	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sJ |jS )	z4Parse a series of tokens and return the syntax tree.r   r   N 
z%s %r (prefix=%r)zStop.zincomplete input)r   Parserr   r   setupr   COMMENTr   endswithr   OPopmapr   r"   tok_nameINDENTappendlenDEDENTpop_partially_consume_prefixZaddtoken
ParseErrorrootnode)r   r!   r"   plinenocolumnZindent_columnstypevaluestartendZ	line_textprefixZ	quintupleZs_linenoZs_column_prefixZ_indent_colr   r   r   parse_tokens9   sp   





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   r=   )r   r>   r"   r!   r   r   r   parse_stream_rawv   s   zDriver.parse_stream_rawc                 C   s   |  ||S )r?   )rC   )r   r>   r"   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)rF   N)ioopenrD   )r   rE   rF   r"   r>   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.r@   )r   rA   rH   StringIOrB   r   r=   )r   rK   r"   r!   r   r   r   parse_string   s   zDriver.parse_stringr;   r6   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 )Nr#   r   Fr$   z 	r   T)stripjoinr.   r-   )	r   r;   r6   linescurrent_lineZcurrent_columnZwait_for_nlcharresr   r   r   r1      s,   


z Driver._partially_consume_prefix)NN)F)NF)r   
__module____qualname__r   r   r   r   r    r   r   boolr   r=   r   r	   rC   rD   PathrJ   rM   intr
   r1   r   r   r   r   r   ,   s6    
=
"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.txtr#   .z.pickle)	ospathsplitextrO   mapstrsysversion_infobasename)rY   rZ   headtailnamer   r   r   _generate_pickle_name   s   rg   Grammar.txtTFgpsaveforcer   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)r   r   r   rg   _newerinfor   Zgenerate_grammardumpOSErrorr   r   load)rY   ri   rj   rk   r   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)rs   rt   r   r   r   rl      s
   rl   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)ri   )r\   r]   isfilerg   r   rc   pkgutilget_datar   r   loads)rw   rx   rZ   ri   Zpickled_namedatarq   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)levelr>   formatT)rj   rk   )tuplera   argvr   basicConfigINFOstdoutr   )r   rY   r   r   r   main   s   r   __main__r   )rh   NTFN)*__doc__
__author____all__rH   r\   r   rz   ra   typingr   r   r   r   r   r	   r
   r   r#   r   r   r   r   r   r   Zblib2to3.pytreer   r   Zblib2to3.pgen2.grammarr   r`   rW   objectr   rg   rV   r   rl   r~   r   r   exitrX   r   r   r   r   <module>   sb   (}


