B
    Âá|UT&  ã               @   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   ú1lib/python3.7/site-packages/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   zÈA 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 )N)Ú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 )N)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 )N)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 )N)Ú
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__N)r   r   r   r   r   r   r   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 )N)Ú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)   éÿÿÿÿiigÿc               @   s   e Zd Zdd„ ZeZdS )Ú_ParseContextc             C   s(   g | _ g | _|| _|| _|| _|| _d S )N)Úop_stackÚ
noun_stackÚ	unary_opsÚ
binary_opsÚatomic_typesÚtrace)r   r/   r0   r1   r2   r   r   r   r   n   s    z_ParseContext.__init__N)r   r   r   r   r   r   r   r   r   r   r,   m   s   r,   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r–t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   r2   Úprintr-   Úappendr)   Ú_open_parenr/   r1   r   r.   r   r   r   Úrelevant_code)r$   Úcr   r   r   Ú_read_noun_contextx   s&    
r8   c             C   s’   | j s
t‚| j  ¡ }g }x$t|jjƒD ]}| | j ¡ ¡ q&W | ¡  | j	r`t
d|jj|f ƒ t|jj|j|t |jg| ¡ƒ}| j |¡ d S )NzReducing %r (%r))r-   r   ÚpopÚranger*   r'   r4   r.   Úreverser2   r3   r&   r   r$   r   Úcombine)r7   Ústackopr%   ÚiZnoder   r   r   Ú_run_opŽ   s    

r?   c             C   sF  | j tjkr¤|jrtdƒ x&|jr@|jd jjtjkr@t	|ƒ qW |jsRt
d| ƒ‚|jd jjtjksjt‚t |jd j|jd j| g¡}||jd _|j ¡  dS | j |jkr,|jrÆtd| j  ƒ t|j| j  | ƒ}x,|jr|jj|jd jjkrt	|ƒ qÚW |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   r2   r3   r-   r*   r&   r   r?   r   r   r   r<   r$   r.   r   r9   r0   r)   r(   r4   r6   )r$   r7   Zcombinedr=   r   r   r   Ú_read_op_context›   s8    



r@   Fc             C   s2  t | ƒ}i }i }xP|D ]H}|jtjks*t‚|jdkr@|||j< q|jdkrV|||j< qtdƒ‚qW t||||ƒ}d}	x:|D ]2}
|jr’t	d|	f ƒ |	r¢t
|
|ƒ}	qzt|
|ƒ}	qzW |jr¾t	dƒ |	rÖtd|jd jjƒ‚x<|jr|jd jjtjkrtd	|jd jƒ‚t|ƒ qØW t|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(   r5   r   r'   r&   Ú
ValueErrorr,   r2   r3   r8   r@   r   r-   r$   r   r*   r   r   r?   Úlenr.   r9   )ÚtokensZ	operatorsr1   r2   Ztoken_sourcer/   r0   r*   r7   Z	want_nounr$   r   r   r   Úinfix_parse½   s:    




rG   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sèt‚||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	m
} |ttg t dddƒgdgƒ t|| |dd d S )Nú+rB   é
   Ú*é   ú-rA   é   ZATOM1ZATOM2Zasdfé   ÚaÚbú(r7   Údú)c             S   s"   | j |kst‚| jj|kst‚d S )N)r   r   r$   r   )Útreer   r   r   r   r   Úteû   s    ztest_infix_parse.<locals>.ter   )Úassert_raisesZATOMICT)r2   )r   r   r   r   r   rG   r%   r   rE   Z
nose.toolsrV   rD   )ZopsZatomicZmock_originrF   rT   rU   rV   r   r   r   Útest_infix_parseé   s>    









 rW   N)F)Z
__future__r   Ú__all__Zpatsyr   Zpatsy.originr   Z
patsy.utilr	   r
   r   r   Úobjectr   r   r   r   r)   r   r5   r,   r8   r?   r@   rG   rW   r   r   r   r   Ú<module>   s    	"
,