o
    .dd!                     @   s  U d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% ddlm&Z& ddlm'Z' dd lm(Z( dd!lm)Z) dd"lm*Z* dd#lm+Z+ dd$lm,Z, dd%lm-Z- dd&lm.Z. dd'lm/Z/ dd(lm0Z0 dd)lm1Z1 dd*lm2Z2 dd+lm3Z3 dd,lm4Z4 dd-lm5Z5 dd.lm6Z6 dd/lm7Z7 d0Z8d1Z9d2Z:d3Z;d4Z<d5Z=e(e8e#e;e.e;e'e;e/e;e,e;e+e;e&e;e e<ee9e3e9e1e9e5e8iZ>e$ee7ee0ee2ee!eeee6ee)ee%ee(ee*eiZ?ee@eegef f eAd6< eBe#e3ee.e'e/e,e+e&e f
ZCeBe1gZDd7ed8efd9d:ZEd7ed;ed8e	fd<d=ZFd7ed;ed8e	fd>d?ZGe8fd7ed@eHd8efdAdBZeeZIeIe?e-< dPdCe@dDeHd8efdEdFZJd7ed8efdGdHZKd7ed8efdIdJZLi e?e1eEe-eKe4eLiZMe8fd7ed@eHd8efdKdLZNdPdCe@dDeHd8efdMdNZOdOS )Qz*Functions for parsing boolean expressions.    )Callable)Dict)LiquidSyntaxError)BooleanExpression)
Expression)InfixExpression)PrefixExpression)tokenize)tokenize_with_parens)make_parse_range)parse_blank)parse_boolean)parse_empty)parse_float_literal)parse_identifier)parse_integer_literal)	parse_nil)parse_string_literal)	parse_obj)TokenStream)	TOKEN_AND)TOKEN_BLANK)TOKEN_CONTAINS)TOKEN_EMPTY)	TOKEN_EOF)TOKEN_EQ)TOKEN_FALSE)TOKEN_FLOAT)TOKEN_GE)TOKEN_GT)TOKEN_IDENTIFIER)TOKEN_INTEGER)TOKEN_LBRACKET)TOKEN_LE)TOKEN_LG)TOKEN_LPAREN)TOKEN_LT)TOKEN_NE)	TOKEN_NIL)	TOKEN_NOT)
TOKEN_NULL)TOKEN_OR)TOKEN_RANGE_LITERAL)TOKEN_RPAREN)TOKEN_STRING)
TOKEN_TRUE                  	TOKEN_MAPstreamreturnc                 C   s0   t | }|d tksJ t|d t| tddS )zParse a prefix expression from a stream of tokens.

    Note that "standard" Liquid boolean expressions do not have any prefix expressions.
       )
precedence)operatorright)nextr)   r   parse_obj_with_parensPRECEDENCE_LOGICALRIGHT)r7   tok rA   X/var/www/Matress/matenv/lib/python3.10/site-packages/liquid/expressions/boolean/parse.pyparse_prefix_expressiono   s   rC   leftc                 C   s6   | j }t|d t}|   t||d t| |dS z2Parse an infix expression from a stream of tokens.r0   r9   )rD   r;   r<   )currentPRECEDENCESgetPRECEDENCE_LOWEST
next_tokenr   r   r7   rD   r@   r:   rA   rA   rB   parse_infix_expression   s   rL   c                 C   s0   t | }t|d t}t||d t| |dS rE   )r=   rG   rH   rI   r   r>   rK   rA   rA   rB   "parse_infix_expression_with_parens   s   rM   r:   c              
   C   s   zt | jd  | }W n ty' } ztd| jd | jd d|d}~ww 	 | jd }|tks:t|t|k r=	 |S |t	vrC|S t
|  t| |}q))zParse the next object from the stream of tokens.

    This object parser is for "standard" boolean expressions. It does not
    handle logical `not` or grouping with parentheses.
    r0   unexpected r9   r   linenumN)r6   rF   KeyErrorr   peekr   rG   rH   rI   BINARY_OPERATORSr=   rL   )r7   r:   rD   errpeek_typrA   rA   rB   r      s,   	

r   exprrP   c                 C   s   t ttt| |S )z2Parse a string as a "standard" boolean expression.)r   r   r   r	   )rV   rP   rA   rA   rB   parse   s   rW   c                 C   sn   t |  t| }t |  | jd tkr0| jd tkr#td| jd dt| |d}| jd tks| t |S )z%Parse a group of logical expressions.r0   zunbalanced parenthesesr   rO   )rD   )r=   r>   rF   r-   r   r   rM   expect)r7   rV   rA   rA   rB   parse_grouped_expression   s   
rY   c                 C   s   |  t t|  t| S )zELike `parse_range` but consumes the extra `RANGE_LPAREN` token first.)rX   r,   r=   parse_range)r7   rA   rA   rB   parse_range_with_parens   s   
r[   c              
   C   s   zt | jd  | }W n* ty5 } z| jd tkrd}nt| jd }td| | jd d|d}~ww 	 | jd }|tksHt|t	|k rK	 |S |t
vrQ|S t|  t| |}q7)zParse the next object from the stream of tokens.

    This object parser is for the non-standard boolean expression, which does handle
    the logical `not` operator and grouping terms with parentheses.
    r0   zend of expressionr9   rN   r   rO   N)TOKEN_MAP_WITH_PARENSrF   rQ   r   reprr   rR   rG   rH   rI   rS   r=   rM   )r7   r:   rD   rT   msgrU   rA   rA   rB   r>      s2   	


r>   c                 C   sh   t t| |}tt|}|jd }|tkrtd|jd d|tkr2td|jd |jd d|S )zParse a string as a boolean expression.

    This function handles expressions containing the logical `not` operator and
    parentheses for grouping terms.
    r0   zunmatched ')'r   rO   rN   r9   )r   r
   r   r>   rR   r-   r   r   )rV   rP   r7   rvrU   rA   rA   rB   parse_with_parens  s   
r`   N)r0   )P__doc__typingr   r   liquid.exceptionsr   liquid.expressionr   r   r   r   liquid.expressions.boolean.lexr	   r
   liquid.expressions.commonr   r   r   r   r   r   r   r   r   !liquid.expressions.filtered.parser   parse_simple_objliquid.expressions.streamr   liquid.tokenr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   rI   r?   PRECEDENCE_LOGICALPRECEDENCE_RELATIONALPRECEDENCE_MEMBERSHIPPRECEDENCE_PREFIXrG   r6   str__annotations__	frozensetrS   PREFIX_OPERATORSrC   rL   rM   intrZ   rW   rY   r[   r\   r>   r`   rA   rA   rA   rB   <module>   s   

"

&