
    IR-eJ                         d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlmZ ddlmZ  G d	 d
e          Z edd
           G d de                      ZdS )z-
Handles a "generic" string format for units
    NFraction)classproperty
deprecatedparsing)did_you_mean   )core)Basec                      e Zd ZdZdZ ed          d             Z ed          d             Z ed          d             Z ed          d             Z	 ed          d	             Z
 ed          d
             Zed             Zed             Zed             Zed/d            ZddddddZddddZddddddddZe                    dd d!          Z	 d"Ze                    ed#          Z ej        d$e d%ed&d'          d(          Z ej        d)          Zed*             Zed+             Zed0d-            Zed0d.            Z d'S )1Genericz
    A "generic" format.

    The syntax of the format is based directly on the FITS standard,
    but instead of only supporting the units that FITS knows about, it
    supports any unit available in the `astropy.units` namespace.
    )COMMADOUBLE_STARSTARPERIODSOLIDUSCARET
OPEN_PARENCLOSE_PARENFUNCNAMEUNITSIGNUINTUFLOATT)lazyc                 *    |                                  S N)_generate_unit_namesclss    <lib/python3.11/site-packages/astropy/units/format/generic.py
_all_unitszGeneric._all_units6   s    '')))    c                     | j         d         S )Nr   r"   r   s    r!   _unitszGeneric._units:       ~a  r#   c                     | j         d         S Nr	   r%   r   s    r!   _deprecated_unitszGeneric._deprecated_units>   r'   r#   c                     | j         d         S )N   r%   r   s    r!   
_functionszGeneric._functionsB   r'   r#   c                 *    |                                  S r   )_make_parserr   s    r!   _parserzGeneric._parserF   s    !!!r#   c                 *    |                                  S r   )_make_lexerr   s    r!   _lexerzGeneric._lexerJ   s       r#   c                       j         }d}d}d}d}d}d}d}d}	d	 }
d
 }d }d } fd}d}d }t          j        ddt          t          j                            S )Nz\,z\*z\./z\*\*z\^z\(z\)c                 4   t          j        d| j                  s!d| _        t	          | j                  | _        n\| j                            d          r)d| _        t	          | j        dd                   | _        nt          | j                  | _        | S )z$((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?z[eE\.]r   .N)researchvaluetypeintendswithfloatts    r!   t_UFLOATz%Generic._make_lexer.<locals>.t_UFLOAT]   s~    9Y00 )ag,,!!#&& )agcrcl++..Hr#   c                 8    t          | j                  | _        | S )z\d+r=   r;   r@   s    r!   t_UINTz#Generic._make_lexer.<locals>.t_UINTi   s    !'llAGHr#   c                 >    t          | j        dz             | _        | S )z
[+-](?=\d)1rD   r@   s    r!   t_SIGNz#Generic._make_lexer.<locals>.t_SIGNn   s    !'C-((AGHr#   c                     | S )z3((sqrt)|(ln)|(exp)|(log)|(mag)|(dB)|(dex))(?=\ *\() r@   s    r!   
t_FUNCNAMEz'Generic._make_lexer.<locals>.t_FUNCNAMEu   s    Hr#   c                 <                         |           | _        | S )u5   %|([YZEPTGMkhdcmuµnpfazy]?'((?!\d)\w)+')|((?!\d)\w)+)	_get_unitr;   )rA   r    s    r!   t_UNITz#Generic._make_lexer.<locals>.t_UNITy   s    mmA&&AGHr#    c                 0    t          d| j                   )NzInvalid character at col )
ValueErrorlexposr@   s    r!   t_errorz$Generic._make_lexer.<locals>.t_error   s    CCCDDDr#   generic_lextabastropy/units)lextabpackagereflags)_tokensr   lexr=   r9   UNICODE)r    tokenst_COMMAt_STARt_PERIOD	t_SOLIDUSt_DOUBLE_STARt_CARETt_OPEN_PARENt_CLOSE_PARENrB   rE   rH   rK   rN   t_ignorerS   s   `                r!   r2   zGeneric._make_lexerN   s    	
	 
	 
		 	 	
	 	 		 	 		 	 	 	 	
 	E 	E 	E {#_c"*oo
 
 
 	
r#   c                       j         }d }d }d }d }d }d }d }d }	 fd	}
 fd
} fd}d }d }d }d }d }d }d }d }d }d }d }d }d } fd}d }t          j        dd          S )a  
        The grammar here is based on the description in the `FITS
        standard
        <http://fits.gsfc.nasa.gov/standard30/fits_standard30aa.pdf>`_,
        Section 4.3, which is not terribly precise.  The exact grammar
        is here is based on the YACC grammar in the `unity library
        <https://bitbucket.org/nxg/unity/>`_.

        This same grammar is used by the `"fits"` and `"vounit"`
        formats, the only difference being the set of available unit
        strings.
        c                 x    t          | d         t                    r| d         d         | d<   dS | d         | d<   dS )zn
            main : unit
                 | structured_unit
                 | structured_subunit
            r	   r   N)
isinstancetupleps    r!   p_mainz$Generic._make_parser.<locals>.p_main   sB     !A$&&  tAw!t!r#   c                     | d         f| d<   dS )zU
            structured_subunit : OPEN_PAREN structured_unit CLOSE_PAREN
            r,   r   NrJ   rj   s    r!   p_structured_subunitz2Generic._make_parser.<locals>.p_structured_subunit   s     aD7AaDDDr#   c                 &   ddl m} t          |           dk    r	| d         fn| d         | d         f}d}|D ]K}t          |t                    r||z  }t          ||          r||                                z  }E||fz  }L ||          | d<   dS )zm
            structured_unit : subunit COMMA
                            | subunit COMMA subunit
            r   )StructuredUnit   r	   rJ   N)astropy.units.structuredrp   lenrh   ri   values)rk   rp   inputsunitssubunits        r!   p_structured_unitz/Generic._make_parser.<locals>.p_structured_unit   s    
 @????? #A!adWW!A$!FE! ( (gu-- 
( W$EE88 ( W^^---EE gZ'EE!>%((AaDDDr#   c                     | d         | d<   dS )zw
            subunit : unit
                    | structured_unit
                    | structured_subunit
            r	   r   NrJ   rj   s    r!   	p_subunitz'Generic._make_parser.<locals>.p_subunit        Q4AaDDDr#   c                 ,   ddl m} t          |           dk    r || d                   | d<   dS t          |           dk    r || d         | d         z            | d<   dS t          |           dk    r || d         | d         z            | d<   dS dS )a  
            unit : product_of_units
                 | factor product_of_units
                 | factor product product_of_units
                 | division_product_of_units
                 | factor division_product_of_units
                 | factor product division_product_of_units
                 | inverse_unit
                 | factor inverse_unit
                 | factor product inverse_unit
                 | factor
            r   Unitr,   r	   rq      Nastropy.units.corer~   rs   rk   r~   s     r!   p_unitz$Generic._make_parser.<locals>.p_unit   s     0/////1vv{{tAaDzz!Q1tAaD1Q4K((!Q1tAaD1Q4K((! r#   c                     ddl m} t          |           dk    r || d         | d         z            | d<   dS | d         | d<   dS )z
            division_product_of_units : division_product_of_units division product_of_units
                                      | product_of_units
            r   r}   r   r	   rq   Nr   r   s     r!   p_division_product_of_unitsz9Generic._make_parser.<locals>.p_division_product_of_units   sY    
 0/////1vv{{tAaD1Q4K((!t!r#   c                 "    | d         dz  | d<   dS )zA
            inverse_unit : division unit_expression
            r,   r8   r   NrJ   rj   s    r!   p_inverse_unitz,Generic._make_parser.<locals>.p_inverse_unit   s     Q42:AaDDDr#   c                     | d         | d<   dS )zp
            factor : factor_fits
                   | factor_float
                   | factor_int
            r	   r   NrJ   rj   s    r!   p_factorz&Generic._make_parser.<locals>.p_factor   r{   r#   c                 x   j         dk    rt          d          t          |           dk    r,| d         | d         t          | d                   z  z  | d<   d	S t          |           dk    r,| d         | d         t          | d                   z  z  | d<   d	S t          |           dk    r| d         | d<   d	S d	S )
z
            factor_float : signed_float
                         | signed_float UINT signed_int
                         | signed_float UINT power numeric_power
            fits$Numeric factor not supported by FITSr   r	   r,   rq   r      N)namerQ   rs   r?   rk   r    s    r!   p_factor_floatz,Generic._make_parser.<locals>.p_factor_float   s     x6!! !GHHH1vv{{tadeAaDkk11!Q1tadeAaDkk11!Q1t! r#   c                 F   j         dk    rt          d          t          |           dk    r| d         | d<   d	S t          |           dk    r#| d         t          | d                   z  | d<   d	S t          |           dk    rjt	          | d         t
                    r,| d         | d         t          | d                   z  z  | d<   d	S | d         t          | d                   z  | d<   d	S t          |           dk    r| d         | d         | d         z  z  | d<   d	S d	S )
z
            factor_int : UINT
                       | UINT signed_int
                       | UINT power numeric_power
                       | UINT UINT signed_int
                       | UINT UINT power numeric_power
            r   r   r,   r	   r   rq   r   r   N)r   rQ   rs   r?   rh   r=   r   s    r!   p_factor_intz*Generic._make_parser.<locals>.p_factor_int  s    x6!! !GHHH1vv{{t!Q1tuQqT{{*!Q1adC(( /Q4!A$%!++"55AaDDDQ451;;.AaDDDQ1tadadl*! r#   c                 p   | d         dk    rj         dk    rt          d          dS t          |           dk    r3| d         dv rd| d	         z  | d
<   dS d| d         | d	         z  z  | d
<   dS t          |           dk    rd| d	         z  | d
<   dS t          |           dk    rd| d         z  | d
<   dS dS )aY  
            factor_fits : UINT power OPEN_PAREN signed_int CLOSE_PAREN
                        | UINT power OPEN_PAREN UINT CLOSE_PAREN
                        | UINT power signed_int
                        | UINT power UINT
                        | UINT SIGN UINT
                        | UINT OPEN_PAREN signed_int CLOSE_PAREN
            r	   
   r   zBase must be 10Nr   r,   )z**^rq   r   r      )r   rQ   rs   r   s    r!   p_factor_fitsz+Generic._make_parser.<locals>.p_factor_fits#  s     trzz8v%%$%6777F1vv{{Q4;&&1:AaDDD!A$1+.AaDDDQ1QqTz!Q1QqTz! r#   c                     t          |           dk    r| d         | d<   dS t          |           dk    r| d         | d         z  | d<   dS | d         | d         z  | d<   dS )z
            product_of_units : unit_expression product product_of_units
                             | unit_expression product_of_units
                             | unit_expression
            r,   r	   r   rq   Nrs   rj   s    r!   p_product_of_unitsz0Generic._make_parser.<locals>.p_product_of_units;  se     1vv{{t!Q1tad{!tad{!r#   c                 \    t          |           dk    r| d         | d<   dS | d         | d<   dS )z
            unit_expression : function
                            | unit_with_power
                            | OPEN_PAREN product_of_units CLOSE_PAREN
            r,   r	   r   Nr   rj   s    r!   p_unit_expressionz/Generic._make_parser.<locals>.p_unit_expressionH  s5     1vv{{t!t!r#   c                     t          |           dk    r| d         | d<   dS t          |           dk    r| d         | d         z  | d<   dS | d         | d         z  | d<   dS )z
            unit_with_power : UNIT power numeric_power
                            | UNIT numeric_power
                            | UNIT
            r,   r	   r   rq   Nr   rj   s    r!   p_unit_with_powerz/Generic._make_parser.<locals>.p_unit_with_powerS  se     1vv{{t!Q1tqt|!tqt|!r#   c                     t          |           dk    r| d         | d         z  | d<   dS t          |           dk    r| d         | d<   dS dS )zq
            numeric_power : sign UINT
                          | OPEN_PAREN paren_expr CLOSE_PAREN
            rq   r	   r,   r   r   Nr   rj   s    r!   p_numeric_powerz-Generic._make_parser.<locals>.p_numeric_power`  sS    
 1vv{{tad{!Q1t! r#   c                 n    t          |           dk    r| d         | d         z  | d<   dS | d         | d<   dS )zt
            paren_expr : sign UINT
                       | signed_float
                       | frac
            rq   r	   r,   r   Nr   rj   s    r!   p_paren_exprz*Generic._make_parser.<locals>.p_paren_exprj  s=     1vv{{tad{!t!r#   c                 h    t          | d         | d         z  | d         | d         z            | d<   dS )z=
            frac : sign UINT division sign UINT
            r	   r,   r   r   r   Nr   rj   s    r!   p_fracz$Generic._make_parser.<locals>.p_fracu  s3     AaD1Q4K1!55AaDDDr#   c                 P    t          |           dk    r| d         | d<   dS d| d<   dS )z8
            sign : SIGN
                 |
            r,   r	   r   Nr   rj   s    r!   p_signz$Generic._make_parser.<locals>.p_sign{  s1    
 1vv{{t!!r#   c                     dS )zE
            product : STAR
                    | PERIOD
            NrJ   rj   s    r!   	p_productz'Generic._make_parser.<locals>.p_product  s	    
 Dr#   c                     dS )z,
            division : SOLIDUS
            NrJ   rj   s    r!   
p_divisionz(Generic._make_parser.<locals>.p_division  s	     Dr#   c                     | d         | d<   dS )zG
            power : DOUBLE_STAR
                  | CARET
            r	   r   NrJ   rj   s    r!   p_powerz%Generic._make_parser.<locals>.p_power  s    
 Q4AaDDDr#   c                 .    | d         | d         z  | d<   dS )z0
            signed_int : SIGN UINT
            r	   r,   r   NrJ   rj   s    r!   p_signed_intz*Generic._make_parser.<locals>.p_signed_int  s     Q4!A$;AaDDDr#   c                 .    | d         | d         z  | d<   dS )zY
            signed_float : sign UINT
                         | sign UFLOAT
            r	   r,   r   NrJ   rj   s    r!   p_signed_floatz,Generic._make_parser.<locals>.p_signed_float  s    
 Q4!A$;AaDDDr#   c                     | d         | d<   dS )z2
            function_name : FUNCNAME
            r	   r   NrJ   rj   s    r!   p_function_namez-Generic._make_parser.<locals>.p_function_name  s     Q4AaDDDr#   c                    | d         dk    r| d         dz  | d<   dS | d         dv r@                     | d                   }t          |          r || d                   | d<   dS t          d| d          d	          )
zN
            function : function_name OPEN_PAREN main CLOSE_PAREN
            r	   sqrtrq   g      ?r   N)magdBdex'z' is not a recognized function)_parse_unitcallablerQ   )rk   function_unitr    s     r!   
p_functionz(Generic._make_parser.<locals>.p_function  s     tv~~ts{!1--- #! 5 5 M** (=1..AaDFE1EEEFFFr#   c                     t                      r   )rQ   rj   s    r!   p_errorz%Generic._make_parser.<locals>.p_error  s    ,,r#   generic_parsetabrU   )	tabmodulerW   )rY   r   yacc)r    r\   rl   rn   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   `                           r!   r/   zGeneric._make_parser   s    	 	 		 	 		) 	) 	)0	 	 		) 	) 	),
	 
	 
		 	 		 	 		 	 	 	 		+ 	+ 	+ 	+ 	+,	" 	" 	" 	" 	"0	# 	# 	#		 		 			$ 	$ 	$	 	 			 		 			6 	6 	6	 	 		 	 		 	 		 	 		 	 		 	 		 	 		G 	G 	G 	G 	G"	 	 	 |&8/RRRRr#   c           	         	 |                      |j                  S # t          $ rd}t          j                    }|j        |j        v r|j        |j                 cY d }~S t          d|j         dt          |                     d }~ww xY w)NzAt col z, )r   r;   rQ   r
   get_current_unit_registryaliasesrR   str)r    rA   eregistrys       r!   rM   zGeneric._get_unit  s    	=??17+++ 	= 	= 	=577Hw(***'0000000;qx;;3q66;;<<<	=s     
B
2BB
'BB
c                 X   t          j                    j        }|| j        v r| j        |         }n|                                s|d         dk    rd|dd          z   }|d         | j        v r|d d         | j        |d                  z   }nct          |          dk    r.|d         | j        v r|d d         | j        |d                  z   }n"|                    d          r|d d         dz   }||v r||         S |r"t          | d	t          ||                     t                      )
Nr      µur	   r8   u   R∞Ryz is not a valid unit. )r
   r   r   _unit_symbolsisascii_prefixable_unit_symbolsrs   _unit_suffix_symbolsr>   rQ   r   )r    sdetailed_exceptionr   s       r!   r   zGeneric._parse_unit  sC   133<!!!!!$AA 	"t'''!ABB%Ku444crcFS9!B%@@Q!")A A AcrcFS5ae<<O,, "crcFTM==A; 	TTa9R9RTTUUU,,r#   percentarcminarcsec	hourangleelectron)%u   ′u   ″u   ʰu   e⁻OhmAngstroml)u   Ω   Åu   ℓsunearthjupiter_e_p)u   ⊙u   ☉u   ⊕u   ♁u   ♃u   ₑu   ₚr   -)u   μu   −u!   ⁻⁺⁰¹²³⁴⁵⁶⁷⁸⁹z-+0123456789[z]?[r,   Nz]+u	   °([CF])?c                 b    d|                                                     | j                   dS )N())group	translate_superscript_translationsr    ms     r!   _convert_superscriptzGeneric._convert_superscript  s,    H17799&&s'DEEHHHHr#   c                 l    t          |j                  dk    rdS |j                            dd          S )Nr	   deg   °deg_)rs   stringreplacer   s     r!   _convert_degzGeneric._convert_deg   s2    qx==A5xf---r#   Fc                 |   t          |t                    s|                    d          }n|                                sot	          j        d|          }|                    | j                  }| j        	                    | j
        |          }| j        	                    | j        |          }|                     ||          }|                    d          }|dk    r[|t          t!          j        d|                    z
  dk    r2t%          j        d                    |          t*          j                   |S )NasciiNFC)debugr5   r	   z\(\d+/\d+\)zI'{}' contains multiple slashes, which is discouraged by the FITS standard)rh   r   decoder   unicodedata	normalizer   _translations_regex_superscriptsubr   
_regex_degr   	_do_parsecountrs   r9   findallwarningswarnformatr
   UnitsWarning)r    r   r   result	n_slashess        r!   parsezGeneric.parse&  s   !S!! 	8!!AA 	8
 %eQ//A C-..A
 &**3+CQGGA""3#3Q77Aq..GGCLL	q==i#bj.K.K*L*LLPQQQM3396!99!  
 r#   c                    	 |                      |d          S # t          $ rb}	 | j                            || j        |          cY d }~S # t          $ r(}t          |          r t          d| d          d }~ww xY wd }~ww xY w)NF)r   )lexerr   zSyntax error parsing unit 'r   )r   rQ   r0   r  r3   r   )r    r   r   r   s       r!   r   zGeneric._do_parseF  s    	I ??1???? 	I 	I 	II{((#*E(JJJJJJJJ I I Iq66 I$%G1%G%G%GHHH	I	Is2    
B!AB
A=#A88A==B  B)T)F)!__name__
__module____qualname____doc__rY   r   r"   r&   r*   r-   r0   r3   classmethodr2   r/   rM   r   r   r   r   r   	maketransr   _superscriptsr   r9   compiler   r   r   r   r  r   rJ   r#   r!   r   r      s        G  ]* * * ]! ! ! ]! ! ! ]! ! ! ]" " " ]! ! ! 7
 7
 [7
r wS wS [wSr	 = = [=    [0 $'2", M +06@!    %*# .2.2  MM)9!	
 	
 M	  !$m^ L L#$O$O$O-:K$O$O$OPPK((JI I [I . . [.
    [> I I I [I I Ir#   r   z5.3)alternativec                   2     e Zd ZdZe fd            Z xZS )Unscaledz
    A format that doesn't display the scale part of the unit, other
    than that, it is identical to the `Generic` format.

    This is used in some error messages where the scale is irrelevant.
    c                     |j         dk    rt          j        ||j         z            }t                                          |          S r)   )scaler
   r~   super	to_string)r    unit	__class__s     r!   r  zUnscaled.to_stringa  s<    :??9TDJ.//Dww  &&&r#   )r  r  r  r  r  r  __classcell__)r  s   @r!   r  r  X  sN          ' ' ' ' [' ' ' ' 'r#   r  )r  r9   r   r  	fractionsr   astropy.utilsr   r   r   astropy.utils.miscr    r
   baser   r   r  rJ   r#   r!   <module>r"     s     
			            < < < < < < < < < < + + + + + +            vI vI vI vI vId vI vI vIv Ey)))' ' ' ' 'w ' ' *)' ' 'r#   