o
    éT•j½4  ã                   @   sê   d Z ddlZddlZddlZddlmZ ddlmZ g d¢ZG dd„ dƒZ	dd
d„Z
dd„ Ze dej¡jZdd„ Zdd„ ZedkrseejƒdkrPee	ƒ ƒ dS ejd Zeeƒ�Zee	eeƒƒ W d  ƒ dS 1 slw   Y  dS dS )ú8A lexical analyzer class for simple shell-like syntaxes.é    N)Údeque)ÚStringIO)ÚshlexÚsplitÚquoteÚjoinc                   @   sv   e Zd ZdZ		ddd„Zedd„ ƒZdd	„ Zdd
d„Zdd„ Z	dd„ Z
dd„ Zdd„ Zddd„Zdd„ Zdd„ ZdS )r   r   NFc                 C   s  t |tƒr	t|ƒ}|d ur|| _|| _ntj| _d | _|| _|r$d | _nd| _d| _	d| _
| jr7|  j
d7  _
d| _d| _d| _d| _d	| _d
| _tƒ | _d| _d| _d| _tƒ | _d | _|sbd}n|du rhd}|| _|rŠtƒ | _|  j
d7  _
| j
 t |¡¡}| j
 |¡| _
d S d S )NÚ ú#Ú?abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_u|   ÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿Ã€Ã�Ã‚ÃƒÃ„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�Ã�Ã‘Ã’Ã“Ã”Ã•Ã–Ã˜Ã™ÃšÃ›ÃœÃ�Ãžz 	
Fz'"ú\ú"ú é   r   Tz();<>|&z~-./*?=)Ú
isinstanceÚstrr   ÚinstreamÚinfileÚsysÚstdinÚposixÚeofÚ
commentersÚ	wordcharsÚ
whitespaceÚwhitespace_splitÚquotesÚescapeÚescapedquotesÚstater   ÚpushbackÚlinenoÚdebugÚtokenÚ	filestackÚsourceÚ_punctuation_charsÚ_pushback_charsÚ	maketransÚdictÚfromkeysÚ	translate)Úselfr   r   r   Úpunctuation_charsÚt© r/   ú/usr/lib/python3.10/shlex.pyÚ__init__   sL   
ùzshlex.__init__c                 C   s   | j S ©N)r&   ©r,   r/   r/   r0   r-   D   s   zshlex.punctuation_charsc                 C   s*   | j dkrtdt|ƒ ƒ | j |¡ dS )z:Push a token onto the stack popped by the get_token methodr   zshlex: pushing token N)r"   ÚprintÚreprr    Ú
appendleft)r,   Útokr/   r/   r0   Ú
push_tokenH   s   
zshlex.push_tokenc                 C   sv   t |tƒr	t|ƒ}| j | j| j| jf¡ || _|| _d| _| jr9|dur/t	d| jf ƒ dS t	d| jf ƒ dS dS )z9Push an input source onto the lexer's input source stack.r   Nzshlex: pushing to file %szshlex: pushing to stream %s)
r   r   r   r$   r6   r   r   r!   r"   r4   )r,   Ú	newstreamÚnewfiler/   r/   r0   Úpush_sourceN   s   
üzshlex.push_sourcec                 C   sD   | j  ¡  | j ¡ \| _| _ | _| jrtd| j | jf ƒ d| _dS )zPop the input source stack.zshlex: popping to %s, line %dr   N)	r   Úcloser$   Úpopleftr   r!   r"   r4   r   r3   r/   r/   r0   Ú
pop_source\   s   

ÿ
zshlex.pop_sourcec                 C   sæ   | j r| j  ¡ }| jdkrtdt|ƒ ƒ |S |  ¡ }| jdurA|| jkrA|  |  ¡ ¡}|r8|\}}|  ||¡ |  	¡ }|| jks%|| j
krY| jsL| j
S |  ¡  |  	¡ }|| j
ksF| jdkrq|| j
krmtdt|ƒ ƒ |S tdƒ |S )zBGet a token from the input stream (or from stack if it's nonempty)r   zshlex: popping token Nzshlex: token=zshlex: token=EOF)r    r=   r"   r4   r5   Ú
read_tokenr%   Ú
sourcehookr;   Ú	get_tokenr   r$   r>   )r,   r7   ÚrawÚspecr:   r9   r/   r/   r0   rA   e   s4   




û

û

ÿzshlex.get_tokenc                 C   sÀ  d}d}	 | j r| jr| j ¡ }n| j d¡}|dkr"|  jd7  _| jdkr0td| j|f ƒ | jd u r:d| _	�nù| jdkrÄ|sFd | _�ní|| j
v r_| jd	krTtd
ƒ | j	s\| jr^|r^�nÕq|| jv rr| j ¡  |  jd7  _�nÀ| jr�|| jv r�d}|| _�n±|| jv rŽ|| _	d| _�n¤|| j v r›|| _	d| _�n—|| jv r«| js¦|| _	|| _�n‡| jr¶|| _	d| _�n||| _	| j	sÁ| jrÃ|rÃ�npq| j| jv �rd}|sÜ| jd	krØtdƒ tdƒ‚|| jkrõ| jsð|  j	|7  _	d| _�nCd| _�n=| j�r|| jv �r| j| jv �r| j}|| _�n$|  j	|7  _	�n| j| jv �rS|�s/| jd	k�r+tdƒ tdƒ‚|| jv �rH|| jk�rH||k�rH|  j	| j7  _	|  j	|7  _	|| _nß| jdv �r2|�s`d | _nÓ|| j
v �r€| jd	k�rptdƒ d| _| j	�s~| j�r|�rn´q|| jv �r§| j ¡  |  jd7  _| j�r¦d| _| j	�s¤| j�r¥|�r¥nŽqn‹| jdk�rË|| j v �r»|  j	|7  _	nw|| j
v�rÇ| j |¡ d| _nh| j�rÙ|| jv �rÙ|| _nY| j�ré|| jv �réd}|| _nI|| jv �sÿ|| jv �sÿ| j�r|| j v�r|  j	|7  _	n+| j �r| j |¡ n| j |¡ | jd	k�r"tdƒ d| _| j	�s0| j�r1|�r1nqq| j	}d| _	| j�rG|�sG|dk�rGd }| jdk�r^|�rZtdt|ƒ ƒ |S tdƒ |S )NFr   Tr   Ú
é   z&shlex: in state %r I see character: %rr	   é   z+shlex: I see whitespace in whitespace stateÚaÚcz shlex: I see EOF in quotes statezNo closing quotationz shlex: I see EOF in escape statezNo escaped character)rG   rH   z%shlex: I see whitespace in word statez&shlex: I see punctuation in word statezshlex: raw token=zshlex: raw token=EOF)r-   r'   Úpopr   Úreadr!   r"   r4   r   r#   r   r   r   Úreadliner   r   r   r   Ú
ValueErrorr   Úappendr    r6   r5   )r,   ÚquotedÚescapedstateÚnextcharÚresultr/   r/   r0   r?   …   s  
ÿ
















ÿ

ûÿ �ü ÿzshlex.read_tokenc                 C   sV   |d dkr|dd… }t | jtƒr$tj |¡s$tj tj | j¡|¡}|t|dƒfS )z(Hook called on a filename to be sourced.r   r   r   éÿÿÿÿÚr)	r   r   r   ÚosÚpathÚisabsr   ÚdirnameÚopen)r,   r:   r/   r/   r0   r@     s
   zshlex.sourcehookc                 C   s(   |du r| j }|du r| j}d||f S )z<Emit a C-compiler-like, Emacs-friendly error-message leader.Nz"%s", line %d: )r   r!   )r,   r   r!   r/   r/   r0   Úerror_leader   s
   zshlex.error_leaderc                 C   s   | S r2   r/   r3   r/   r/   r0   Ú__iter__(  s   zshlex.__iter__c                 C   s   |   ¡ }|| jkrt‚|S r2   )rA   r   ÚStopIteration)r,   r#   r/   r/   r0   Ú__next__+  s   
zshlex.__next__)NNFFr2   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   Úpropertyr-   r8   r;   r>   rA   r?   r@   rY   rZ   r\   r/   r/   r/   r0   r      s"    
ÿ/

	  
	r   FTc                 C   sD   | du rddl }|jdtdd� t| |d�}d|_|sd|_t|ƒS )	z-Split the string *s* using shell-like syntax.Nr   z4Passing None for 's' to shlex.split() is deprecated.rF   )Ú
stacklevel)r   Tr	   )ÚwarningsÚwarnÚDeprecationWarningr   r   r   Úlist)ÚsÚcommentsr   rc   Úlexr/   r/   r0   r   1  s   ÿr   c                 C   s   d  dd„ | D ƒ¡S )z3Return a shell-escaped string from *split_command*.r   c                 s   s   � | ]}t |ƒV  qd S r2   )r   )Ú.0Úargr/   r/   r0   Ú	<genexpr>@  s   € zjoin.<locals>.<genexpr>)r   )Úsplit_commandr/   r/   r0   r   >  s   r   z[^\w@%+=:,./-]c                 C   s,   | sdS t | ƒdu r| S d|  dd¡ d S )z1Return a shell-escaped version of the string *s*.z''Nú'z'"'"')Ú_find_unsafeÚreplace)rg   r/   r/   r0   r   E  s
   r   c                 C   s$   	 |   ¡ }|s	d S tdt|ƒ ƒ q)Nr   zToken: )rA   r4   r5   )ÚlexerÚttr/   r/   r0   Ú_print_tokensQ  s   ürs   Ú__main__r   )FT)r`   rT   Úrer   Úcollectionsr   Úior   Ú__all__r   r   r   ÚcompileÚASCIIÚsearchro   r   rs   r]   ÚlenÚargvÚfnrX   Úfr/   r/   r/   r0   Ú<module>   s.    	  
 

"ÿû