a
    If4                     @   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reejdkree	  n@ejd ZeeZee	ee W d   n1 s0    Y  dS )8A lexical analyzer class for simple shell-like syntaxes.    N)deque)StringIO)shlexsplitquotejoinc                   @   sr   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 | _|| _|rHd | _nd| _d| _	d| _
| jrn|  j
d7  _
d| _d| _d| _d| _d	| _d
| _t | _d| _d| _d| _t | _d | _|sd}n|du rd}|| _|rt | _|  j
d7  _
| j
t|}| j
|| _
d S )N #Z?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.   lib/python3.9/shlex.py__init__   sJ    
zshlex.__init__c                 C   s   | j S N)r%   r+   r.   r.   r/   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.   r/   
push_tokenH   s    
zshlex.push_tokenc                 C   sp   t |trt|}| j| j| j| jf || _|| _d| _| jrl|dur\t	d| jf  nt	d| jf  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#   r5   r   r   r    r!   r3   )r+   	newstreamnewfiler.   r.   r/   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!   r3   r   r2   r.   r.   r/   
pop_source\   s    

zshlex.pop_sourcec                 C   s   | j r.| j  }| jdkr*tdt|  |S |  }| jdurz|| jkrz| |  }|rp|\}}| || | 	 }q@|| j
kr| js| j
S |   | 	 }qz| jdkr|| j
krtdt|  n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!   r3   r4   
read_tokenr$   
sourcehookr:   	get_tokenr   r#   r=   )r+   r6   rawspecr9   r8   r.   r.   r/   r@   e   s.    








zshlex.get_tokenc                 C   s  d}d}| j r | jr | j }n| jd}|dkrB|  jd7  _| jdkr^td| j|f  | jd u rtd| _	qq| jdkr|sd | _qq|| j
v r| jdkrtd	 | j	s| jr|rqnqn|| jv r| j  |  jd7  _n| jr|| jv rd
}|| _n|| jv r&|| _	d
| _nr|| j v r@|| _	d| _nX|| jv rb| jsZ|| _	|| _n6| jrx|| _	d
| _n || _	| j	s| jr|rqnqq| j| jv rDd}|s| jdkrtd td|| jkr| js|  j	|7  _	d| _qnd
| _n>| jr4|| jv r4| j| jv r4| j}|| _n|  j	|7  _	q| j| jv r|st| jdkrltd td|| jv r|| jkr||kr|  j	| j7  _	|  j	|7  _	|| _q| jdv r|sd | _qq|| j
v r| jdkrtd d| _| j	s| jr|rqnqq|| jv rh| j  |  jd7  _| jrd| _| j	s| jr|rqnqq| jdkr|| j v r|  j	|7  _	n"|| j
vr| j| d| _qq| jr|| jv r|| _q| jr|| jv rd
}|| _q|| jv s|| jv s| jr,|| j vr,|  j	|7  _	q| j rB| j| n| j| | jdkrbtd d| _| j	s| jr|rqqqq| j	}d| _	| jr|s|dkrd }| jdkr|rtdt|  ntd |S )NFr   r   
   z&shlex: in state %r I see character: %rr	      z+shlex: I see whitespace in whitespace stateacTz shlex: I see EOF in quotes statezNo closing quotationz shlex: I see EOF in escape statezNo escaped character)rF   rG   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!   r3   r   r"   r   r   r   readliner   r   r   r   
ValueErrorr   appendr   r5   r4   )r+   ZquotedZescapedstateZnextcharresultr.   r.   r/   r>      s
   







zshlex.read_tokenc                 C   sV   |d dkr|dd }t | jtrHtj|sHt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+   r9   r.   r.   r/   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.   r/   error_leader   s
    zshlex.error_leaderc                 C   s   | S r1   r.   r2   r.   r.   r/   __iter__(  s    zshlex.__iter__c                 C   s   |   }|| jkrt|S r1   )r@   r   StopIteration)r+   r"   r.   r.   r/   __next__+  s    
zshlex.__next__)NNFF)N)NN)__name__
__module____qualname____doc__r0   propertyr,   r7   r:   r=   r@   r>   r?   rU   rV   rX   r.   r.   r.   r/   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.rE   )
stacklevel)r   Tr	   )warningswarnDeprecationWarningr   r   r   list)sZcommentsr   r_   Zlexr.   r.   r/   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 r1   )r   ).0argr.   r.   r/   	<genexpr>@      zjoin.<locals>.<genexpr>)r   )Zsplit_commandr.   r.   r/   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)rc   r.   r.   r/   r   E  s
    r   c                 C   s$   |   }|sq tdt|  q d S )NzToken: )r@   r3   r4   )ZlexerZttr.   r.   r/   _print_tokensQ  s    rk   __main__r   )FT)r\   rP   rer   collectionsr   ior   __all__r   r   r   compileASCIIsearchri   r   rk   rY   lenargvfnrT   fr.   r.   r.   r/   <module>   s(   	   


