o
    e³ƒX¢3  ã                   @   s‚   d Z ddlZddlZddlmZ zddlmZ W n ey'   ddlmZ Y nw ze W n e	y7   e
ZY nw G dd„ dƒZdS )ú8A lexical analyzer class for simple shell-like syntaxes.é    N)Údeque)ÚStringIOc                   @   sn   e Zd ZdZ		d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eZdS )Úshlexr   NFc                 C   s  t |tƒr	t|ƒ}|d ur|| _|| _ntj| _d | _|| _|r$d | _nd| _d| _	d| _
d| _d| _d| _d| _d| _d	| _tƒ | _d
| _d| _d| _tƒ | _d | _|sXd}n|du r^d}|| _|r~tƒ | _|  j
d7  _
| j
 t |¡¡}| j
 |¡| _
d | _d| _d S )NÚ ú#Ú?abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_z 	
Fz'"ú\ú"ú é   r   Tz();<>|&z~-./*?=) Ú
isinstanceÚ
basestringr   Ú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Úlast_wordbreak_posÚ
wordbreaks)Úselfr   r   r   r#   Út© r-   ú6/usr/lib/python3/dist-packages/argcomplete/my_shlex.pyÚ__init__"   sJ   

zshlex.__init__c                 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_tokenW   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!   r2   r   r   r   r   r0   )r+   Ú	newstreamÚnewfiler-   r-   r.   Úpush_source]   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   r0   r   ©r+   r-   r-   r.   Ú
pop_sourcel   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   r9   r   r0   r1   Ú
read_tokenr"   Ú
sourcehookr7   Ú	get_tokenr   r!   r;   )r+   r3   ÚrawÚspecr6   r5   r-   r-   r.   r>   u   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Ã�nxq| j| jv �rd}|sÜ| jd	krØtdƒ tdƒ‚|| jkrõ| jsð|  j	|7  _	d| _�nKd| _�nE| 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 �r:|�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�rµ|| jv �rµ|| _n…| j�rÅ|| jv �rÅd}|| _nu| jdk�ré|| j v �rÙ|  j	|7  _	na|| j
v�rå| j |¡ d| _nR|| jv �sù|| jv �sù| j�r|  j	|7  _	|| jv �rt| j	ƒd | _n+| j �r| j |¡ n| j |¡ | jd	k�r*tdƒ d| _| j	�s8| j�r9|�r9nqq| j	}d| _	| j�rO|�sO|dk�rOd }| jdk�re|�ratdt|ƒ ƒ ntdƒ | jdk�rnd | _|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)rD   rE   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   r0   r   r    r   r   r   Úreadliner   r   r   r   Ú
ValueErrorr   Úappendr*   Úlenr)   r   r2   r1   )r+   ÚquotedÚescapedstateÚnextcharÚresultr-   r-   r.   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ÚisabsÚjoinÚdirnameÚopen)r+   r6   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_leader6  s
   zshlex.error_leaderc                 C   s   | S ©Nr-   r:   r-   r-   r.   Ú__iter__>  s   zshlex.__iter__c                 C   s   |   ¡ }|| jkrt‚|S rY   )r>   r   ÚStopIteration)r+   r    r-   r-   r.   Ú__next__A  s   
zshlex.__next__)NNFFrY   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   r4   r7   r;   r>   r<   r=   rX   rZ   r\   Únextr-   r-   r-   r.   r       s     
ÿ5
	  

r   )r`   rR   r   Úcollectionsr   r   ÚImportErrorÚior   Ú	NameErrorÚstrr   r-   r-   r-   r.   Ú<module>   s   	ÿÿ