B
    Afxa"               	   @   s   d Z ddlZddlZddlmZ dddddddddZdd	 Zeejejej	ej
ejd
Zdd dd dZG dd dZedddfddZdS )z
    pint.pint_eval
    ~~~~~~~~~~~~~~

    An expression evaluator to be used as a safe replacement for builtin eval.

    :copyright: 2016 by Pint Authors, see AUTHORS for more details.
    :license: BSD, see LICENSE for more details.
    N   )DefinitionSyntaxError      )z**^unary* /+-c             C   sV   ddl m} ddlm} t| |rJ|| jrJ| jjdkrJ|dk rJ| t	} t
| |S )Nr   )is_duck_array)QuantityZcfr   )compatr   Zquantityr   
isinstanceZ	magnitudeZdtypekindZastypefloatoperatorpow)leftrightr   r    r   -lib/python3.7/site-packages/pint/pint_eval.py_power   s    


r   )z**r   r	   r
   r   r   c             C   s   | S )Nr   )xr   r   r   <lambda>5       r   c             C   s   | d S )Nr   )r   r   r   r   r   5   r   )r   r   c               @   s,   e Zd ZdZd	ddZdd Zd
ddZdS )EvalTreeNodezSingle node within an evaluation tree

    left + operator + right --> binary op
    left + operator --> unary op
    left + right --> implicit op
    left --> single value
    Nc             C   s   || _ || _|| _d S )N)r   r   r   )selfr   r   r   r   r   r   __init__A   s    zEvalTreeNode.__init__c             C   sn   | j r:| j g}| jr(|| jd  || j   n&| jrV| jd | j g}n
| jd S dd| S )Nr   z(%s) )r   r   	to_stringr   appendjoin)r   compsr   r   r   r"   F   s    
zEvalTreeNode.to_stringc             C   s   |pt }|pt}| jrh| jr&| jd nd}||kr>td| | j|||}|| || j|||S | jr| jd }||krtd| || | j|||S || jS dS )a_  Evaluate node.

        Parameters
        ----------
        define_op : callable
            Translates tokens into objects.
        bin_op : dict or None, optional
             (Default value = _BINARY_OPERATOR_MAP)
        un_op : dict or None, optional
             (Default value = _UNARY_OPERATOR_MAP)

        Returns
        -------

        r   r	   zmissing binary operator "%s"zmissing unary operator "%s"N)_BINARY_OPERATOR_MAP_UNARY_OPERATOR_MAPr   r   r   r   evaluate)r   Z	define_opZbin_opZun_opZop_textr   r   r   r   r(   S   s    
zEvalTreeNode.evaluate)NN)NN)__name__
__module____qualname____doc__r    r"   r(   r   r   r   r   r   8   s   
r   c       
      C   s>  |dkr|dkrt | } d}x| | }|d }|d }|tjkrb|dkr|dkrbtd| n|dkrr||fS ||d fS n|dkrt| ||d d|\}	}| | d dkstd|rt||	d}n|	}n||kr|r8|| ||d	kr|d
kr||d fS t| ||d |d |\}	}t|||	d}n(t| ||d |d d\}	}t|	|d}np|tjksz|tjkr|r|d ||d	kr||d fS t| |||d d\}	}t||	d}n
t|d}| | d tj	kr|dkrtd|dks|r||fS |S |d t
| kr.td|d7 }q W dS )a6  Build an evaluation tree from a set of tokens.

    Params:
    Index, depth, and prev_op used recursively, so don't touch.
    Tokens is an iterable of tokens from an expression to be evaluated.

    Transform the tokens from an expression into a recursive parse tree, following order
    of operations. Operations can include binary ops (3 + 4), implicit ops (3 kg), or
    unary ops (-1).

    General Strategy:
    1) Get left side of operator
    2) If no tokens left, return final result
    3) Get operator
    4) Use recursion to create tree starting at token on right side of operator (start at step #1)
    4.1) If recursive call encounters an operator with lower or equal priority to step #2, exit recursion
    5) Combine left side, operator, and right side into a new left side
    6) Go back to step #2

    r   Nr   )z"unopened parentheses in tokens: %s(zweird exit from parentheses)r   r   r   )z**r   )r   r   r   r   )r   r   r	   )r   zunclosed parentheses in tokenszunexpected end to tokens)listtokenlibOPr   build_eval_treer   getNUMBERNAME	ENDMARKERlen)
tokensZop_priorityindexdepthZprev_opresultcurrent_token
token_typeZ
token_textr   r   r   r   r2   y   sj    




r2   )r,   r   tokenr0   errorsr   Z_OP_PRIORITYr   multruedivaddsubr&   r'   r   r2   r   r   r   r   <module>	   s*   
A