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rt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 )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)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
	