???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3

  \                 @   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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j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 krtj }|| _|| _d S )N)r   logging	getLoggerloggerconvert)selfr   r   r    r   ,/usr/lib64/python3.6/lib2to3/pgen2/driver.py__init__    s
    zDriver.__init__Fc             C   s  t j| j| j}|j  d}d}d } } } }	}
d}xR|D ]4}|\}}}}	}
|||fkr||f|ks|t||f|f|\}}||k r|d||  7 }|}d}||k r||
|| 7 }|}|tjtjfkr||7 }|	\}}|j	dr@|d7 }d}q@|t
jkrtj| }|r,| jjdt
j| || |j||||frT|rR| jjd P d}|	\}}|j	dr@|d7 }d}q@W t j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setupAssertionErrorr   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'   sT    


zDriver.parse_tokensc             C   s   t j|j}| j||S )z*Parse a stream and return the syntax tree.)r   generate_tokensreadliner$   )r   streamr   r   r   r   r   parse_stream_rawW   s    zDriver.parse_stream_rawc             C   s   | j ||S )z*Parse a stream and return the syntax tree.)r(   )r   r'   r   r   r   r   parse_stream\   s    zDriver.parse_streamc          
   C   s*   t j|d|}z| j||S |j  X dS )z(Parse a file and return the syntax tree.rN)codecsopenr)   close)r   filenameencodingr   r'   r   r   r   
parse_file`   s    zDriver.parse_filec             C   s   t jtj|j}| j||S )z*Parse a string and return the syntax tree.)r   r%   ioStringIOr&   r$   )r   textr   r   r   r   r   parse_stringh   s    zDriver.parse_string)NN)F)F)F)NF)F)	__name__
__module____qualname__r   r$   r(   r)   r0   r4   r   r   r   r   r      s   

0


c             C   s:   t jj| \}}|dkrd}|| dj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_namen   s    rD   Grammar.txtTFc             C   s   |dkrt j }|dkr t| n|}|s4t||  r|jd|  tj| }|r|jd| y|j| W q tk
r } z|jd| W Y dd}~X qX nt	j
 }|j| |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   rD   _newerinfor	   Zgenerate_grammardumpOSErrorr   Grammarload)rA   Zgpsaveforcer   ger   r   r   r   u   s    
 
c             C   s8   t jj| sdS t jj|s dS t jj| t jj|kS )z0Inquire whether file a was written since file b.FT)r9   r:   existsgetmtime)abr   r   r   rF      s
    rF   c             C   sF   t jj|rt|S tt jj|}tj| |}tj	 }|j
| |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.

    )r9   r:   isfiler   rD   basenamepkgutilget_datar   rJ   loads)packageZgrammar_sourceZpickled_namedatarN   r   r   r   load_packaged_grammar   s    
r[   c              G   sF   | st jdd } tjtjt jdd x| D ]}t|ddd q,W 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)rL   rM   )r?   argvr
   ZbasicConfigINFOstdoutr   )argsrA   r   r   r   main   s    
rb   __main__)rE   NTFN)__doc__
__author____all__r+   r1   r9   r
   rV   r?   r   r   r   r   r   r	   objectr   rD   r   rF   r[   rb   r5   exitintr   r   r   r   <module>   s$   P 
	