o
    #e4&                     @   s   d dl mZ g d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                   @       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   2lib/python3.10/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   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      || _ || _|| _d S r   )typeoriginextra)r   r    r!   r"   r   r   r   r   <      
zToken.__init__c                 C   s8   |rJ g }| j d urd| j fg}t|| | j| jg|S )Nr"   )r"   r
   r    r!   )r   pcyclekwargsr   r   r   _repr_pretty_B   s
   
zToken._repr_pretty_r   )r   r   r   __doc__r   r   r   r   r	   r   r'   r   r   r   r   r   r   r   1   s    
r   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
    r   c                   @   r   )r   c                 C   r   r   )
token_typearity
precedence)r   r+   r,   r-   r   r   r   r   Y   r#   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    r   c                   @      e Zd Zdd ZeZdS )_StackOperatorc                 C   s   || _ || _d S r   )opr)   )r   r0   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                   @   r.   )_ParseContextc                 C   s(   g | _ g | _|| _|| _|| _|| _d S r   )op_stack
noun_stack	unary_ops
binary_opsatomic_typestrace)r   r6   r7   r8   r9   r   r   r   r   n   s   
z_ParseContext.__init__Nr1   r   r   r   r   r3   m   s    r3   c                 C   s   | j tjkr|jrtd |jtt|  dS | j |j	v r8|jr)td| j f  |jt|j	| j  |  dS | j |j
v rZ|jrKtd| j | jf  |jt| j | g | j dS td| j f | )NzPushing open-parenTzPushing unary op %rzPushing noun %r (%r)Fzexpected a noun, not '%s')r    r   r   r9   printr4   appendr/   _open_parenr6   r8   r"   r5   r   r!   r   relevant_code)r)   cr   r   r   _read_noun_contextx   s,   
r?   c                 C   s   | j sJ | 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))r4   popranger0   r,   r;   r5   reverser9   r:   r+   r   r)   r   combine)r>   stackopr*   iZnoder   r   r   _run_op   s   

rF   c                 C   sd  | j tjkr\|jrtd |jr+|jd jjtjkr+t	| |jr+|jd jjtjks|js3t
d| |jd jjtjks?J t|jd j|jd j| g}||jd _|j  dS | j |jv r|jrltd| j   t|j| j  | }|jr|jj|jd jjkrt	| |jr|jj|jd jjks|jrtd| j   |j| dS t
d| j f | )	NzFound close-parenr2   zmissing '(' or extra ')'FzFound binary operator %rzPushing binary operator %rTzexpected an operator, not '%s')r    r   r   r9   r:   r4   r0   r+   r   rF   r   r   rC   r)   r5   r!   r@   r7   r/   r-   r;   r=   )r)   r>   ZcombinedrD   r   r   r   _read_op_context   sD   



rG   Fc                 C   s"  t | }i }i }|D ]#}|jtjksJ |jdkr|||j< q
|jdkr*|||j< q
tdt||||}d}	|D ]}
|jrEtd|	f  |	rMt	|
|}	q9t
|
|}	q9|jrZtd |	rftd|jd jj|jr|jd jjtjkr|td	|jd jt| |jsit|jdksJ |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 endedr2   zUnmatched '(')iterr-   r<   r,   r+   
ValueErrorr3   r9   r:   r?   rG   r   r4   r)   r!   r0   r   r   rF   lenr5   r@   )tokensZ	operatorsr8   r9   Ztoken_sourcer6   r7   r0   r>   Z	want_nounr)   r   r   r   infix_parse   s>   


rN   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stJ ||jd dd ||jd jd dd t|jd jd jdksJ ||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+rI   
   *   -rH      ZATOM1ZATOM2Zasdf   ab(r>   d)c                 S   s"   | j |ksJ | jj|ksJ d S r   )r    r)   r"   )treer    r"   r   r   r   te   s   ztest_infix_parse.<locals>.ter   ZATOMICT)r9   )r   r   r   r   r   rN   r*   rL   pytestZraisesrK   )opsZatomicZmock_originrM   r[   r\   r]   r   r   r   test_infix_parse   sD   











r_   N)F)Z
__future__r   __all__Zpatsyr   Zpatsy.originr   Z
patsy.utilr	   r
   r   r   objectr   r   r   r   r/   r   r<   r3   r?   rF   rG   rN   r_   r   r   r   r   <module>   s"   	
",