
    .Cc&                     H   d dl mZ dgZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZ d dlmZmZ d d	lmZ g d
Zd Zd Zd Zd Z eddd          Ze eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd          g
Zg fdZi dddgd ddgd!ddgdddgd"dd"gd#g d$d%g d$d&g d$d'dd"dd(ggd)ddg d*d+ggd,dddd"g d-gd.ggd/dg d0gd1dg d0gd2dg d*g d3gd4ddd"g d5ggd6ddg d7ggd8ddg d9ggddd"g d:ggddg d*d+ggddd"g d:ggddd"g d;ggdd"gdddggd<Zd= Zd> Z d? Z!d@ Z"g dAZ#dB Z$g fdCZ%dg dDgddd"g dEggdFZ&dG Z'dS )H    )print_functionparse_formulaN)	cStringIO)
PatsyError)Origin)TokenOperatorinfix_parse	ParseNode)python_tokenizepretty_untokenize)PushbackAdapter)PYTHON_EXPRZEROONENUMBERc                 @    	  | |           dS # t           $ r Y dS w xY w)NTF)
ValueError)fvs     3lib/python3.11/site-packages/patsy/parse_formula.py_is_ar      s?    	! t    uus    
c                    g }g }g }d}| D ]\  }}}|dk    sJ |dk    r||v r|                      |||f            nh|dv r|dz  }|dv r|dz  }|dk     rt          d|          |                    |           |                    |           |                    |           |dk    rt          t	          ||                    }	|	dk    rd}
n8|	dk    rd	}
n/t          t          |	          st          t          |	          rd
}
nd}
t          |
t          j
        |          |	          S t          dt          j
        |                    )Nr   )([{   ))]}zunmatched close bracket0r   1r   r   r   )extraz.unclosed bracket in embedded Python expression)	push_backr   appendr   zipr   intfloatr   r   combine)it
end_tokenspytypestoken_stringsoriginsbracket_levelpytypetoken_stringorigin	expr_text
token_types              r   _read_python_exprr5   %   s    GMGM(*  $f!!!!A 	,*"< 	LL&,7888E?* 	QM?* 	QM1 	@6???v\***v 5%c'=&A&ABB	 	'JJ# 	'JJ3	"" 	'eE9&=&= 	'!JJ&JZ!8!8	JJJJ )"N7335 5 	5    c              #     K   d|vsJ d|vsJ t           j        t           j        d}|D ]}|||<   t          |          }|                    d           t          t          |                     }|D ]M\  }}}||v rt          ||         |          V  #|                    |||f           t          ||          V  Nd S )Nr   r   )r   r   )	r   LPARENRPARENsetremover   r   r$   r5   )	codeoperator_stringsmagic_token_typesoperator_stringr+   r*   r0   r1   r2   s	            r   _tokenize_formular@   K   s     &&&&&&&&&&#l#l  , = =-</** &''Jc	..	/	/B(* 4 4$f,, 	4),7@@@@@@LL&,7888#B
3333334 4r6   c                  T   d} t          t          | g d                    }dt          | dd          dfdt          | dd	          d fdt          | d
d          dfdt          | dd          d ft          j        t          | dd          d fdt          | dd          dft          j        t          | dd          d fdt          | dd          d fdt          | dd          d fdt          | dd          dfdt          | dd          d fdt          | d d!          d"fdt          | d#d$          d fd%t          | d&d'          d(fg}t          ||          D ]U\  }}t          |t                    sJ |j        |d         k    sJ |j	        |d         k    sJ |j
        |d         k    sJ Vd S ))Nz&y ~ a + (foo(b,c +   2)) + -1 + 0 + 10)+-~r   r   r   yrD               arB            	      zfoo(b, c + 2)         rC         r      r"         r       !   r!   "   #   r   $   &   10)listr@   r   r   r8   r9   r&   
isinstancetyper2   r#   )r<   tokens	expectedsgotexpecteds        r   test__tokenize_formularf   `   s   3D#D///::;;Fa!3!3S9vdAq))40a!3!3S9vdAq))40,tQ 2 2D9a!4!4oF,tR 4 4d;vdB++T2vdB++T2b"--s3vdB++T2&r2..4vdB++T2F4R00$7I VY// ( (X#u%%%%%x8A;&&&&zXa[((((yHQK'''''	( (r6   rD   r   irF   rB   d   rC   *   /:i,  **i  c                 T   |                                  sd} |D ]}|j        dk     rt          d          t          |z   }d |D             }t	          t          | |          |t                    }t          |t                    r|j	        dk    rt          dd |g|j
                  }|S )Nz~ 1r   z'all operators must have precedence >= 0c                     g | ]	}|j         
S  )r4   ).0ops     r   
<listcomp>z!parse_formula.<locals>.<listcomp>   s    :::":::r6   rD   )strip
precedencer   _default_opsr
   r@   _atomic_token_typesr`   r   ra   r2   )r<   extra_operatorsrq   	operatorsr=   trees         r   r   r      s    ::<<  H H=1 	HFGGG	H .I::	:::(/?@@ *, ,D dI&& 9$)s*: 9dTFDK88Kr6    r"    z 
 rJ   za ~ b)rD   rJ   bz(a ~ b)za ~ ((((b))))za ~ ((((+b))))r|   z	a + b + c)rB   rJ   r|   cza + (b ~ c) + d)rD   r|   r}   dza + np.log(a, base=10))rB   rJ   znp.log(a, base=10)za + np . log(a , base = 10)za + b ~ c * d)rh   r}   r~   z	a + b * c)rh   r|   r}   z-a**2)rl   rJ   2z-a:b)rk   rJ   r|   )rk   r|   r}   )rj   r|   r}   )za + b:cz	(a + b):cza*b:cza+b / cz~ az-1c                    t          | t                    sJ | j        rH| j        |d         k    sJ t	          | j        |dd                    D ]\  }}t          ||           d S | j        t          v sJ | j        j        |k    sJ d S )Nr   r   )	r`   r   argsra   r&   _compare_treesrv   tokenr#   )rd   re   argexpected_args       r   r   r      s    c9%%%%%
x +x8A;&&&&!$SXx|!<!< 	. 	.C3----	. 	. x.....y(******r6   c                     t          j        |           D ]_\  }}t          ||          }t          t	          |          t	          |                     t          |           t          ||           `d S Nrw   )six	iteritemsr   printreprr   )
test_casesrw   r<   re   actuals        r   _do_parse_testr      su    -
33 ) )ht_EEEd4jj$x..)))fvx((((	) )r6   c                  0    t          t          g            d S )N)r   _parser_testsro   r6   r   test_parse_formular      s    ="%%%%%r6   c                  Z   t          d          } | j        t          ddd          k    sJ | j        j        t          ddd          k    sJ | j        d         j        t          ddd          k    sJ | j        d         j        t          ddd          k    sJ | j        d         j        j        t          ddd	          k    sJ | j        d         j        d         j        t          ddd
          k    sJ | j        d         j        d         j        t          ddd          k    sJ d S )Nz	a ~ b + cr   rN   rF   rG   r   rH   rK   rL   rI   rM   )r   r2   r   r   r   )ry   s    r   test_parse_originr      s'   %%D;&a333333:{Aq 9 999999Q<&a";";;;;;9Q<&a";";;;;;9Q<${Aq(A(AAAAA9Q<Q&&a*C*CCCCC9Q<Q&&a*C*CCCCCCCr6   )za <+>za + <(>za + b <# asdf>z<)>za + <)>z<*> aza + <*>za + <foo[bar>za + <foo{bar>za + <foo(bar>z
a + <[bar>z
a + <{bar>za + <{bar[]>za + foo<]>barza + foo[]<]>barza + foo{}<}>barza + foo<)>barza + b<)>z(a) <.>z<(>a + bz
a +< >'fooc                    |D ]}g }d }d }|D ]C}|dk    rt          |          }|dk    rt          |          }.|                    |           Dd                    |          }||J t          |           t          t	          |          ||           	  | |           J d            # t
          $ rP}t          |           |j        j        |k    sJ |j        j        |k    sJ |j        j	        |k    sJ Y d }~d }~ww xY wd S )N<>rz   Fz!parser failed to report an error!)
lenr%   joinr   r   r   r2   r<   startend)	parse_fnerror_descs
error_desclettersr   r   letterbad_codees	            r   _parsing_error_testr      sh   ! > >
  	' 	'F} 'G3 ''llv&&&&777##4S444jd8nneS)))	>HX >====  	' 	' 	'!HHH8=H,,,,8>U****8<3&&&&&&&&&		'#> >s   B00
D
:ADD
c                 <      fd}t          |t                     d S )Nc                 &    t          |           S r   )r   )r<   rw   s    r   r   z#test_parse_errors.<locals>.parse_fn  s    T?CCCCr6   )r   _parser_error_tests)rw   r   s   ` r   test_parse_errorsr     s8    D D D D D"566666r6   )|rJ   r|   )r   r|   r}   )za | bza * b|cc                      t          ddd          g} t          t          |            t          t          |            t	          |            d S )Nr   rF      r   )r	   r   r   _extra_op_parser_testsr   r   s    r   test_parse_extra_opr   $  sf    Q,,-O=#24 4 4 4)#24 4 4 4o666666r6   )(
__future__r   __all__tokenizer   	six.movesr   StringIOpatsyr   patsy.originr   patsy.infix_parserr   r	   r
   r   patsy.tokensr   r   
patsy.utilr   rv   r   r5   r@   rf   _unary_tilderu   r   r   r   r   r   r   r   r   r   r   r   ro   r6   r   <module>r      s}   & % % % % %
  



 + + + + + +             F F F F F F F F F F F F ; ; ; ; ; ; ; ; & & & & & &>>>   $5 $5 $5L4 4 4*( ( (0 xQ%%HS!THS!SHS!SHS!SHS!SHS!SHT1cHS!SHS!S )+    &!c
!#s! S#J!
 #s! #s! ___! ! ___! sC#s,! #___c23! cCooo#>DE!  s$D$D$DE!!$ "C)I)I)I#J%!* c???OOO<+!, #S///23-!. cC)))*+/!0 S3()1!2 c301___c23Cooo./c301:c

A! ! !F+ + +) ) )& & &D D D   F> > >4 ') 7 7 7 7 ???#c301  
7 7 7 7 7r6   