
    e)                        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	 ddl
mZmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZ dd
lmZ ddlmZ ddlmZ ddlmZm Z m!Z!m"Z"m#Z# ee$df   Z%e G d d             Z& G d d      Z' G d d      Z(d'de%dee%   de$fdZ)	 	 	 	 	 d(de$dee$   de*de*dee   defdZ+de$de$de*fd Z,	 d'd!e$d"e$dee%   dej2                  fd#Z-d$e$de*fd%Z.e/d&k(  r ej`                   e1 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)contextmanager)	dataclassfield)Logger)	IOAnyIterableIteratorListOptionalTupleUnioncast)Grammar)GoodTokenInfo)NL   )grammarparsepgentokentokenizezos.PathLike[str]c                   V    e Zd ZU eed<   dZee   ed<    ee      Z	e
e   ed<   ddZy)ReleaseRangestartNend)default_factorytokensc                 V    t        | j                        }| j                  |z   | _        y N)lenr    r   r   )selftotal_eatens     7/usr/lib/python3/dist-packages/blib2to3/pgen2/driver.pylockzReleaseRange.lock-   s     $++&::+    )returnN)__name__
__module____qualname__int__annotations__r   r   r   listr    r   r
   r'    r(   r&   r   r   '   s-    JC#d3FDI3,r(   r   c                   l    e Zd ZdeddfdZeded    fd       ZdedefdZ	ddZ
defd	Zd
edefdZy)
TokenProxy	generatorr)   Nc                 .    || _         d| _        g | _        y )Nr   )_tokens_counter_release_ranges)r$   r3   s     r&   __init__zTokenProxy.__init__3   s     35r(   c              #      K   t        | j                        }| j                  j                  |       	 |  |j	                          y # |j	                          w xY wwr"   )r   r6   r7   appendr'   )r$   release_ranges     r&   releasezTokenProxy.release8   sL     $T]]3##M2	!J  M s   1AA	 A	AApointc                     | j                   d   j                  }|t        |      k  r||   S |t        |      k\  r5t        | j                        }|j                  |       |t        |      k\  r5S )N)r7   r    r#   nextr5   r:   )r$   r=   eaten_tokensr   s       r&   eatzTokenProxy.eatC   so    ++B/663|$$&&3|,,T\\*##E* 3|,, Lr(   c                     | S r"   r0   )r$   s    r&   __iter__zTokenProxy.__iter__M   s    r(   c                 4   | j                   D ]^  }|j                  J |j                  |j                  }}|| j                  cxk  r|k  s?n B|j                  | j                  |z
     } n t        | j                        }| xj                  dz  c_        |S )Nr   )r7   r   r   r6   r    r@   r5   )r$   r;   r   r   r   s        r&   __next__zTokenProxy.__next__P   s     "11 	'M $$000&,,m.?.?3E++%,,T]]U-BC	' &Er(   toc                 F    	 | j                  |       y# t        $ r Y yw xY w)NTF)rB   StopIteration)r$   rG   s     r&   can_advancezTokenProxy.can_advance`   s+    	HHRL   		s    	  )r)   r2   )r*   r+   r,   r
   r8   r   r   r<   r-   rB   rD   rF   boolrJ   r0   r(   r&   r2   r2   2   sl    6# 6$ 6
 !,/ ! !  #  c d r(   r2   c            	           e Zd Zddedee   ddfdZddee   de	de
fdZdd	ee   de	de
fd
Zdd	ee   de	de
fdZ	 ddedee   de	de
fdZddede	de
fdZdededeeef   fdZy)r   Nr   loggerr)   c                 V    || _         |t        j                  t              }|| _        y r"   )r   logging	getLoggerr*   rM   )r$   r   rM   s      r&   r8   zDriver.__init__l   s%    >&&x0Fr(   r    debugc                    t        |      }t        j                  | j                        }|j	                  |       d}d}g }dx}x}	x}
x}}d}|D ]  }|\  }}	}
}}|
||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                  |	   }|r3|J | j                  j                  dt        j                  |   |	|       |t        j                  k(  r$|j!                  t#        |	             ||	z   }d}d}	n8|t        j$                  k(  r%|j'                         }| j)                  ||      \  }}|j+                  t-        t.        |      |	||
f      r|r| j                  j                  d        nfd}|t        j                  t        j$                  hv r}|\  }}|	j                  d      s|dz  }d} |
J t        j0                  d	||	||
f      |j2                  J |j2                  S )
z4Parse a series of tokens and return the syntax tree.)proxyr   r   N 
z%s %r (prefix=%r)zStop.zincomplete input)r2   r   Parserr   setupr   COMMENTr   endswithr   OPopmaprM   rQ   tok_nameINDENTr:   r#   DEDENTpop_partially_consume_prefixaddtokenr   r-   
ParseErrorrootnode)r$   r    rQ   rS   plinenocolumnindent_columnstypevaluer   r   	line_textprefix	quintuples_linenos_column_prefix_indent_cols                      r&   parse_tokenszDriver.parse_tokensr   s    6"LL&	e$&1555u5u5sY 0	U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+'''!!')=uf u||#%%c%j1 5.%,002"&"@"@"Uzz$sD/565/BKK%%g.Fell33  NFF~~d#!Y0	U^ $$$""#5tUVUOTTzz%%%zzr(   streamc                 |    t        j                  |j                  | j                        }| j	                  ||      S )*Parse a stream and return the syntax tree.r   )r   generate_tokensreadliner   rq   )r$   rr   rQ   r    s       r&   parse_stream_rawzDriver.parse_stream_raw   s/    ))&//4<<P  //r(   c                 &    | j                  ||      S )rt   )rx   )r$   rr   rQ   s      r&   parse_streamzDriver.parse_stream   s    $$VU33r(   filenameencodingc                 l    t        ||      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|   N)openrz   )r$   r{   r|   rQ   rr   s        r&   
parse_filezDriver.parse_file   s5     (X. 	4&$$VU3	4 	4 	4s   *3textc                     t        j                  t        j                  |      j                  | j
                        }| j                  ||      S )z*Parse a string and return the syntax tree.ru   )r   rv   ioStringIOrw   r   rq   )r$   r   rQ   r    s       r&   parse_stringzDriver.parse_string   s?    ))KK&&
   //r(   rk   rf   c                 8   g }d}d}d}|D ]{  }||z  }|rV|dk(  s|j                         r(||k  r#dj                  |      }||t        |      d  fc S |j                  |       d}d}d}`|dv r|dz  }j|dk(  rd}r|dk(  rd}zd}} dj                  |      |fS )	NrT   r   FrU   z 	r   T)stripjoinr#   r:   )	r$   rk   rf   linescurrent_linecurrent_columnwait_for_nlcharress	            r&   r`   z Driver._partially_consume_prefix   s     	#DD L4<#))+0G ggen"F3s8:$666LL.#%L%&N"'K!#!"!" #+	#, wwu~|++r(   r"   )F)NF)r*   r+   r,   r   r   r   r8   r   r   rK   r   rq   r	   strrx   rz   Pathr   r   r-   r   r`   r0   r(   r&   r   r   k   s     &1A T @8M#: @4 @TV @D0r#w 0t 0 0
42c7 44 4B 4
 MR44(04EI4	40 0T 0b 0, ,S ,U3PS8_ ,r(   gt	cache_dirr)   c                 B   t         j                  j                  |       \  }}|dk(  rd}||z   dj                  t	        t
        t        j                              z   dz   }|r=t         j                  j                  |t         j                  j                  |            S |S )Nz.txtrT   .z.pickle)	ospathsplitextr   mapr   sysversion_infobasename)r   r   headtailnames        r&   _generate_pickle_namer      s{    !!"%JD$v~$;#c3+;+;"<==	IDww||Irww'7'7'=>>r(   gpsaveforcerM   c                 :   |t        j                  t              }|t        |       n|}|st	        ||       s-t        j                  |       }|r	 |j                  |       |S |S t        j                         }|j                  |       |S # t        $ r Y |S w xY w)z'Load the grammar (maybe from a pickle).)rO   rP   r*   r   _newerr   generate_grammardumpOSErrorr   r   load)r   r   r   r   rM   gs         r&   r   r      s     ~""8,&(j	r	"bBF2rN!2226r
 H1H OO	r
H   Hs   B 	BBabc                     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)r   r   existsgetmtime)r   r   s     r&   r   r     sQ    77>>!77>>!77A"''"2"21"555r(   packagegrammar_sourcec                 N   t         j                  j                  |      r|rt        ||      nd}t	        ||      S t        t         j                  j                  |      |      }t        j                  | |      }|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.

    N)r   )r   r   isfiler   r   r   pkgutilget_datar   r   loads)r   r   r   r   pickled_namedatar   s          r&   load_packaged_grammarr     s     
ww~~n%AJ">9=PTNr22()9)9.)I9ULG\2DAGGDMHr(   argsc                      | st        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)levelrr   formatT)r   r   )tupler   argvrO   basicConfigINFOstdoutr   )r   r   s     r&   mainr   .  sS    
 SXXab\"gll3::mT 0Rd$/0r(   __main__r"   )zGrammar.txtNTFN)2__doc__
__author____all__r   rO   r   r   r   
contextlibr   dataclassesr   r   r   typingr	   r
   r   r   r   r   r   r   r   blib2to3.pgen2.grammarr   blib2to3.pgen2.tokenizer   blib2to3.pytreer   rT   r   r   r   r   r   r   r   r   r2   r   r   rK   r   r   r   r   r*   exitr-   r0   r(   r&   <module>r      s   3
^
$ 
  	  
 % (  R R R * 1  4 3S$$% , , ,6 6r{, {,|d x~   #  	
 V 26c 6c 6d 6 DH"%2:4.__0
 
 
 zCHHSTV_ r(   