o
    Š�bc!  ã                   @   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 G dd„ deƒZd	d
„ Z		ddd„Zdd„ Zdd„ Zdd„ ZedkrXe 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é   )ÚgrammarÚparseÚtokenÚtokenizeÚpgenc                   @   sH   e Zd Zddd„Zddd„Zddd„Zdd	d
„Zddd„Zddd„ZdS )r   Nc                 C   s&   || _ |d u rt ¡ }|| _|| _d S )N)r   ÚloggingÚ	getLoggerÚloggerÚconvert)Úselfr   r   r   © r   ú+/usr/lib/python3.10/lib2to3/pgen2/driver.pyÚ__init__   s
   
zDriver.__init__Fc                 C   s„  t  | j| j¡}| ¡  d}d}d } } } }	}
d}|D ]™}|\}}}}	}
|||fkr]||f|ks;J ||f|fƒ‚|\}}||k rO|d||  7 }|}d}||k r]||
||… 7 }|}|tjtjfv ry||7 }|	\}}| d¡rx|d7 }d}q|t	j
krƒtj| }|r‘| j dt	j| ||¡ | ||||f¡r¦|r¢| j d¡  |jS d}|	\}}| d¡r·|d7 }d}qt  d||||f¡‚)	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   ÚCOMMENTÚNLÚendswithr   ÚOPÚopmapr   ÚdebugÚtok_nameÚaddtokenÚ
ParseErrorÚrootnode)r   Útokensr   ÚpÚlinenoÚcolumnÚtypeÚvalueÚstartÚendÚ	line_textÚprefixÚ	quintupleÚs_linenoÚs_columnr   r   r   Úparse_tokens&   sZ   


ÿ
÷
€
ÿzDriver.parse_tokensc                 C   s   t  |j¡}|  ||¡S ©z*Parse a stream and return the syntax tree.)r   Úgenerate_tokensÚreadliner-   )r   Ústreamr   r    r   r   r   Úparse_stream_rawV   s   zDriver.parse_stream_rawc                 C   s   |   ||¡S r.   )r2   )r   r1   r   r   r   r   Úparse_stream[   s   zDriver.parse_streamc                 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)ÚencodingN)ÚioÚopenr3   )r   Úfilenamer5   r   r1   r   r   r   Ú
parse_file_   s   
$ÿzDriver.parse_filec                 C   s   t  t |¡j¡}|  ||¡S )z*Parse a string and return the syntax tree.)r   r/   r6   ÚStringIOr0   r-   )r   Útextr   r    r   r   r   Úparse_stringd   s   zDriver.parse_string)NN)F)NF)	Ú__name__Ú
__module__Ú__qualname__r   r-   r2   r3   r9   r<   r   r   r   r   r      s    


0

c                 C   s:   t j | ¡\}}|dkrd}|| d tttjƒ¡ d S )Nz.txtr   Ú.z.pickle)ÚosÚpathÚsplitextÚjoinÚmapÚstrÚsysÚversion_info)ÚgtÚheadÚtailr   r   r   Ú_generate_pickle_namej   s   rL   úGrammar.txtTFc                 C   sd   |du rt  ¡ }|du rt| ƒn|}|st|| ƒs'| d| ¡ t | ¡}	 |S t	 
¡ }| |¡ |S )z'Load the grammar (maybe from a pickle).Nz!Generating grammar tables from %s)r
   r   rL   Ú_newerÚinfor	   Úgenerate_grammarÚdumpÚOSErrorr   ÚGrammarÚload)rI   ÚgpÚsaveÚforcer   ÚgÚer   r   r   r   q   s   
	þ
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)rA   rB   ÚexistsÚgetmtime)ÚaÚbr   r   r   rN   ‰   s
   rN   c                 C   sF   t j |¡r
t|ƒS tt j |¡ƒ}t | |¡}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.

    )rA   rB   Úisfiler   rL   ÚbasenameÚpkgutilÚget_datar   rS   Úloads)ÚpackageÚgrammar_sourceÚpickled_nameÚdatarX   r   r   r   Úload_packaged_grammar’   s   
rg   c                  G   sB   | s	t jdd… } tjtjt jdd� | D ]	}t|ddd� qdS )z�Main 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)Úlevelr1   ÚformatT)rV   rW   )rG   Úargvr
   ÚbasicConfigÚINFOÚstdoutr   )ÚargsrI   r   r   r   Úmain¦   s   ÿro   Ú__main__)rM   NTFN)Ú__doc__Ú
__author__Ú__all__r6   rA   r
   r`   rG   r   r   r   r   r   r	   Úobjectr   rL   r   rN   rg   ro   r=   ÚexitÚintr   r   r   r   Ú<module>   s(   M
ÿ	ÿ