
    !.d)                     b   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mZmZmZmZmZmZmZ ddlmZ ddlmZmZ d	d
l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& ee'df         Z(e G d d                      Z) G d d          Z* G d de+          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#Z0	 d*d$e'd%edee(         dej$        fd&Z1d'ede.fd(Z2e3d)k    r$ ej4         e5 e2                                  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)AnycastIOIterableListOptionalTextIteratorTupleTypeVarGenericUnion)contextmanager)	dataclassfield   )grammarparsetokentokenizepgen)Logger)NL)Grammar)GoodTokenInfoz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.lock9   s#    $+&&:+    )r$   N)__name__
__module____qualname__int__annotations__r!   r
   r   listr#   r	   r   r+    r,   r*   r   r   3   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(   r6   s     r*   __init__zTokenProxy.__init__?   s     35r,   c              #      K   t          | j                  }| j                            |           	 | V  |                                 d S # |                                 w xY wr&   )r   r9   r:   appendr+   )r(   release_ranges     r*   releasezTokenProxy.releaseD   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)r:   r#   r'   nextr8   r=   )r(   r@   eaten_tokensr   s       r*   eatzTokenProxy.eatO   s    +B/63|$$$$&&3|,,,,T\**##E*** 3|,,,, Lr,   c                     | S r&   r3   )r(   s    r*   __iter__zTokenProxy.__iter__Y   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   )r:   r!   r    r9   r#   rC   r8   )r(   r>   r    r!   r   s        r*   __next__zTokenProxy.__next__\   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)rE   StopIteration)r(   rJ   s     r*   can_advancezTokenProxy.can_advancel   sA    	HHRLLL 4  	 	 	55	s    
'')r$   r5   )r-   r.   r/   r   r;   r   r   r?   r0   rE   rG   rI   boolrM   r3   r,   r*   r5   r5   >   s        6# 6$ 6 6 6 6
 !,/ ! ! ! ^!        #     c d      r,   r5   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-   rP   )r(   r   rP   s      r*   r;   zDriver.__init__x   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)r5   r   Parserr   setupr   COMMENTr   endswithr   OPopmaprP   rT   tok_nameINDENTr=   r'   DEDENTpop_partially_consume_prefixaddtokenr   r0   
ParseErrorrootnode)r(   r#   rT   rV   plinenocolumnindent_columnstypevaluer    r!   	line_textprefix	quintuples_linenos_column_prefix_indent_cols                      r*   parse_tokenszDriver.parse_tokens~   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   rt   )r(   ru   rT   r#   s       r*   parse_stream_rawzDriver.parse_stream_raw   s1    )&/4<PPP  ///r,   c                 .    |                      ||          S )rw   )r{   )r(   ru   rT   s      r*   parse_streamzDriver.parse_stream   s    $$VU333r,   filenameencodingc                     t          j        |d|          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)r   N)ioopenr}   )r(   r~   r   rT   ru   s        r*   
parse_filezDriver.parse_file   s     WXsX666 	4&$$VU33	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   ;??textc                     t          j        t          j        |          j        | j                  }|                     ||          S )z*Parse a string and return the syntax tree.rx   )r   ry   r   StringIOrz   r   rt   )r(   r   rT   r#   s       r*   parse_stringzDriver.parse_string   sE    )K&
 
 
   ///r,   rn   ri   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 )NrW   r   FrX   z 	r   T)stripjoinr'   r=   )	r(   rn   ri   linescurrent_linecurrent_columnwait_for_nlcharress	            r*   rc   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   r;   r   r   rN   r   rt   r   r   r{   r}   Pathr   r   r0   r   rc   r3   r,   r*   r   r   w   s         &1A T    @ @8M#: @4 @TV @ @ @ @D0 0r$x 0 0 0 0 0 0
4 42d8 4D 4R 4 4 4 4
 NS4 44(04FJ4	4 4 4 40 0 0d 0r 0 0 0 0, ,c ,eDRVJFW , , , , , ,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.txtrW   .z.pickle)	ospathsplitextr   mapstr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forcerP   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).)rR   rS   r-   r   _newerr   generate_grammardumpOSErrorr   r   load)r   r   r   r   rP   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)levelru   formatT)r   r   )tupler   argvrR   basicConfigINFOstdoutr   )r   r   s     r*   mainr   8  sk    
  #SXabb\""gl3:mTTTT 0 0Rd$/////4r,   __main__r&   )r   NTFN)6__doc__
__author____all__r   r   rR   r   r   typingr   r   r   r   r	   r
   r   r   r   r   r   r   
contextlibr   dataclassesr   r   rW   r   r   r   r   r   r   blib2to3.pytreer   blib2to3.pgen2.grammarr   blib2to3.pgen2.tokenizer   r   r   r   r5   objectr   r   rN   r   r   r   r   r-   exitr0   r3   r,   r*   <module>r      s    3
^
$ 
			 				   



                            & % % % % % ( ( ( ( ( ( ( ( 4 3 3 3 3 3 3 3 3 3 3 3 3 3             * * * * * * 1 1 1 1 1 1S$$% , , , , , , , ,6 6 6 6 6 6 6 6ry, y, y, y, y,V y, y, y,x d x~      #   	
 V    26d 6t 6 6 6 6 6 EI "&3;D>_   0
 
 
 
 
 
 zCHSSTTVV__ r,   