
    ɭdeE)                     T   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j        fd&Z-d'e$de*fd(Z.e/d)k    r$ ej0         e1 e.                                  dS 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)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                   j    e Zd ZU eed<   dZee         ed<    ee          Z	e
e         ed<   ddZdS )	ReleaseRangestartNend)default_factorytokensreturnc                 L    t          | j                  }| j        |z   | _        d S N)lenr    r   r   )selftotal_eatens     5lib/python3.11/site-packages/blib2to3/pgen2/driver.pylockzReleaseRange.lock-   s#    $+&&:+    )r!   N)__name__
__module____qualname__int__annotations__r   r   r   listr    r   r
   r(    r)   r'   r   r   '   sh         JJJC#d333FDI333, , , , , ,r)   r   c                   z    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dS )
TokenProxy	generatorr!   Nc                 0    || _         d| _        g | _        d S )Nr   )_tokens_counter_release_ranges)r%   r3   s     r'   __init__zTokenProxy.__init__3   s     35r)   c              #      K   t          | j                  }| j                            |           	 | V  |                                 d S # |                                 w xY wr#   )r   r6   r7   appendr(   )r%   release_ranges     r'   releasezTokenProxy.release8   sl      $T]33##M222	!JJJ      M    s   A A"pointc                     | j         d         j        }|t          |          k     r||         S |t          |          k    r<t          | j                  }|                    |           |t          |          k    <|S )N)r7   r    r$   nextr5   r:   )r%   r=   eaten_tokensr   s       r'   eatzTokenProxy.eatC   s    +B/63|$$$$&&3|,,,,T\**##E*** 3|,,,, Lr)   c                     | S r#   r0   )r%   s    r'   __iter__zTokenProxy.__iter__M   s    r)   c                     | j         D ]E}|j        J |j        |j        }}|| j        cxk    r|k     rn .|j        | j        |z
           } nFt          | 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 	' 	'M $000&,m.?3E+++++++++%,T]U-BC , &&Er)   toc                 T    	 |                      |           dS # t          $ r Y dS w xY w)NTF)rB   StopIteration)r%   rG   s     r'   can_advancezTokenProxy.can_advance`   sA    	HHRLLL 4  	 	 	55	s    
'')r!   r2   )r*   r+   r,   r
   r8   r   r   r<   r-   rB   rD   rF   boolrJ   r0   r)   r'   r2   r2   2   s        6# 6$ 6 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dS )r   Nr   loggerr!   c                 X    || _         |t          j        t                    }|| _        d S r#   )r   logging	getLoggerr*   rM   )r%   r   rM   s      r'   r8   zDriver.__init__l   s)    >&x00Fr)   Fr    debugc                    t          |          }t          j        | j                  }|                    |           d}d}g }dx}x}	x}
x}}d}|D ]}|\  }}	}
}}|
||fk    rE||f|
k    sJ ||f|
f            |
\  }}||k     r|d||z
  z  z  }|}d}||k     r||||         z  }|}|t
          j        t
          j        fv r'||	z  }|\  }}|	                    d          r|dz  }d}|t          j
        k    rt          j        |	         }|r1|J | j                            dt          j        |         |	|           |t          j        k    r,|                    t#          |	                     ||	z   }d}d}	n=|t          j        k    r-|                                }|                     ||          \  }}|                    t-          t.          |          |	||
f          r|r| j                            d            n^d}|t          j        t          j        hv r|}|\  }}|	                    d          r|dz  }d}|
J t          j        d	||	||
f          |j        J |j        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""L&&	e$&1555u5u5sY 0	U 0	UI1:.D%Y((('5000FF3CU2K000%*"(H$$dh&788F%FFH$$ix88F%F((+666%!$>>$'' aKFFux}U+ '''!!')=uf   u|##%%c%jj111 5.%%,0022"&"@"@"U"Uzz$sD//565/BB  /K%%g...Fel333  NFF~~d## ! $$$"#5tUVUOTTTz%%%zr)   streamc                 n    t          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   s1    )&/4<PPP  ///r)   c                 .    |                      ||          S )rt   )rx   )r%   rr   rQ   s      r'   parse_streamzDriver.parse_stream   s    $$VU333r)   filenameencodingc                     t          ||          5 }|                     ||          cddd           S # 1 swxY w Y   dS )z(Parse a file and return the syntax tree.)r|   N)openrz   )r%   r{   r|   rQ   rr   s        r'   
parse_filezDriver.parse_file   s     (X... 	4&$$VU33	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   599textc                     t          j        t          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   sE    )K&
 
 
   ///r)   rk   rf   c                 Z   g }d}d}d}|D ]}||z  }|rl|dk    re|                                 r6||k     r0d                    |          }||t          |          d          fc S |                    |           d}d}d}u|dv r|dz  }|dk    rd}d}d                    |          |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<<#))++ 70G0G ggenn"F3s88::$66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0 0r#w 0t 0 0 0 0 0
4 42c7 44 4B 4 4 4 4
 MR4 44(04EI4	4 4 4 40 0 0T 0b 0 0 0 0, ,S ,U3PS8_ , , , , , ,r)   gt	cache_dirr!   c                 N   t           j                            |           \  }}|dk    rd}||z   d                    t	          t
          t          j                            z   dz   }|r=t           j                            |t           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 w||Irw'7'7'='=>>>r)   Grammar.txtTFgpsaveforcerM   c                 R   |t          j        t                    }|t          |           n|}|st	          ||           s>t          j        |           }|r'	 |                    |           n9# t          $ r Y n-w xY wn(t          j
                    }|                    |           |S )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 
F2rNN 
!2266 	r



   	 O	r


Hs   A. .
A;:A;abc                    t           j                            |           sdS t           j                            |          sdS t           j                            |           t           j                            |          k    S )z0Inquire whether file a was written since file b.FT)r   r   existsgetmtime)r   r   s     r'   r   r     sc    7>>! u7>>! t7A"'"2"21"5"555r)   packagegrammar_sourcec                 j   t           j                            |          r%|rt          ||          nd}t	          ||          S t          t           j                            |          |          }t          j        | |          }|J t          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     
w~~n%% 3AJT">9===PTNr2222()9)9.)I)I9UULG\22DAGGDMMMHr)   argsc                      | s!t          t          j        dd                   } t          j        t          j        t          j        d           | D ]}t          |dd           d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   Nz%(message)s)levelrr   formatT)r   r   )tupler   argvrO   basicConfigINFOstdoutr   )r   r   s     r'   mainr   ,  sk    
  #SXabb\""gl3:mTTTT 0 0Rd$/////4r)   __main__r#   )r   NTFN)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      s8    3
^
$ 
			  				  



 % % % % % % ( ( ( ( ( ( ( (       R R R R R R R R R R R R R R R R R R R R R R * * * * * * 1 1 1 1 1 1       4 3 3 3 3 3 3 3 3 3 3 3 3 3S$$% , , , , , , , ,6 6 6 6 6 6 6 6ry, y, y, y, y, y, y, y,x d x~      #   	
 V    26c 6c 6d 6 6 6 6 DH "%2:4._   0
 
 
 
 
 
 zCHSSTTVV__ r)   