
    wdXX                     b    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e
          Zd	 Zd
S )z#
Parser for the datashape grammar.
    )absolute_importdivisionprint_function   )lexererror)	coretypesparsec                       e Zd ZdZd Zd Zed             Zd Z	 ddZ	dd	Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )DataShapeParserzA DataShape parser object.c                     || _         || _        t          j        |          | _        g | _        d| _        d | _        |                                  d S )N)ds_strsymr   lextokensposend_posadvance_tok)selfr   r   s      0lib/python3.11/site-packages/datashape/parser.py__init__zDataShapeParser.__init__   sP    9V$$     c           	         | j         | j        k    r| j         dz   | _         	 | j         t          | j                  k    r.| j                            t          | j                             dS dS # t          $ r~ t          | j                  dk    r%| j        | j         dz
           j        d         fdz  }nd}| j                            t          j
        dd|d                     | j         | _        Y dS w xY w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    s     r   r   zDataShapeParser.advance_tok!   s
   8t|# 	(x!|DH( 8s4;/// 7K&&tDH~~666667 7  ( ( ( t{##a' " K
38;=a?DD!D""5;tT4#F#FGGG#x(	( 	(s   A	A. .BC65C6c                 &    | j         | j                 S N)r   r   r   s    r   tokzDataShapeParser.tok4   s    {48$$r   c                 Z    t          j        | j        j        d         d| j        |          )Nr   z<nofile>)r   DataShapeSyntaxErrorr%   r    r   )r   errmsgs     r   raise_errorzDataShapeParser.raise_error8   s+    (q)9:)-f> > 	>r   Fc                 $   | j         }g }d}| |            }|<|                    |           | j        j        |k    r|                                  n8|S t          |          dk    r|r|S |                     |           n	|| _         dS |dS 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   
parse_item
sep_tok_idr(   trailing_sep	saved_positemsitems           r   parse_homogeneous_listz&DataShapeParser.parse_homogeneous_list<   s     H	 	 :<<D  T"""8;*, !$$&&&& !Lu::> 
 # 1$
 ((0000(DH4-  	  	  	  	  	 r   Nc                     |                     |          }||S ||| _        |                     d|d|           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 "z" entry for )getr   r)   )r   symdictname	dshapemsg	error_posentrys         r   syntactic_sugarzDataShapeParser.syntactic_sugar`   sm    & D!! 	BL %$04iiA B B B B Br   c                    | j         }t          j        di}|j        |v r|                                  | j        }|                                 }|[|                     | j        j	        ||j                 d||j                 z  |dz
            }t          j         ||                    S dS |                                 S )z
        datashape : datashape_nooption
                  | QUESTIONMARK datashape_nooption
                  | EXCLAMATIONMARK datashape_nooption

        Returns a datashape object or None.
        optionNz%s dtype constructionr   )r%   r   QUESTIONMARKr+   r   r   parse_datashape_nooptionr:   r   dtype_constrr	   	DataShape)r   r%   constructorsr/   dsr<   s         r   parse_datashapezDataShapeParser.parse_datashape|   s     h*H56\! 	3I..00B 7--dh.C.:36.B.E.:36.B/C.7!m	= =
 !*66"::6667 7 00222r   c                    | j         }|                                 }|~| j        j        t          j        k    rd|                                  | j         }|                                 }||| _         |                     d           t          j
        |g|j        R  S |                                 }|rt          j
        |          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   rC   r)   r	   r@   
parametersparse_dtype)r   r/   dimdshapedtypes        r   r>   z(DataShapeParser.parse_datashape_nooption   s     H	nn 		Dx{en, D  """ H	--// B(DH$$%@AAA *3C1BCCCC  "" 	&u---4r   c                    | j         }| j        }|j        t          j        k    r|j        }|                                  | j        j        t          j        k    rA|                                  |                     | j	        j
        dd|          } ||          S | j        j        t          j        k    r-|                     | j	        j
        dd|          } ||          S || _         dS |j        t          j        k    r|j        }|                                  | j        j        t          j        k    r| j	        j
                            |          }|	|| _         dS |                                  |                                 }| j        j        t          j        k    r#|                                  t#          d          |                     d           dS | j	        j                            |          }||S || _         dS |j        t          j        k    rj|j        }|                                  | j        j        t          j        k    r	|| _         dS |                     | j	        j
        dd	          } ||          S |j        t          j        k    r8|                                  |                     | j	        j        d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
        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_constrrF   
NAME_LOWERLBRACKETr4   parse_type_arg_listRBRACKETNotImplementedErrorr)   rI   INTEGER)	r   r/   r%   rQ   tconstrr6   rS   argsrI   s	            r   rE   zDataShapeParser.parse_dim   s     H	h6U%% B	'Cx{en,   """..tx/BJ/K/8: : ws||#.  ..tx/BI/H/8: : ws||#$tVu'' +	7Dx{en,  !X044T::
  (DH4  """//118;%.0 ?$$&&&-JL L L $$%=>>>>>hl&&t,,  J(DH4Vu}$ 	'C x{en, $t**48+>+?A AG73<<Vu~% 	&&tx|Z+4+46 6C J4r   c                 (   | j         }| j        }|j        t          j        k    rH|j        }|                                  |                     | j        j	        dd|          } ||          S |j        t          j
        k    r>|j        }|                                  | j        j        t          j        k    r| j        j	                            |          }|	|| _         dS |                                  |                                 \  }}| j        j        t          j        k    rWt          |          dk    r(t          |          dk    r|                     d           |                                   ||i |S |                     d           dS | j        j                            |          }	|	|	S || _         dS |j        t          j        k    r|                                 S |j        t          j        k    r|                                 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.
        rN   zTypeVar dtype constructorNr   z/Expected at least one type constructor argumentz!Invalid type constructor argument)r   r%   r+   r   rP   rQ   r   r:   r   r?   rT   rU   r4   rV   rW   r   r)   rK   LBRACEparse_struct_typeLPARENparse_funcproto_or_tuple_type)
r   r/   r%   rQ   rZ   r6   r?   r[   kwargsrK   s
             r   rH   zDataShapeParser.parse_dtype  s     H	h6U%% &	'C**48+@)+F+46 6G 73<<Vu'' 	7Dx{en,  #x488>>  (DH4  """#7799f8;%.0 J4yyA~ A#f++*: A(( *@ A A A$$&&&'<8888$$%HIIIII**400   L(DH4Vu|# 	))+++Vu|# 	557774r   c                 p   g }d}|v|                                  }|]| j        j        t          j        k    r*|                                  |                    |           n|                    |           |i fS n|v|                     | j        t          j        d          }||rt          |          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   r2   parse_type_kwargdict)r   r[   argra   s       r   rV   z#DataShapeParser.parse_type_arg_list@  s      	%%''C 8;%+- &$$&&&KK$$$$ KK$$$ ":%  	 ,,T-BEK,?@ @ f4d6lll"55r   c                    |                                  }||S | j        j        t          j        t          j        t          j        fv r"| j        j        }|                                  |S | j        j        t          j	        k    r|                                  | 
                                }||                                 }||                                 }||                                 }| j        j        t          j        k    r|                                  |g n|S ||                     d           dS |                     d           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 "]")rC   r%   r+   r   rY   STRINGBOOLEANrQ   r   rU   parse_datashape_listparse_integer_listparse_string_listparse_boolean_listrW   r)   )r   rB   rQ   s      r   rc   zDataShapeParser.parse_type_argb  sh    !!## 	I8;5=%,FF 	(,CJX[EN* 	++--C 0--// /,,.. 0--//x{en, H  """ 1rrc1 H$$ &8 9 9 9 9 9 $$%FGGGGG4r   c                 X   | j         j        t          j        k    rdS | j        }| j         j        }|                                  | j         j        t          j        k    r	|| _        dS |                                  |                                 }|||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   rT   r   rQ   r   EQUALrc   r)   )r   r/   r6   rg   s       r   re   z DataShapeParser.parse_type_kwarg  s     8;%** 	4H	x|8;%+% 	 DH4!!## 	E#; CDDDDDr   c                 N    |                      | 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)r2   rC   r   rd   r$   s    r   rk   z$DataShapeParser.parse_datashape_list  s.     **4+?,JK K 	Kr   c                 ~    | j         j        t          j        k    r"| j         j        }|                                  |S dS )z#
        integer : INTEGER
        N)r%   r+   r   rY   rQ   r   r   rQ   s     r   parse_integerzDataShapeParser.parse_integer  <     8;%-' 	(,CJ4r   c                 N    |                      | 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)r2   rt   r   rd   r$   s    r   rl   z"DataShapeParser.parse_integer_list  .     **4+=u{,JK K 	Kr   c                 ~    | j         j        t          j        k    r"| j         j        }|                                  |S dS )z#
        boolean : BOOLEAN
        N)r%   r+   r   rj   rQ   r   rs   s     r   parse_booleanzDataShapeParser.parse_boolean  ru   r   c                 N    |                      | 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)r2   ry   r   rd   r$   s    r   rn   z"DataShapeParser.parse_boolean_list  rw   r   c                 ~    | j         j        t          j        k    r"| j         j        }|                                  |S dS )z!
        string : STRING
        N)r%   r+   r   ri   rQ   r   rs   s     r   parse_stringzDataShapeParser.parse_string  s<     8;%,& 	(,CJ4r   c                 N    |                      | 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)r2   r|   r   rd   r$   s    r   rm   z!DataShapeParser.parse_string_list  s.     **4+<ek,JK K 	Kr   c                    | j         j        t          j        k    rdS | j        }|                                  |                     | j        t          j        dd          pg }| j         j        t          j	        k    r| 
                    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                     g | ]
}|d          S )r    .0fs     r   
<listcomp>z5DataShapeParser.parse_struct_type.<locals>.<listcomp>      &&&!1&&&r   c                     g | ]
}|d          S )r   r   r   s     r   r   z5DataShapeParser.parse_struct_type.<locals>.<listcomp>  r   r   structz{...} dtype constructor)r%   r+   r   r]   r   r   r2   parse_struct_fieldrd   RBRACEr)   r:   r   r?   )r   r/   fieldsnamestypesrZ   s         r   r^   z!DataShapeParser.parse_struct_type  s    8;%,& 	4H	,,T-Dek-F:> - @ @ FCE 	 8;%,& 	86777 '&v&&&&&v&&&&&tx'<h'@)M Mwue$$$r   c                    | j         j        t          j        t          j        t          j        t          j        fvrdS | j         j        }|                                  | j         j        t          j	        k    r| 
                    d           |                                  |                                 }|| 
                    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   rT   rP   
NAME_OTHERri   rQ   r   COLONr)   rC   )r   r6   rB   s      r   r   z"DataShapeParser.parse_struct_field  s     8;u/1A$/? ? 	4x|8;%+% 	8 7 8 8 8!!## 	DBCCCbzr   c                    | j         j        t          j        k    rdS | j        }|                                  |                     | j        t          j        dd          pd}| j         j        t          j	        k    r| 
                    d           |                                  | j         j        t          j        k    r-|                     | j        j        dd|          } ||          S |                                  |                                 }|| 
                    d           |                     | j        j        d	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 datashape	funcprotoz(...) -> ... dtype constructor)r%   r+   r   r_   r   r   r2   rC   rd   RPARENr)   RARROWr:   r   r?   )r   r/   dshapesrZ   
ret_dshapes        r   r`   z-DataShapeParser.parse_funcproto_or_tuple_type%  su    8;%,& 	4H	-- K(	 . 
 
 
  	 8;%,& 	;9:::8;%,& 	0**48+@'+DiQ QG77### --//J .   "- . . . **48+@++K+46 6G 77J///r   )Fr#   )__name__
__module____qualname____doc__r   r   propertyr%   r)   r2   r:   rC   r>   rE   rH   rV   rc   re   rk   rt   rl   ry   rn   r|   rm   r^   r   r`   r   r   r   r   r      s       $$   ( ( (& % % X%> > >
 -2"  "  "  " HB B B B83 3 32  6T T Tl8 8 8t 6  6  6D( ( (TE E E,
K 
K 
K	 	 	
K 
K 
K	 	 	
K 
K 
K	 	 	
K 
K 
K% % %4  0)0 )0 )0 )0 )0r   r   c                     t          | |          }|                                }||                    d           |j        |j        k    r|                    d           |S )zParses 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   rC   r)   r   r   )r   r   dsprB   s       r   r
   r
   Q  sj     &#
&
&C					B	 -+,,, w#+ 97888Ir   N)r   
__future__r   r   r    r   r   r	   __all__objectr   r
   r   r   r   <module>r      s     A @ @ @ @ @ @ @ @ @              )0 0 0 0 0f 0 0 0D    r   