B
    fc              ,   @   s  d Z ddlmZ ddlZedddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.g+ed/d0Zd1d2d3d4d5d6Zed7ej	Z
ed8ej	Zed9Zed:ejZed;Zed<ej Zed=Zed>Zed?d@ZdedAej	fdedBfdCedDfdEedFej	ejB fdGefdHe
fdIedJejfdKedLejfdMedNdeeje fdOedPej	fdQedRejejB fgZdSdT ZdUdV ZdWdX Zd[dYdZZdS )\z
    babel.messages.jslexer
    ~~~~~~~~~~~~~~~~~~~~~~

    A simple JavaScript 1.5 lexer which is used for the JavaScript
    extractor.

    :copyright: (c) 2013-2022 by the Babel Team.
    :license: BSD, see LICENSE for more details.
    )
namedtupleN+-*%z!=z==<>z<=z>==z+=z-=z*=z%=z<<z>>z>>>z<<=z>>=z>>>=&z&=|z|=z&&z||^z^=()[]{}!z--z++~,;.:T)keyreverse
	)bfnrtz[\w$_][\w\d$_]*z[\w$_][\w\d$_.]*[\w\d$_.]z/=?z%/(?:[^/\\]*(?:\\.[^/\\]*)*)/[a-zA-Z]*z(\r\n|\n|\r)z\\z[a-fA-F0-9]{1,4}z[a-fA-F0-9]{1,2}Tokenztype value linenoz\s+z<!--.*Zlinecommentz//.*Zmultilinecommentz	/\*.*?\*/dotted_namenamenumberzb(
        (?:0|[1-9]\d*)
        (\.\d+)?
        ([eE][-+]?\d+)? |
        (0x[a-fA-F0-9]+)
    )Zjsx_tagz(?:</?[^>\s]+|/>)operatorz(%s)template_stringz`(?:[^`\\]*(?:\\.[^`\\]*)*)`stringzT(
        '(?:[^'\\]*(?:\\.[^'\\]*)*)'  |
        "(?:[^"\\]*(?:\\.[^"\\]*)*)"
    )c             C   sZ   g }xPt D ]H\}}| s$|r$d|kr$q
|s2|dkr2q
|dkrD|s@q
d}|||f q
W |S )ze
    Get a tokenization rule list given the passed syntax options.

    Internal to this module.
    jsxr*   r&   r'   )_rulesappend)r,   dottedr*   rules
token_typerule r3   5lib/python3.7/site-packages/babel/messages/jslexer.py	get_rules:   s    r5   c             C   s   | j dkr| jdkS | j dkS )zzA helper function that helps the tokenizer to decide if the current
    token may be followed by a division operator.
    r)   )r   r   r   z++z--)r'   r(   r+   regexp)typevalue)tokenr3   r3   r4   indicates_divisionN   s    

r:   c             C   s  | r | d | d kr | d dks(t dtd| dd } g }|j}d}xJ| d|}|dk rdP || ||  | |d  }|tkr|t|  n|dkr(t| |d	 }|d
k	r| }t	|dkry|t
t|d W n tk
r   Y nX |d }qN|||  | }qNn|| nd|dkrt| |d	 }|d
k	rz| }|t
t|d |d	 t	| }qNn|| n|| |d	 }qNW |t	| k r|| |d
  d|S )zUnquote a string with JavaScript rules.  The string has to start with
    string delimiters (``'``, ``"`` or the back-tick/grave accent (for template strings).)
    r   z"'`z)string provided is not properly delimitedz\1   \ZuU   N         ZxX )AssertionErrorline_join_resubr.   findescapesuni_escape_rematchgrouplenchrint
ValueErrorendhex_escape_rejoin)r+   resultaddposZ
escape_posZ	next_charZescapedZescaped_valuer3   r3   r4   unquote_stringW   sT    "





rU   c             c   s   d}d}d}t | }t|||d}x||k rx^|D ]\}	}
|
| |}|dk	r2P q2W |rjt| |}d}	nt| |}d}	|dkr|d7 }q$| }|	dk	rt|	||}t|}|V  |t t	|7 }|
 }q$W dS )z
    Tokenize JavaScript/JSX source.  Returns a generator of tokens.

    :param jsx: Enable (limited) JSX parsing.
    :param dotted: Read dotted names as single name token.
    :param template_string: Support ES6 template strings
    Fr   r<   )r,   r/   r*   Nr)   r6   )rK   r5   rI   division_reregex_rerJ   r%   r:   line_refindallrO   )sourcer,   r/   r*   Z
may_dividerT   linenorO   r0   r1   r2   rI   Ztoken_valuer9   r3   r3   r4   tokenize   s2    
r\   )TTT)__doc__collectionsr   resortedrK   Z	operatorsrG   compileUNICODEZname_reZdotted_name_rerV   DOTALLrW   rX   patternrD   rH   rP   r%   VERBOSEIrQ   mapescaper-   r5   r:   rU   r\   r3   r3   r3   r4   <module>   sF   






	C