o
    >c4                     @   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 #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.   Y/Volumes/Data/workspace/med-macos-weekly/build/ExtProjs/pyncpp/python/source/Lib/shlex.py__init__   sL   
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   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#   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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!   r3   r4   
read_tokenr$   
sourcehookr:   	get_tokenr   r#   r=   )r+   r6   rawspecr9   r8   r.   r.   r/   r@   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)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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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__)NNFFr1   )NN)__name__
__module____qualname____doc__r0   propertyr,   r7   r:   r=   r@   r>   r?   rV   rW   rY   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)scommentsr   r`   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>@  s    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)rd   r.   r.   r/   r   E  s
   r   c                 C   s$   	 |   }|s	d S tdt|  q)Nr   zToken: )r@   r3   r4   )lexerttr.   r.   r/   _print_tokensQ  s   ro   __main__r   )FT)r]   rQ   rer   collectionsr   ior   __all__r   r   r   compileASCIIsearchrk   r   ro   rZ   lenargvfnrU   fr.   r.   r.   r/   <module>   s.    	  
 

"