a
    ƒ¼DfÚX  ã                   @   sT   d Z ddlmZmZmZ ddlmZmZ ddlmZ dgZ	G dd„ dƒZ
d	d„ Zd
S )z#
Parser for the datashape grammar.
é    )Úabsolute_importÚdivisionÚprint_functioné   )ÚlexerÚerror)Ú	coretypesÚparsec                   @   sÐ   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdd	„ Zd2dd„Z	d3d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"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ ZdS )4ÚDataShapeParserzA DataShape parser object.c                 C   s6   || _ || _t |¡| _g | _d| _d | _|  ¡  d S )Néÿÿÿÿ)Úds_strÚsymr   ÚlexÚtokensÚposÚend_posÚadvance_tok)Úselfr   r   © r   úh/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/datashader/datashape/parser.pyÚ__init__   s    zDataShapeParser.__init__c                 C   s¦   | j | jkr¢| j d | _ z&| j t| jƒkr<| j t| jƒ¡ W nb ty    t| jƒdkrx| j| j d  jd fd }nd}| j t	 
dd|d¡¡ | j | _Y n0 dS )z:Advances self.pos by one, if it is not already at the end.r   r   é   )r   r   N)r   r   Úlenr   ÚappendÚnextr   ÚStopIterationÚspanr   ÚToken)r   r   r   r   r   r   !   s    zDataShapeParser.advance_tokc                 C   s   | j | j S )N)r   r   ©r   r   r   r   Útok4   s    zDataShapeParser.tokc                 C   s   t  | jjd d| j|¡‚d S )Nr   z<nofile>)r   ZDataShapeSyntaxErrorr   r   r   )r   Úerrmsgr   r   r   Úraise_error8   s    ÿzDataShapeParser.raise_errorFc                 C   sz   | j }g }d}|durv|ƒ }|durJ| |¡ | jj|krD|  ¡  qt|S qt|ƒdkrj|r^|S |  |¡ q|| _ dS qdS )z‚
        <item>_list : <item> <SEP> <item>_list
                    | <item>

        Returns a list of <item>s, or None.
        TNr   )r   r   r   Úidr   r   r!   )r   Z
parse_itemZ
sep_tok_idr    Útrailing_sepÚ	saved_posÚitemsÚitemr   r   r   Úparse_homogeneous_list<   s     

z&DataShapeParser.parse_homogeneous_listNc                 C   s:   |  |¡}|dur|S |dur$|| _|  d||f ¡ dS )a‘  
        Looks up a symbol in the provided symbol table dictionary for
        syntactic sugar, raising a standard error message if the symbol
        is missing.

        Parameters
        ----------
        symdict : symbol table dictionary
            One of self.sym.dtype, self.sym.dim,
            self.sym.dtype_constr, or self.sym.dim_constr.
        name : str
            The name of the symbol to look up.
        dshapemsg : str
            The datashape construct this lookup is for, e.g.
            '{...} dtype constructor'.
        error_pos : int, optional
            The position in the token stream at which to flag the error.
        Nz&Symbol table missing "%s" entry for %s)Úgetr   r!   )r   ZsymdictÚnameZ	dshapemsgZ	error_posÚentryr   r   r   Úsyntactic_sugar`   s    
ÿzDataShapeParser.syntactic_sugarc                 C   s|   | j }tjdi}|j|v rp|  ¡  | j}|  ¡ }|durx|  | jj	||j d||j  |d ¡}t
 ||ƒ¡S n|  ¡ S dS )zÈ
        datashape : datashape_nooption
                  | QUESTIONMARK datashape_nooption
                  | EXCLAMATIONMARK datashape_nooption

        Returns a datashape object or None.
        ÚoptionNz%s dtype constructionr   )r   r   ZQUESTIONMARKr"   r   r   Úparse_datashape_nooptionr+   r   Údtype_constrr   Ú	DataShape)r   r   Úconstructorsr$   Údsr,   r   r   r   Úparse_datashape|   s     


ÿüzDataShapeParser.parse_datashapec                 C   s„   | j }|  ¡ }|durf| jjtjkrf|  ¡  | j }|  ¡ }|du rR|| _ |  d¡ t	j
|g|j¢R Ž S |  ¡ }|r|t	 
|¡S dS dS )z
        datashape_nooption : dim ASTERISK datashape
                           | dtype

        Returns a datashape object or None.
        NzExpected a dim or a dtype)r   Ú	parse_dimr   r"   r   ÚASTERISKr   r2   r!   r   r/   Ú
parametersÚparse_dtype)r   r$   ÚdimZdshapeÚdtyper   r   r   r-   •   s    

z(DataShapeParser.parse_datashape_nooptionc           	      C   sÈ  | j }| j}|jtjkr|j}|  ¡  | jjtjkrX|  ¡  |  | j	j
dd|¡}||ƒS | jjtjkr‚|  | j	j
dd|¡}||ƒS || _ dS n4|jtjkrB|j}|  ¡  | jjtjkr| j	j
 |¡}|du rÜ|| _ dS |  ¡  |  ¡ }| jjtjkr|  ¡  tdƒ‚n
|  d¡ n&| j	j |¡}|dur6|S || _ dS n‚|jtjkr’|j}|  ¡  | jjtjkrx|| _ dS |  | j	j
dd	¡}||ƒS |jtjkrÀ|  ¡  |  | j	jdd
|¡}|S dS dS )a“  
        dim : typevar
            | ellipsis_typevar
            | type
            | type_constr
            | INTEGER
            | ELLIPSIS
        typevar : NAME_UPPER
        ellipsis_typevar : NAME_UPPER ELLIPSIS
        type : NAME_LOWER
        type_constr : NAME_LOWER LBRACKET type_arg_list RBRACKET

        Returns a the dim object, or None.
        TODO: Support type constructors
        ZellipsiszTypeVar... dim constructorÚtypevarzTypeVar dim constructorNz0dim type constructors not actually supported yetzExpected a closing "]"Úfixedzinteger dimensionsz... dim)r   r   r"   r   Ú
NAME_UPPERÚvalr   ÚELLIPSISr+   r   Ú
dim_constrr4   Ú
NAME_LOWERÚLBRACKETr(   Úparse_type_arg_listÚRBRACKETÚNotImplementedErrorr!   r7   ÚINTEGER)	r   r$   r   r<   Útconstrr)   r>   Úargsr7   r   r   r   r3   °   sv    þþÿ
ÿþzDataShapeParser.parse_dimc           
      C   sN  | j }| j}|jtjkrB|j}|  ¡  |  | jj	dd|¡}||ƒS |jtj
kr|j}|  ¡  | jjtjkrò| jj	 |¡}|du rŒ|| _ dS |  ¡  |  ¡ \}}| jjtjkræt|ƒdkrÐt|ƒdkrÐ|  d¡ |  ¡  ||i |¤ŽS |  d¡ n&| jj |¡}	|	dur|	S || _ dS n0|jtjkr0|  ¡ S |jtjkrF|  ¡ S dS dS )a¹  
        dtype : typevar
              | type
              | type_constr
              | struct_type
              | funcproto_or_tuple_type
        typevar : NAME_UPPER
        ellipsis_typevar : NAME_UPPER ELLIPSIS
        type : NAME_LOWER
        type_constr : NAME_LOWER LBRACKET type_arg_list RBRACKET
        struct_type : LBRACE ...
        funcproto_or_tuple_type : LPAREN ...

        Returns a the dtype object, or None.
        r9   zTypeVar dtype constructorNr   z/Expected at least one type constructor argumentz!Invalid type constructor argument)r   r   r"   r   r;   r<   r   r+   r   r.   r?   r@   r(   rA   rB   r   r!   r8   ÚLBRACEÚparse_struct_typeÚLPARENÚparse_funcproto_or_tuple_type)
r   r$   r   r<   rE   r)   r.   rF   Úkwargsr8   r   r   r   r6     sH    þ

zDataShapeParser.parse_dtypec                 C   s€   g }d}|durZ|   ¡ }|durZ| jjtjkrB|  ¡  | |¡ qX| |¡ |i fS qqZq|  | jtjd¡}||rzt	|ƒni fS )a!  
        type_arg_list : type_arg COMMA type_arg_list
                      | type_kwarg_list
                      | type_arg
        type_kwarg_list : type_kwarg COMMA type_kwarg_list
                        | type_kwarg

        Returns a tuple (args, kwargs), or (None, None).
        TNzWExpected another keyword argument, positional arguments cannot follow keyword arguments)
Úparse_type_argr   r"   r   ÚCOMMAr   r   r'   Úparse_type_kwargÚdict)r   rF   ÚargrK   r   r   r   rA   @  s    

ÿz#DataShapeParser.parse_type_arg_listc                 C   sÜ   |   ¡ }|dur|S | jjtjtjtjfv r@| jj}|  ¡  |S | jjtj	krÔ|  ¡  |  
¡ }|du rn|  ¡ }|du r~|  ¡ }|du rŽ|  ¡ }| jjtjkr´|  ¡  |du r°g S |S |du rÈ|  d¡ qØ|  d¡ ndS dS )a“  
        type_arg : datashape
                 | INTEGER
                 | STRING
                 | BOOLEAN
                 | list_type_arg
        list_type_arg : LBRACKET RBRACKET
                      | LBRACKET datashape_list RBRACKET
                      | LBRACKET integer_list RBRACKET
                      | LBRACKET string_list RBRACKET

        Returns a type_arg value, or None.
        Nz5Expected a type constructor argument or a closing "]"zExpected a "," or a closing "]")r2   r   r"   r   rD   ÚSTRINGÚBOOLEANr<   r   r@   Úparse_datashape_listÚparse_integer_listÚparse_string_listÚparse_boolean_listrB   r!   )r   r1   r<   r   r   r   rL   b  s.    zDataShapeParser.parse_type_argc                 C   sn   | j jtjkrdS | j}| j j}|  ¡  | j jtjkr@|| _dS |  ¡  |  ¡ }|dur`||fS |  	d¡ dS )zl
        type_kwarg : NAME_LOWER EQUAL type_arg

        Returns a (name, type_arg) tuple, or None.
        Nz$Expected a type constructor argument)
r   r"   r   r?   r   r<   r   ÚEQUALrL   r!   )r   r$   r)   rP   r   r   r   rN   Œ  s    z DataShapeParser.parse_type_kwargc                 C   s   |   | jtjd¡S )z 
        datashape_list : datashape COMMA datashape_list
                       | datashape

        Returns a list of datashape type objects, or None.
        zSExpected another datashape, type constructor parameter lists must have uniform type)r'   r2   r   rM   r   r   r   r   rS   ¢  s    ÿz$DataShapeParser.parse_datashape_listc                 C   s*   | j jtjkr"| j j}|  ¡  |S dS dS )z#
        integer : INTEGER
        N)r   r"   r   rD   r<   r   ©r   r<   r   r   r   Úparse_integer®  s
    zDataShapeParser.parse_integerc                 C   s   |   | jtjd¡S )zˆ
        integer_list : INTEGER COMMA integer_list
                     | INTEGER

        Returns a list of integers, or None.
        zQExpected another integer, type constructor parameter lists must have uniform type)r'   rY   r   rM   r   r   r   r   rT   ¹  s    ÿz"DataShapeParser.parse_integer_listc                 C   s*   | j jtjkr"| j j}|  ¡  |S dS dS )z#
        boolean : BOOLEAN
        N)r   r"   r   rR   r<   r   rX   r   r   r   Úparse_booleanÅ  s
    zDataShapeParser.parse_booleanc                 C   s   |   | jtjd¡S )zˆ
        boolean_list : boolean COMMA boolean_list
                     | boolean

        Returns a list of booleans, or None.
        zQExpected another boolean, type constructor parameter lists must have uniform type)r'   rZ   r   rM   r   r   r   r   rV   Ð  s    ÿz"DataShapeParser.parse_boolean_listc                 C   s*   | j jtjkr"| j j}|  ¡  |S dS dS )z!
        string : STRING
        N)r   r"   r   rQ   r<   r   rX   r   r   r   Úparse_stringÜ  s
    zDataShapeParser.parse_stringc                 C   s   |   | jtjd¡S )z‚
        string_list : STRING COMMA string_list
                    | STRING

        Returns a list of strings, or None.
        zPExpected another string, type constructor parameter lists must have uniform type)r'   r[   r   rM   r   r   r   r   rU   ç  s    ÿz!DataShapeParser.parse_string_listc                 C   s”   | j jtjkrdS | j}|  ¡  | j| jtjdddp8g }| j jtj	krR|  
d¡ |  ¡  dd„ |D ƒ}dd„ |D ƒ}|  | jjdd	|¡}|||ƒS )
z¤
        struct_type : LBRACE struct_field_list RBRACE
                    | LBRACE struct_field_list COMMA RBRACE

        Returns a struct type, or None.
        NzInvalid field in structT©r#   c                 S   s   g | ]}|d  ‘qS )r   r   ©Ú.0Úfr   r   r   Ú
<listcomp>  ó    z5DataShapeParser.parse_struct_type.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS )r   r   r]   r   r   r   r`     ra   Ústructz{...} dtype constructor)r   r"   r   rG   r   r   r'   Úparse_struct_fieldrM   ÚRBRACEr!   r+   r   r.   )r   r$   ÚfieldsÚnamesÚtypesrE   r   r   r   rH   ó  s&    þþ
ÿz!DataShapeParser.parse_struct_typec                 C   sr   | j jtjtjtjtjfvr dS | j j}|  ¡  | j jtj	krH|  
d¡ |  ¡  |  ¡ }|du rj|  
d¡ ||fS )a  
        struct_field : struct_field_name COLON datashape
        struct_field_name : NAME_LOWER
                          | NAME_UPPER
                          | NAME_OTHER
                          | STRING

        Returns a tuple (name, datashape object) or None
        Nz;Expected a ":" separating the field name from its datashapez#Expected the datashape of the field)r   r"   r   r?   r;   Z
NAME_OTHERrQ   r<   r   ÚCOLONr!   r2   )r   r)   r1   r   r   r   rc     s    
ÿ

z"DataShapeParser.parse_struct_fieldc                 C   sÈ   | j jtjkrdS | j}|  ¡  | j| jtjdddp8d}| j jtj	krR|  
d¡ |  ¡  | j jtjkr„|  | jjdd|¡}||ƒS |  ¡  |  ¡ }|du r¦|  
d¡ |  | jjd	d
|¡}|||ƒS dS )a¦  
        funcproto_or_tuple_type : tuple_type RARROW datashape
                                | tuple_type
        tuple_type : LPAREN tuple_item_list RPAREN
                   | LPAREN tuple_item_list COMMA RPAREN
                   | LPAREN RPAREN
        tuple_item_list : datashape COMMA tuple_item_list
                        | datashape

        Returns a tuple type object, a function prototype, or None.
        NzInvalid datashape in tupleTr\   r   Útuplez(...) dtype constructorz,Expected function prototype return datashapeZ	funcprotoz(...) -> ... dtype constructor)r   r"   r   rI   r   r   r'   r2   rM   ÚRPARENr!   ÚRARROWr+   r   r.   )r   r$   ZdshapesrE   Z
ret_dshaper   r   r   rJ   %  s:    üû
ÿ
þz-DataShapeParser.parse_funcproto_or_tuple_type)F)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Úpropertyr   r!   r'   r+   r2   r-   r3   r6   rA   rL   rN   rS   rY   rT   rZ   rV   r[   rU   rH   rc   rJ   r   r   r   r   r
      s4   
 ÿ
$
V:"*r
   c                 C   s>   t | |ƒ}| ¡ }|du r$| d¡ |j|jkr:| d¡ |S )zóParses a single datashape from a string.

    Parameters
    ----------
    ds_str : string
        The datashape string to parse.
    sym : TypeSymbolTable
        The symbol tables of dimensions, dtypes, and type constructors for each.

    NzInvalid datashapezUnexpected token in datashape)r
   r2   r!   r   r   )r   r   Zdspr1   r   r   r   r	   Q  s    


N)ro   Ú
__future__r   r   r   Ú r   r   r   Ú__all__r
   r	   r   r   r   r   Ú<module>   s       F