a
    IfQ                     @   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reee   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   %lib/python3.9/lib2to3/pgen2/driver.py__init__   s
    zDriver.__init__Fc                 C   s  t | j| j}|  d}d}d } } } }	}
d}|D ]8}|\}}}}	}
|||fkr||f|ksxJ ||f|f|\}}||k r|d||  7 }|}d}||k r||
|| 7 }|}|tjtjfv r||7 }|	\}}|dr<|d7 }d}q<|t	j
kr
tj| }|r(| jdt	j| || |||||frT|rN| jd  qd}|	\}}|dr<|d7 }d}q<t d||||f|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   ZParserr   r   Zsetupr   COMMENTNLendswithr   OPZopmapr   debugtok_nameZaddtokenZ
ParseErrorZ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 s20    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)F)F)NF)F)	__name__
__module____qualname__r   r#   r(   r)   r/   r2   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    rB   Grammar.txtTFc              
   C   s   |du rt  }|du r t| n|}|s2t|| s|d|  t| }|r|d| z|| W q ty } z|d| W Y d}~qd}~0 0 n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   rB   _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)r7   r8   existsgetmtime)abr   r   r   rD      s
    rD   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.

    )r7   r8   isfiler   rB   basenamepkgutilget_datar   rH   loads)packageZgrammar_sourceZpickled_namedatarL   r   r   r   load_packaged_grammar   s    
rY   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)rJ   rK   )r=   argvr
   ZbasicConfigINFOstdoutr   )argsr?   r   r   r   main   s    r`   __main__)rC   NTFN)__doc__
__author____all__r,   r7   r
   rT   r=   r   r   r   r   r   r	   objectr   rB   r   rD   rY   r`   r3   exitintr   r   r   r   <module>   s$   M  
	