
    ]j(                        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
 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 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"dz  de!fdZ&	 	 	 	 	 d)de!de!dz  de'de'dedz  defdZ(de!d e!de'fd!Z)	 d(d"e!d#e!de"dz  dej,                  fd$Z*d%e!de'fd&Z+e,d'k(  r ejZ                   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)IterableIterator)contextmanager)	dataclassfield)Logger)AnyUnioncast)Grammar)	TokenInfo)NL   )grammarparsepgentokentokenizezos.PathLike[str]c                   V    e Zd ZU eed<   dZedz  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     ?/root/env/lib/python3.12/site-packages/blib2to3/pgen2/driver.pylockzReleaseRange.lock.   s     $++&::+    )returnN)__name__
__module____qualname__int__annotations__r   r	   listr   r   r#    r$   r"   r   r   (   s-    JCt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    r/   s     r"   __init__zTokenProxy.__init__4   s     35r$   c              #      K   t        | j                        }| j                  j                  |       	 |  |j	                          y # |j	                          w xY wwr   )r   r2   r3   appendr#   )r    release_ranges     r"   releasezTokenProxy.release9   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)r3   r   r   nextr1   r6   )r    r9   eaten_tokensr   s       r"   eatzTokenProxy.eatD   so    ++B/663|$$&&3|,,T\\*##E* 3|,, Lr$   c                     | S r   r,   )r    s    r"   __iter__zTokenProxy.__iter__N   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   )r3   r   r   r2   r   r<   r1   )r    r7   r   r   r   s        r"   __next__zTokenProxy.__next__Q   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)r>   StopIteration)r    rC   s     r"   can_advancezTokenProxy.can_advancea   s+    	HHRL   		s    	  )r%   r.   )r&   r'   r(   r   r4   r   r   r8   r)   r>   r@   rB   boolrF   r,   r$   r"   r.   r.   3   sl    6# 6$ 6
 !,/ ! !  #  c d r$   r.   c            	           e Zd Zddededz  ddfdZddee   dede	fdZ
	 dd	ed
edz  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&   rI   )r    r   rI   s      r"   r4   zDriver.__init__m   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        nd}|t        j                  t        j$                  hv r}|\  }}|	j                  d      s|t        j0                  t        j2                  fvs |dz  }d}	 |
J t        j4                  d	||	||
f      |j6                  J |j6                  S )
z4Parse a series of tokens and return the syntax tree.)proxyr   r   N 
z%s %r (prefix=%r)zStop.zincomplete input)r.   r   Parserr   setupr   COMMENTr   endswithr   OPopmaprI   rM   tok_nameINDENTr6   r   DEDENTpop_partially_consume_prefixaddtokenr   r)   FSTRING_MIDDLETSTRING_MIDDLE
ParseErrorrootnode)r    r   rM   rO   plinenocolumnindent_columnstypevaluer   r   	line_textprefix	quintuples_linenos_column_prefix_indent_cols                      r"   parse_tokenszDriver.parse_tokenss   s    6"LL&	e$&1555u5u5sY 6	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#$$$$5 ) !e6	Uj $$$""#5tUVUOTTzz%%%zzr$   filenameencodingc                     t        ||      5 }|j                         }ddd       | j                  |      S # 1 sw Y   xY w)z(Parse a file and return the syntax tree.)rq   N)openreadparse_string)r    rp   rq   rM   streamtexts         r"   
parse_filezDriver.parse_file   sC     (X. 	!&;;=D	!  u--	! 	!s	   9Arw   c                 h    t        j                   || j                        }| j                  ||      S )z*Parse a string and return the syntax tree.)r   )r   r   ro   )r    rw   rM   r   s       r"   ru   zDriver.parse_string   s+    ""4>  //r$   ri   rd   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 )	NrP   r   FrQ   z 	r   T)stripjoinr   r6   )	r    ri   rd   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
   r4   r   r   rG   r   ro   Pathstrrx   ru   r)   tupler\   r,   r$   r"   r   r   l   s     $ $ F8I#6 Ft FPR FR JO..(+d
.BF.	.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.txtrP   .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forcerI   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).)rK   rL   r&   r   _newerr   generate_grammardumpOSErrorr   r   load)r   r   r   r   rI   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)levelrv   formatT)r   r   )r   r   argvrK   basicConfigINFOstdoutr   )r   r   s     r"   mainr   +  sS    
 SXXab\"gll3::mT 0Rd$/0r$   __main__r   )zGrammar.txtNTFN)/__doc__
__author____all__iorK   r   r   r   collections.abcr   r   
contextlibr   dataclassesr   r	   r
   typingr   r   r   blib2to3.pgen2.grammarr   blib2to3.pgen2.tokenizer   blib2to3.pytreer   rP   r   r   r   r   r   r   r   r   r.   r   r   rG   r   r   r   r   r&   exitr)   r,   r$   r"   <module>r      s   3
^
$ 
  	  
 . % (  # # * -  4 3S$$% , , ,6 6rw, w,td td{ c   d
  	
 TM 26c 6c 6d 6 AE"%26+__0
 
 
 zCHHSTV_ r$   