U
    Kvf4&                     @   s   d dl mZ ddddgZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ G d	d
 d
eZG dd deZG dd deZG dd deZG dd deZeejddZG dd deZdd Zdd Zdd Zd ddZdd ZdS )!    )print_functionToken	ParseNodeOperatorparse)
PatsyError)Origin)repr_pretty_delegaterepr_pretty_implno_picklingassert_no_picklingc                   @   s    e Zd Zdd Zdd ZeZdS )_UniqueValuec                 C   s
   || _ d S N)	_print_as)selfZprint_as r   6/tmp/pip-unpacked-wheel-68fdvdus/patsy/infix_parser.py__init__)   s    z_UniqueValue.__init__c                 C   s   d| j j| jf S )Nz%s(%r))	__class____name__r   r   r   r   r   __repr__,   s    z_UniqueValue.__repr__Nr   
__module____qualname__r   r   r   __getstate__r   r   r   r   r   (   s   r   c                   @   s:   e Zd ZdZedZedZd	ddZeZ	dd Z
eZdS )
r   zA token with possible payload.

    .. attribute:: type

       An arbitrary object indicating the type of this token. Should be
      :term:`hashable`, but otherwise it can be whatever you like.
    LPARENRPARENNc                 C   s   || _ || _|| _d S r   )typeoriginextra)r   r   r   r    r   r   r   r   <   s    zToken.__init__c                 C   s8   |rt g }| jd k	r"d| jfg}t|| | j| jg|S )Nr    )AssertionErrorr    r
   r   r   )r   pcyclekwargsr   r   r   _repr_pretty_B   s
    
zToken._repr_pretty_)N)r   r   r   __doc__r   r   r   r   r	   r   r%   r   r   r   r   r   r   r   1   s   
c                   @   s$   e Zd Zdd ZeZdd ZeZdS )r   c                 C   s   || _ || _|| _|| _d S r   )r   tokenargsr   )r   r   r'   r(   r   r   r   r   r   L   s    zParseNode.__init__c                 C   s   t || | j| j| jgS r   )r
   r   r'   r(   )r   r"   r#   r   r   r   r%   S   s    zParseNode._repr_pretty_N)	r   r   r   r   r	   r   r%   r   r   r   r   r   r   r   K   s   c                   @   s    e Zd Zdd Zdd ZeZdS )r   c                 C   s   || _ || _|| _d S r   )
token_typearity
precedence)r   r)   r*   r+   r   r   r   r   Y   s    zOperator.__init__c                 C   s   d| j j| j| j| jf S )Nz%s(%r, %r, %r))r   r   r)   r*   r+   r   r   r   r   r   ^   s
      zOperator.__repr__Nr   r   r   r   r   r   X   s   c                   @   s   e Zd Zdd ZeZdS )_StackOperatorc                 C   s   || _ || _d S r   )opr'   )r   r-   r'   r   r   r   r   e   s    z_StackOperator.__init__Nr   r   r   r   r   r   r   r   r   r   r,   d   s   r,   iigc                   @   s   e Zd Zdd ZeZdS )_ParseContextc                 C   s(   g | _ g | _|| _|| _|| _|| _d S r   )op_stack
noun_stack	unary_ops
binary_opsatomic_typestrace)r   r3   r4   r5   r6   r   r   r   r   n   s    z_ParseContext.__init__Nr.   r   r   r   r   r0   m   s   r0   c                 C   s   | j tjkr0|jrtd |jtt|  dS | j |j	krp|jrRtd| j f  |jt|j	| j  |  dS | j |j
kr|jrtd| j | jf  |jt| j | g | j dS td| j f | d S )NzPushing open-parenTzPushing unary op %rzPushing noun %r (%r)Fzexpected a noun, not '%s')r   r   r   r6   printr1   appendr,   _open_parenr3   r5   r    r2   r   r   r   relevant_code)r'   cr   r   r   _read_noun_contextx   s,    
r<   c                 C   s   | j s
t| j  }g }t|jjD ]}|| j  q$|  | j	r\t
d|jj|f  t|jj|j|t|jg| }| j| d S )NzReducing %r (%r))r1   r!   popranger-   r*   r8   r2   reverser6   r7   r)   r   r'   r   combine)r;   stackopr(   inoder   r   r   _run_op   s    

rD   c                 C   s:  | j tjkr|jrtd |jr>|jd jjtjkr>t	| q|jsNt
d| |jd jjtjksftt|jd j|jd j| g}||jd _|j  dS | j |jkr |jrtd| j   t|j| j  | }|jr|jj|jd jjkrt	| q|jrtd| j   |j| dS t
d| j f | d S )	NzFound close-parenr/   zmissing '(' or extra ')'FzFound binary operator %rzPushing binary operator %rTzexpected an operator, not '%s')r   r   r   r6   r7   r1   r-   r)   r   rD   r   r!   r   r@   r'   r2   r   r=   r4   r,   r+   r8   r:   )r'   r;   ZcombinedrA   r   r   r   _read_op_context   s@    





rE   Fc                 C   s$  t | }i }i }|D ]H}|jtjks(t|jdkr>|||j< q|jdkrT|||j< qtdqt||||}d}	|D ]2}
|jrt	d|	f  |	rt
|
|}	qtt|
|}	qt|jrt	d |	rtd|jd jj|jr|jd jjtjkrtd	|jd jt| qt|jdkst|j S )
N      z!operators must be unary or binaryTz!Reading next token (want_noun=%r)zEnd of token streamz1expected a noun, but instead the expression endedr/   zUnmatched '(')iterr+   r9   r!   r*   r)   
ValueErrorr0   r6   r7   r<   rE   r   r1   r'   r   r-   r   r   rD   lenr2   r=   )tokens	operatorsr5   r6   Ztoken_sourcer3   r4   r-   r;   Z	want_nounr'   r   r   r   infix_parse   s<    



rM   c                  C   s  t dddt dddt dddg} d	d
g}tddd}td	|dtd|dtd|dtd
|dtd|dttj|dtd	|dtd|dtd
|dttj|dg
}t|| |}dd }||dd ||jd d	d |jd jg kst||jd dd ||jd jd dd t|jd jd jdks2t||jd jd jd d
d ||jd jd dd ||jd jd jd d	d ||jd jd jd d
d dd l	}|
ttg t dddgdg t|| |dd d S )N+rG   
   *   -rF      ZATOM1ZATOM2Zasdf   ab(r;   d)c                 S   s"   | j |kst| jj|kstd S r   )r   r!   r'   r    )treer   r    r   r   r   te   s    ztest_infix_parse.<locals>.ter   ZATOMICT)r6   )r   r   r   r   r   rM   r(   r!   rJ   pytestZraisesrI   )opsZatomicZmock_originrK   rZ   r[   r\   r   r   r   test_infix_parse   sJ    











    r^   N)F)
__future__r   __all__Zpatsyr   Zpatsy.originr   Z
patsy.utilr	   r
   r   r   objectr   r   r   r   r,   r   r9   r0   r<   rD   rE   rM   r^   r   r   r   r   <module>   s    	"
,