
[[\,                 @   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 g Z Gd d   d  Z	 d	 d
 d d  Z
 e j d e j  j Z d d   Z e d k r$e e j  d k r e	   Z n" e j d Z e	 e e  e  Z x0 e j   Z e re d e e   q Pq n  d S)z8A lexical analyzer class for simple shell-like syntaxes.    N)deque)StringIOshlexsplitquotec               @   s   e  Z d  Z d Z d d 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 d  Z d d   Z d d   Z d S)r   z8A lexical analyzer class for simple shell-like syntaxes.NFc             C   sA  t  | t  r t |  } n  | d  k	 r? | |  _ | |  _ n t j |  _ d  |  _ | |  _ | ro d  |  _ n	 d |  _ d |  _	 d |  _
 |  j r |  j
 d 7_
 n  d |  _ d |  _ d |  _ d |  _ d	 |  _ d
 |  _ t   |  _ d |  _ d |  _ d |  _ t   |  _ d  |  _ |  j r=t d |  j |  j f  n  d  S)N #Z?abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_u|   ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞz 	
Fz'"\"    r   zshlex: reading from %s, line %d)
isinstancestrr   instreaminfilesysstdinposixeof
commenters	wordchars
whitespacewhitespace_splitquotesescapeescapedquotesstater   pushbacklinenodebugtoken	filestacksourceprint)selfr   r   r    r%   /usr/lib/python3.4/shlex.py__init__   s<    																		zshlex.__init__c             C   s:   |  j  d k r& t d t |   n  |  j j |  d S)z:Push a token onto the stack popped by the get_token methodr   zshlex: pushing token N)r   r#   reprr   
appendleft)r$   tokr%   r%   r&   
push_token8   s    zshlex.push_tokenc             C   s   t  | t  r t |  } n  |  j j |  j |  j |  j f  | |  _ | |  _ d |  _ |  j r | d k	 r t	 d |  j f  q t	 d |  j f  n  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!   r)   r   r   r   r   r#   )r$   	newstreamnewfiler%   r%   r&   push_source>   s    "				zshlex.push_sourcec             C   sa   |  j  j   |  j j   \ |  _ |  _  |  _ |  j rT t d |  j  |  j f  n  d |  _ d S)zPop the input source stack.zshlex: popping to %s, line %dr   N)	r   closer!   popleftr   r   r   r#   r   )r$   r%   r%   r&   
pop_sourceL   s    !	zshlex.pop_sourcec             C   s>  |  j  rB |  j  j   } |  j d k r> t d t |   n  | S|  j   } |  j d k	 r x\ | |  j k r |  j |  j    } | r | \ } } |  j | |  n  |  j	   } q` Wn  x9 | |  j
 k r |  j s |  j
 S|  j   |  j	   } q W|  j d k r:| |  j
 k r-t d t |   q:t d  n  | 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   r0   r   r#   r(   
read_tokenr"   
sourcehookr.   	get_tokenr   r!   r1   )r$   r*   rawspecr-   r,   r%   r%   r&   r4   U   s.    		
zshlex.get_tokenc             C   s  d } d } x|  j  j d  } | d k r@ |  j d |  _ n  |  j d k rt t d t |  j  d t |   n  |  j d  k r d |  _ Pq |  j d k r| s d  |  _ Pq| |  j k r |  j d	 k r t d
  n  |  j s |  j	 r | r Pqq q| |  j
 k r.|  j  j   |  j d |  _ q|  j	 rX| |  j k rXd } | |  _ q| |  j k r|| |  _ d |  _ q| |  j k r|  j	 s| |  _ n  | |  _ q|  j r| |  _ d |  _ q| |  _ |  j s|  j	 r | r Pqq q |  j |  j k rd } | s>|  j d	 k r/t d  n  t d   n  | |  j k r|  j	 ss|  j | |  _ d |  _ Pqd |  _ q|  j	 r| |  j k r|  j |  j k r|  j } | |  _ q|  j | |  _ q |  j |  j k rp| s|  j d	 k rt d  n  t d   n  | |  j k rT| |  j k rT| | k rT|  j |  j |  _ n  |  j | |  _ | |  _ q |  j d k r | sd  |  _ Pq| |  j k r|  j d	 k rt d  n  d |  _ |  j s|  j	 r | r Pqq q| |  j
 k rK|  j  j   |  j d |  _ |  j	 rd |  _ |  j s>|  j	 r | r PqHq qq|  j	 ro| |  j k ro| |  _ q|  j	 r| |  j k rd } | |  _ q| |  j k s| |  j k s|  j r|  j | |  _ q|  j j |  |  j d	 k rt d  n  d |  _ |  j r Pqq q q |  j } d |  _ |  j	 rU| rU| d k rUd  } n  |  j d k r| rt d t |   qt d  n  | S)NFr   r   
   zshlex: in statezI see character:r      z+shlex: I see whitespace in whitespace stateaTz shlex: I see EOF in quotes statezNo closing quotationz shlex: I see EOF in escape statezNo escaped characterz%shlex: I see whitespace in word statez&shlex: I see punctuation in word statezshlex: raw token=zshlex: raw token=EOF)r   readr   r   r#   r(   r   r    r   r   r   readliner   r   r   r   
ValueErrorr   r   r)   )r$   ZquotedZescapedstateZnextcharresultr%   r%   r&   r2   u   s    																						zshlex.read_tokenc             C   s   | d d k r# | d d  } n  t  |  j t  ro t j j |  ro t j j t j j |  j  |  } n  | 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$   r-   r%   r%   r&   r3      s
    %'zshlex.sourcehookc             C   s>   | d k r |  j  } n  | d k r0 |  j } n  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)Nr%   )r$   r%   r%   r&   __iter__  s    zshlex.__iter__c             C   s(   |  j    } | |  j k r$ t  n  | S)N)r4   r   StopIteration)r$   r    r%   r%   r&   __next__	  s    	zshlex.__next__)__name__
__module____qualname____doc__r'   r+   r.   r1   r4   r2   r3   rG   rH   rJ   r%   r%   r%   r&   r      s   $	 	FTc             C   s7   t  |  d | } d | _ | s- d | _ n  t |  S)Nr   Tr   )r   r   r   list)sZcommentsr   Zlexr%   r%   r&   r     s
    	z[^\w@%+=:,./-]c             C   s8   |  s
 d St  |   d k r  |  Sd |  j d d  d S)z1Return a shell-escaped version of the string *s*.z''N'z'"'"')_find_unsafereplace)rP   r%   r%   r&   r     s
    __main__r   zToken: )rN   rA   rer   collectionsr   ior   __all__r   r   compileASCIIsearchrR   r   rK   lenargvZlexerfilerF   r4   Zttr#   r(   r%   r%   r%   r&   <module>   s(   