
\[\                 @   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 Gd d   d e  Z d	 d d
 d d d d  Z d d   Z d d   Z e d k r e j e e     n  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               @   sp   e  Z d  Z d d d d  Z d d d  Z d d d  Z d d	 d
  Z d d d d  Z d d d  Z d S)r   Nc             C   s:   | |  _  | d  k r$ t j   } n  | |  _ | |  _ d  S)N)r   logging	getLoggerloggerconvert)selfr   r   r    r   */usr/lib/python3.4/lib2to3/pgen2/driver.py__init__   s
    		zDriver.__init__Fc             C   s@  t  j |  j |  j  } | j   d } d } d } } } }	 }
 d } x| D]} | \ } } } }	 }
 | | | f k r| | f | k s t | | f | f   | \ } } | | k  r | d | | 7} | } d } n  | | k  r| |
 | |  7} | } qn  | t j t j f k rc| | 7} |	 \ } } | j	 d  rQ | d 7} d } qQ qQ n  | t
 j k rt j | } n  | r|  j j d t
 j | | |  n  | j | | | | f  r| r|  j j d  n  Pn  d } |	 \ } } | j	 d  rQ | d 7} d } qQ qQ Wt  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_rawV   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 | |  SWd | j   Xd 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_stringg   s    zDriver.parse_string)	__name__
__module____qualname__r   r$   r(   r)   r0   r4   r   r   r   r   r      s   0zGrammar.txtTFc             C   s   | d k r t  j   } n  | d k r~ t j j |   \ } } | d k rT d } n  | | d j t t t j	   d } n  | s t
 | |   r | j d |   t j |   } n t j   } | j |  | S)z'Load the grammar (maybe from a pickle).Nz.txtr   .z.picklez!Generating grammar tables from %s)r
   r   ospathsplitextjoinmapstrsysversion_info_newerinfor	   Zgenerate_grammarr   ZGrammarload)gtZgpsaveforcer   headtailgr   r   r   r   m   s    	*c             C   sN   t  j j |   s d St  j j |  s, d St  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   rA      s
    rA   c              G   si   |  s t  j d d  }  n  t j d t j d t  j d d  x$ |  D] } t | d d d	 d qE Wd 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   Nlevelr'   formatz%(message)srE   TrF   )r?   argvr
   ZbasicConfigINFOstdoutr   )argsrD   r   r   r   main   s    rT   __main__)__doc__
__author____all__r+   r1   r9   r
   r?   r   r   r   r   r   r	   objectr   r   rA   rT   r5   exitintr   r   r   r   <module>   s   (P	