o
    f4                     @   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}|| _|rt | _|  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^nq|| jv rr| j  |  jd7  _n| jr|| jv rd}|| _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rt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nq|| jv r| j  |  jd7  _| jrd| _| j	s| jr|rnq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 rd}|| _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.    	  
 

"