ó
è¾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 Z d d l	 m
 Z
 m Z m Z m Z m Z d e f d „  ƒ  YZ d	 „  Z d
 d e e d d „ Z d „  Z d „  Z d „  Z e d k r e j e e ƒ  ƒ ƒ n  d S(   sZ   Parser driver.

This provides a high-level interface to parse a file into a syntax tree.

s#   Guido van Rossum <guido@python.org>t   Drivert   load_grammariÿÿÿÿNi   (   t   grammart   parset   tokent   tokenizet   pgenc           B   sV   e  Z d d d  „ Z e d „ Z e d „ Z e d „ Z d e d „ Z e d „ Z	 RS(   c         C   s:   | |  _  | d  k r$ t j ƒ  } n  | |  _ | |  _ d  S(   N(   R   t   Nonet   loggingt	   getLoggert   loggert   convert(   t   selfR   R   R
   (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   __init__    s
    		c         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 r`| | 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(
   s4   Parse a series of tokens and return the syntax tree.i   i    u    s   
s   %s %r (prefix=%r)s   Stop.t    s   incomplete inputN(   R   t   ParserR   R   t   setupR   t   AssertionErrorR   t   COMMENTt   NLt   endswithR   t   OPt   opmapR
   t   debugt   tok_namet   addtokent
   ParseErrort   rootnode(   R   t   tokensR   t   pt   linenot   columnt   typet   valuet   startt   endt	   line_textt   prefixt	   quintuplet   s_linenot   s_column(    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   parse_tokens'   sT    
*	

	
	c         C   s"   t  j | j ƒ } |  j | | ƒ S(   s*   Parse a stream and return the syntax tree.(   R   t   generate_tokenst   readlineR)   (   R   t   streamR   R   (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   parse_stream_rawW   s    c         C   s   |  j  | | ƒ S(   s*   Parse a stream and return the syntax tree.(   R-   (   R   R,   R   (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   parse_stream\   s    c         C   s;   t  j | d | ƒ } z |  j | | ƒ SWd | j ƒ  Xd S(   s(   Parse a file and return the syntax tree.t   rN(   t   codecst   openR.   t   close(   R   t   filenamet   encodingR   R,   (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt
   parse_file`   s    c         C   s+   t  j t j | ƒ j ƒ } |  j | | ƒ S(   s*   Parse a string and return the syntax tree.(   R   R*   t   StringIOR+   R)   (   R   t   textR   R   (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   parse_stringh   s    N(
   t   __name__t
   __module__R   R   t   FalseR)   R-   R.   R5   R8   (    (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyR       s   0c         C   sR   t  j j |  ƒ \ } } | d k r- d } n  | | d j t t t j ƒ ƒ d S(   Ns   .txtR   t   .s   .pickle(   t   ost   patht   splitextt   joint   mapt   strt   syst   version_info(   t   gtt   headt   tail(    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   _generate_pickle_namen   s    	s   Grammar.txtc         C   sÞ   | d k r t j ƒ  } n  | d k r3 t |  ƒ n | } | sO t | |  ƒ rÁ | j d |  ƒ t j |  ƒ } t rÚ | j d | ƒ y | j	 | ƒ Wq¾ t
 k
 rº } | j d | ƒ q¾ XqÚ n t j ƒ  } | j | ƒ | S(   s'   Load the grammar (maybe from a pickle).s!   Generating grammar tables from %ss   Writing grammar tables to %ss   Writing failed: %sN(   R   R   R	   RH   t   _newert   infoR   t   generate_grammarR;   t   dumpt   IOErrorR   t   Grammart   load(   RE   t   gpt   savet   forceR
   t   gt   e(    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyR   u   s    c         C   sN   t  j j |  ƒ s t St  j j | ƒ s, t St  j j |  ƒ t  j j | ƒ k S(   s0   Inquire whether file a was written since file b.(   R=   R>   t   existsR;   t   Truet   getmtime(   t   at   b(    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyRI      s
    c         C   sc   t  j j | ƒ r t | ƒ St t  j j | ƒ ƒ } t j |  | ƒ } t j	 ƒ  } | j
 | ƒ | S(   sÙ  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.

    (   R=   R>   t   isfileR   RH   t   basenamet   pkgutilt   get_dataR   RN   t   loads(   t   packaget   grammar_sourcet   pickled_namet   dataRS   (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   load_packaged_grammar–   s    
c          G   sc   |  s t  j d }  n  t j d t j d t  j d d ƒ x$ |  D] } t | d t d t ƒq? Wt S(   s   Main program, when run as a script: produce grammar pickle files.

    Calls load_grammar for each argument, a path to a grammar text file.
    i   t   levelR,   t   formats   %(message)sRQ   RR   (   RC   t   argvR   t   basicConfigt   INFOt   stdoutR   RV   (   t   argsRE   (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   mainª   s    t   __main__(   t   __doc__t
   __author__t   __all__R0   R=   R   R\   R6   RC   R   R   R   R   R   R   t   objectR    RH   R   RV   R;   R   RI   Rc   Rk   R9   t   exitt   int(    (    (    s*   /usr/lib/python2.7/lib2to3/pgen2/driver.pyt   <module>   s$   (P					