
    dafQ                         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e      Zd	 Z	 	 dd
Zd Zd Zd Zedk(  r ej,                   e e                     yy)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                   <    e Zd ZddZd	dZd	dZd	dZd
dZd	dZy)r   Nc                 Z    || _         |t        j                         }|| _        || _        y )N)r   logging	getLoggerloggerconvert)selfr   r   r   s       //root/Python-3.12.4/Lib/lib2to3/pgen2/driver.py__init__zDriver.__init__   s*    >&&(F    c                 f   t        j                  | j                  | j                        }|j	                          d}d}dx}x}x}x}	}
d}|D ]H  }|\  }}}}	}
|||fk7  r:||f|k  sJ ||f|f       |\  }}||k  r|d||z
  z  z  }|}d}||k  r
||
|| z  }|}|t
        j                  t
        j                  fv r#||z  }|	\  }}|j                  d      r|dz  }d}|t        j                  k(  rt        j                  |   }|r/| j                  j                  dt        j                  |   ||       |j                  ||||f      r*|r| j                  j                  d        |j"                  S d}|	\  }}|j                  d      sB|dz  }d}K t        j                   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   Parserr   r   setupr	   COMMENTNLendswithr   OPopmapr   debugtok_nameaddtoken
ParseErrorrootnode)r   tokensr   plinenocolumntypevaluestartend	line_textprefix	quintuples_linenos_columns                  r   parse_tokenszDriver.parse_tokens&   s    LLt||4		1555u5u5sY $	AI1:.D%Y(('50KFF3CU2KK0%*"(H$dh&788F%FFH$ix88F%F(((++66%!$>>$'aKFFuxx}}U+!!"5"'.."6vGzz$7KK%%g. zz F NFF~~d#!A$	AF ""#5#'A Ar   c                 d    t        j                  |j                        }| j                  ||      S z*Parse a stream and return the syntax tree.)r	   generate_tokensreadliner1   )r   streamr   r$   s       r   parse_stream_rawzDriver.parse_stream_rawV   s)    ))&//:  //r   c                 &    | j                  ||      S r3   )r7   )r   r6   r   s      r   parse_streamzDriver.parse_stream[   s    $$VU33r   c                     t        j                  |d|      5 }| j                  ||      cddd       S # 1 sw Y   yxY w)z(Parse a file and return the syntax tree.r)encodingN)ioopenr9   )r   filenamer<   r   r6   s        r   
parse_filezDriver.parse_file_   s9    WWXsX6 	4&$$VU3	4 	4 	4s   5>c                     t        j                  t        j                  |      j                        }| j                  ||      S )z*Parse a string and return the syntax tree.)r	   r4   r=   StringIOr5   r1   )r   textr   r$   s       r   parse_stringzDriver.parse_stringd   s4    ))"++d*;*D*DE  //r   )NN)F)NF)	__name__
__module____qualname__r   r1   r7   r9   r@   rD    r   r   r   r      s!    .`0
44
0r   c                     t         j                  j                  |       \  }}|dk(  rd}||z   dj                  t	        t
        t        j                              z   dz   S )Nz.txtr   .z.pickle)ospathsplitextjoinmapstrsysversion_info)gtheadtails      r   _generate_pickle_namerV   j   sP    !!"%JD$v~$;#c3+;+;"<==	IIr   c                    |t        j                         }|t        |       n|}|st        ||       sQ|j	                  d|        t        j                  |       }|r&|j	                  d|       	 |j                  |       |S |S t        j                         }|j                  |       |S # t        $ r}|j	                  d|       Y d}~|S d}~ww xY w)z'Load the grammar (maybe from a pickle).Nz!Generating grammar tables from %szWriting grammar tables to %szWriting failed: %s)r   r   rV   _newerinfor
   generate_grammardumpOSErrorr   Grammarload)rS   gpsaveforcer   ges          r   r   r   q   s     ~""$&(j	r	"bBF2rN7<!!"%KK6;5r
 H1H OO	r
H  50!44 H5s   0B, ,	C5CCc                     t         j                  j                  |       syt         j                  j                  |      syt         j                  j                  |       t         j                  j                  |      k\  S )z0Inquire whether file a was written since file b.FT)rK   rL   existsgetmtime)abs     r   rX   rX      sQ    77>>!77>>!77A"''"2"21"555r   c                     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.

    )rK   rL   isfiler   rV   basenamepkgutilget_datar   r]   loads)packagegrammar_sourcepickled_namedatarb   s        r   load_packaged_grammarrs      sf     
ww~~n%N++()9)9.)IJLG\2DAGGDMHr   c                      | st         j                  dd } t        j                  t        j                  t         j
                  d       | D ]  }t        |dd        y)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)levelr6   formatT)r`   ra   )rQ   argvr   basicConfigINFOstdoutr   )argsrS   s     r   mainr|      sQ    
 xx|gll3::,. 0Rd$/0r   __main__)zGrammar.txtNTFN)__doc__
__author____all__r=   rK   r   rl   rQ   r   r   r   r   r	   r
   objectr   rV   r   rX   rs   r|   rE   exitintrH   r   r   <module>r      s    3
^
$ 
 	   
 4 3J0V J0ZJ '+04*6( zCHHSTV_ r   