U
    Zf                     @   s   d dl Z d dlZd dlmZmZ dZer0d dl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dddZdS )    N)lexyaccFc                   @   s   e Zd ZdZed7 Zed7 Zed7 ZdZdZdZdZd	Zd
ddZ	d#ddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"S )$FilterExprLexer)ZIDLPARRPAR)ANDOR)ZNEQZEQ)ZBOOLEANFLOATZINTEGERZNULLSTRINGz\(z\)!== r   r   )andorFc                 C   s   t j | |d| _g | _d S )N)moduledebug)r   lexererrorsselfr    r   5/tmp/pip-unpacked-wheel-vqb3mfeu/stone/cli_helpers.py__init__4   s    zFilterExprLexer.__init__c                 C   s   | j S N)r   r   r   r   r   get_yacc_compat_lexer8   s    z%FilterExprLexer.get_yacc_compat_lexerc                 C   s   |j dk|_ |S )z\btrue\b|\bfalse\btruevaluer   tokenr   r   r   	t_BOOLEAN;   s    zFilterExprLexer.t_BOOLEANc                 C   s
   d|_ |S )z\bnull\bNr   r   r   r   r   t_NULL@   s    zFilterExprLexer.t_NULLc                 C   s   t |j|_|S )z-?\d+(\.\d*(e-?\d+)?|e-?\d+))floatr   r   r   r   r   t_FLOATE   s    zFilterExprLexer.t_FLOATc                 C   s   t |j|_|S )z-?\d+)intr   r   r   r   r   	t_INTEGERJ   s    zFilterExprLexer.t_INTEGERc                 C   s   |j dd |_ |S )z\"([^\\"]|(\\.))*\"   r   r   r   r   r   t_STRINGO   s    zFilterExprLexer.t_STRINGc                 C   s&   |j | jkr| j|j  |_|S |S dS )z[a-zA-Z_][a-zA-Z0-9_-]*N)r   KEYWORDStyper   r   r   r   t_IDT   s    zFilterExprLexer.t_IDc                 C   s0   | j dt|jd d  |jd d S )NzIllegal character %s.r   ur'   )r   appendreprr   lstripr   skipr   r   r   r   t_error]   s    zFilterExprLexer.t_errorc                 C   s*   | j | | j  }|sq&t| qd S r   )r   inputr    print)r   datatokr   r   r   testc   s
    
zFilterExprLexer.testN)F)__name__
__module____qualname__tokensZt_LPARZt_RPARZt_NEQZt_EQZt_ignorer*   r   r   r!   r"   r$   r&   r)   r,   r2   r7   r   r   r   r   r      s,   
	r   c                   @   sh   e Zd ZejZedZdZdddZdd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd Zdd ZdS )FilterExprParserexpr))leftr   )r>   r   Fc                 C   s,   || _ tj| ||d| _t|| _g | _d S )N)r   r   Zwrite_tables)r   r   r   r   r   r   r   r   r   r   {   s    
zFilterExprParser.__init__c                 C   s4   | j j|| j | jd}| jj| j | _|| jfS )zF
        Args:
            data (str): Raw filter expression.
        )r   r   )r   parser   r   r   r   )r   r5   Zparsed_datar   r   r   r?      s      zFilterExprParser.parsec                 C   s   |d |d< dS )zexpr : predr'   r   Nr   r   pr   r   r   p_expr   s    zFilterExprParser.p_exprc                 C   s   |d |d< dS )zexpr : LPAR expr RPAR   r   Nr   r@   r   r   r   p_expr_parens   s    zFilterExprParser.p_expr_parensc                 C   s    t |d |d |d |d< dS )z3expr : expr OR expr
                | expr AND exprrC   r'      r   N)FilterExprConjunctionr@   r   r   r   p_expr_group   s    zFilterExprParser.p_expr_groupc                 C   s    t |d |d |d |d< dS )zpred : ID op primitiverC   r'   rE   r   N)FilterExprPredicater@   r   r   r   p_pred   s    zFilterExprParser.p_predc                 C   s   |d |d< dS )zop : NEQ
              | EQr'   r   Nr   r@   r   r   r   p_op   s    zFilterExprParser.p_opc                 C   s   |d |d< dS )zprimitive : BOOLEAN
                     | FLOAT
                     | INTEGER
                     | NULL
                     | STRINGr'   r   Nr   r@   r   r   r   p_primitive   s    zFilterExprParser.p_primitivec                 C   s8   |r(| j d|jt|jdf  n| j d d S )NzUnexpected %s with value %s.r-   zUnexpected end of expression.)r   r.   r+   r/   r   r0   r   r   r   r   p_error   s    zFilterExprParser.p_errorN)F)r8   r9   r:   r   r;   strstart
precedencer   r?   rB   rD   rG   rI   rJ   rK   rL   r   r   r   r   r<   l   s   

r<   c                   @   s    e Zd ZejZejdd ZdS )
FilterExprc                 C   s   d S r   r   r   router   r   r   eval   s    zFilterExpr.evalN)r8   r9   r:   abcABCMeta__metaclass__abstractmethodrS   r   r   r   r   rP      s   rP   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )rF   c                 C   s   || _ || _|| _d S r   conjlhsrhs)r   rY   rZ   r[   r   r   r   r      s    zFilterExprConjunction.__init__c                 C   sP   | j dkr"| j|o | j|S | j dkrD| j|pB| j|S dsLtd S )Nr   r   F)rY   rZ   rS   r[   AssertionErrorrQ   r   r   r   rS      s
    

zFilterExprConjunction.evalc                 C   s   d| j | j| jf S )NzEvalConj(%r, %r, %r)rX   r   r   r   r   __repr__   s    zFilterExprConjunction.__repr__Nr8   r9   r:   r   rS   r]   r   r   r   r   rF      s   rF   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )rH   c                 C   s   || _ || _|| _d S r   oprZ   r[   )r   r`   rZ   r[   r   r   r   r      s    zFilterExprPredicate.__init__c                 C   sD   |j | jd }| jdkr$|| jkS | jdkr8|| jkS ds@td S )Nr   r   F)attrsgetrZ   r`   r[   r\   )r   rR   valr   r   r   rS      s    



zFilterExprPredicate.evalc                 C   s   d| j | j| jf S )NzEvalPred(%r, %r, %r)r_   r   r   r   r   r]      s    zFilterExprPredicate.__repr__Nr^   r   r   r   r   rH      s   	rH   c                 C   s*   t | tjstt| t|}|| S )z
    Args:
        route_attr_filter (str): The raw command-line input of the route
            filter.

    Returns:
        Tuple[FilterExpr, List[str]]: The second element is a list of errors.
    )
isinstancesix	text_typer\   r+   r<   r?   )Zroute_attr_filterr   parserr   r   r   parse_route_attr_filter   s    	rh   )F)rT   re   Zplyr   r   Z_MYPYtypingobjectr   r<   rP   rF   rH   rh   r   r   r   r   <module>   s   aF	