o
     JAfQ                     @   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   sh  t | j| j}|  d}d}d } } } }	}
d}|D ]}|\}}}}	}
|||fkrO|\}}||k rA|d||  7 }|}d}||k rO||
|| 7 }|}|tjtjfv rk||7 }|	\}}|drj|d7 }d}q|t	j
krut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   ZParserr   r   Zsetupr   COMMENTNLendswithr   OPZopmapr   debugtok_nameZaddtokenZ
ParseErrorrootnode)r   tokensr   plinenocolumntypevaluestartendZ	line_textprefixZ	quintupleZs_linenoZs_columnr   r   r   parse_tokens&   sX   





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%   )r)   )r   r(   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openr*   )r   filenamer,   r   r(   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&   r-   StringIOr'   r$   )r   textr   r   r   r   r   parse_stringd   s   zDriver.parse_string)NN)F)NF)	__name__
__module____qualname__r   r$   r)   r*   r0   r3   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   rC   Grammar.txtTFc              
   C   s   |du rt  }|du rt| n|}|st|| sP|d|  t| }|rN|d| z|| W |S  tyM } 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   rC   _newerinfor	   Zgenerate_grammardumpOSErrorr   Grammarload)r@   Z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)r8   r9   existsgetmtime)abr   r   r   rE      s
   rE   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.

    )r8   r9   isfiler   rC   basenamepkgutilget_datar   rI   loads)packageZgrammar_sourceZpickled_namedatarM   r   r   r   load_packaged_grammar   s   
rZ   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)levelr(   formatT)rK   rL   )r>   argvr
   basicConfigINFOstdoutr   )argsr@   r   r   r   main   s   rb   __main__)rD   NTFN)__doc__
__author____all__r-   r8   r
   rU   r>   r   r   r   r   r   r	   objectr   rC   r   rE   rZ   rb   r4   exitintr   r   r   r   <module>   s(   M
	