3
d                 @   s   d dl mZ d dlmZ d dljjZej Z	dd Z
dd Zdd	 Zd
d Zdd Zdd Zdd Zeejddd Zeejddd ZdS )    )	lru_cache)_generated_parserNc             C   s*   | \}}}|j dk}t||jt||S )aj   Handle an expression of the form "a.b" or "a:b".

    Parameters
    ----------
    trees : list of lark.tree.Tree
        The children tree for the "series" rule. It should always
        contain exactly three items.
    notify : bool
        True if the final target should notify, else False.

    Returns
    -------
    expression : ObserverExpression
    notify)data_handle_treeZthen)treesr   leftZ	connectorrightZnotify_left r
   </tmp/pip-build-7vycvbft/traits/traits/observation/parsing.py_handle_series   s    

r   c             C   s   | \}}t ||t ||B S )ab   Handle an expression of the form "a, b".

    Parameters
    ----------
    trees : list of lark.tree.Tree
        The children tree for the "parallel" rule. It should always
        contain exactly two items.
    notify : bool
        True if the final target should notify, else False.

    Returns
    -------
    expression : ObserverExpression
    )r   )r   r   r   r	   r
   r
   r   _handle_parallel(   s    r   c             C   s   | \}|j }tj||dS )aJ   Handle an element for a named trait.

    Parameters
    ----------
    trees : list of lark.tree.Tree
        The children tree for the "trait" rule.
        It contains only one item.
    notify : bool
        True if the final target should notify, else False.

    Returns
    -------
    expression : ObserverExpression
    )r   )valueexpression_moduletrait)r   r   tokennamer
   r
   r   _handle_trait;   s    r   c             C   s   t j|dS )a4   Handle an anytrait element.

    Parameters
    ----------
    trees : list of lark.tree.Tree
        The children tree for the "trait" rule. This should be empty.
    notify : bool
        True if the final target should notify, else False.

    Returns
    -------
    expression : ObserverExpression
    )r   )r   anytrait)r   r   r
   r
   r   _handle_anytraitO   s    r   c             C   s   | \}|j }tj||dS )a[   Handle an element for filtering existing metadata.

    Parameters
    ----------
    trees : list of lark.tree.Tree
        The children tree for the "metadata" rule.
        It contains only one item.
    notify : bool
        True if the final target should notify, else False.

    Returns
    -------
    expression : ObserverExpression
    )r   )r   r   metadata)r   r   r   metadata_namer
   r
   r   _handle_metadata`   s    r   c             C   sL   | rt dj| tjd|ddtj|ddB tj|ddB tj|ddB S )a6   Handle keyword "items".

    Parameters
    ----------
    trees : list of lark.tree.Tree
        The children tree for the "items" rule.
        It should be empty.
    notify : bool
        True if the final target should notify, else False.

    Returns
    -------
    expression : ObserverExpression
    zUnexpected tree: {!r}itemsT)r   optional)
ValueErrorformatr   r   
dict_itemsZ
list_itemsZ	set_items)r   r   r
   r
   r   _handle_itemst   s    r   c          	   C   s(   t t ttttttd}|| j | j|S )a'   Handle a tree using the specified rule.

    Parameters
    ----------
    tree : lark.tree.Tree
        Tree to be converted to an ObserverExpression.
    notify : bool
        True if the final target should notify, else False.

    Returns
    -------
    expression: ObserverExpression
    )ZseriesZseries_terminalparallelZparallel_terminalr   r   r   r   )r   r   r   r   r   r   r   children)treer   handlersr
   r
   r   r      s    r   )maxsizec             C   sP   yt j| }W n4 tjk
rB } ztd| |W Y dd}~X nX t|ddS )a-   Top-level function for parsing user's text to an ObserverExpression.

    Parameters
    ----------
    text : str
        Text to be parsed.

    Returns
    -------
    expression : ObserverExpression

    Raises
    ------
    ValueError
        If the text is not a valid observe expression.
    zInvalid expression: NT)r   )_LARK_PARSERparser   Z	LarkErrorr   r   )textr!   Zparser_exceptionr
   r
   r   r%      s
    "r%   c             C   s   t jt| S )z Compile a mini-language string to a list of ObserverGraph objects.

    Parameters
    ----------
    text : str
        Text to be parsed.

    Returns
    -------
    list of ObserverGraph
    )r   Zcompile_exprr%   )r&   r
   r
   r   compile_str   s    r'   )	functoolsr   Ztraits.observationr   Ztraits.observation.expressionZobservationZ
expressionr   ZLark_StandAloner$   r   r   r   r   r   r   r   Z"_OBSERVER_EXPRESSION_CACHE_MAXSIZEr%   r'   r
   r
   r
   r   <module>   s   