U
    pd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 ddddg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 5 Q R X 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 k	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k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.   /usr/lib/python3.8/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k	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k	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 krtd| _	qq| jdkr|sd | _qq|| j
kr| jdkrtd	 | j	s| jr|rqnqn|| jkr| j  |  jd7  _n| jr|| jkrd
}|| _n|| jkr&|| _	d
| _nr|| j kr@|| _	d| _nX|| jkrb| jsZ|| _	|| _n6| jrx|| _	d
| _n || _	| j	s| jr|rqnqq| j| jkrDd}|s| jdkrtd td|| jkr| js|  j	|7  _	d| _qnd
| _n>| jr4|| jkr4| j| jkr4| j}|| _n|  j	|7  _	q| j| jkr|st| jdkrltd td|| jkr|| jkr||kr|  j	| j7  _	|  j	|7  _	|| _q| jdkr|sd | _qq|| j
kr| jdkrtd d| _| j	s| jr|rqnqq|| jkrh| j  |  jd7  _| jrd| _| j	s| jr|rqnqq| jdkr|| j kr|  j	|7  _	n"|| j
kr| j| d| _qq| jr|| jkr|| _q| jr|| jkrd
}|| _q|| jks|| jks| jr,|| j k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kr| j }|dk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      
/

	  	
FTc                 C   s$   t | |d}d|_|sd|_t|S )z-Split the string *s* using shell-like syntax.)r   Tr	   )r   r   r   list)sZcommentsr   Zlexr.   r.   r/   r   1  s
    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><  s     zjoin.<locals>.<genexpr>)r   )Zsplit_commandr.   r.   r/   r   :  s    z[^\w@%+=:,./-]c                 C   s,   | sdS t | dkr| S d| dd d S )z1Return a shell-escaped version of the string *s*.z''N'z'"'"')_find_unsafereplace)r_   r.   r.   r/   r   A  s
    c                 C   s$   |   }|sq tdt|  q d S )NzToken: )r@   r3   r4   )ZlexerZttr.   r.   r/   _print_tokensM  s    rf   __main__r   )FT)r\   rP   rer   collectionsr   ior   __all__r   r   r   compileASCIIsearchrd   r   rf   rY   lenargvfnrT   fr.   r.   r.   r/   <module>   s(   	   
	

