U
    g                     @  s   U d dl mZ d dlZd dlZd dlmZ d dlmZmZ ddl	m
Z
 eG dd dZG d	d
 d
eZddddddedejddddedejee
je
j ejejB ddddddddZded < G d!d" d"ZdS )#    )annotationsN)	dataclass)IteratorNoReturn   )	Specifierc                   @  s&   e Zd ZU ded< ded< ded< dS )TokenstrnametextintpositionN)__name__
__module____qualname____annotations__ r   r   8/tmp/pip-unpacked-wheel-et9flr3b/packaging/_tokenizer.pyr      s   
r   c                      s:   e Zd ZdZddddd fddZddd	d
Z  ZS )ParserSyntaxErrorz7The provided source text could not be parsed correctly.r	   ztuple[int, int]None)messagesourcespanreturnc                  s    || _ || _|| _t   d S )N)r   r   r   super__init__)selfr   r   r   	__class__r   r   r      s    zParserSyntaxError.__init__r   c                 C  s>   d| j d  d| j d | j d    d }d| j| j|gS )N r   ~r   ^z
    )r   joinr   r   )r   markerr   r   r   __str__"   s    *zParserSyntaxError.__str__)r   r   r   __doc__r   r%   __classcell__r   r   r   r   r      s   r   z\(z\)z\[z\];,zk
            (
                ('[^']*')
                |
                ("[^"]*")
            )
        z(===|==|~=|!=|<=|>=|<|>)z\b(or|and)\bz\bin\bz\bnot\ba  
            \b(
                python_version
                |python_full_version
                |os[._]name
                |sys[._]platform
                |platform_(release|system)
                |platform[._](version|machine|python_implementation)
                |python_implementation
                |implementation_(name|version)
                |extra
            )\b
        z\@z[^ \t]+z\b[a-zA-Z0-9][a-zA-Z0-9._-]*\bz\.\*z\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*z[ \t]+$)ZLEFT_PARENTHESISZRIGHT_PARENTHESISZLEFT_BRACKETZRIGHT_BRACKET	SEMICOLONCOMMAZQUOTED_STRINGOPBOOLOPINZNOTVARIABLEZ	SPECIFIERATURL
IDENTIFIERZVERSION_PREFIX_TRAILZVERSION_LOCAL_LABEL_TRAILZWSZEND dict[str, str | re.Pattern[str]]DEFAULT_RULESc                   @  s   e Zd ZdZddddddZdddd	d
ZddddddddZddddddZddddZddddddddddZ	e
jddddd d!d"ZdS )#	TokenizerzContext-sensitive token parsing.

    Provides methods to examine the input stream to check whether the next token
    matches.
    r	   r4   r   )r   rulesr   c                C  s*   || _ dd | D | _d | _d| _d S )Nc                 S  s   i | ]\}}|t |qS r   )recompile).0r
   patternr   r   r   
<dictcomp>h   s     z&Tokenizer.__init__.<locals>.<dictcomp>r   )r   itemsr7   
next_tokenr   )r   r   r7   r   r   r   r   a   s    zTokenizer.__init__)r
   r   c                 C  s   |  |r|   dS )z8Move beyond provided token name, if at current position.N)checkread)r   r
   r   r   r   consumen   s    
zTokenizer.consumeF)peekbool)r
   rB   r   c                C  sz   | j dks td|d| j || jks8td|| j| }|| j| j}|dkr^dS |svt||d | j| _ dS )zCheck whether the next token has the provided name.

        By default, if the check succeeds, the token *must* be read before
        another check. If `peek` is set to `True`, the token is not loaded and
        would need to be checked again.
        NzCannot check for z, already have zUnknown token name: Fr   T)r>   AssertionErrorr7   matchr   r   r   )r   r
   rB   Z
expressionrE   r   r   r   r?   s   s    
zTokenizer.checkr   )r
   expectedr   c                C  s"   |  |s| d| |  S )zsExpect a certain token name next, failing with a syntax error otherwise.

        The token is *not* read.
        z	Expected )r?   raise_syntax_errorr@   )r   r
   rF   r   r   r   expect   s    
zTokenizer.expectr   c                 C  s0   | j }|dk	st|  jt|j7  _d| _ |S )z%Consume the next token and return it.N)r>   rD   r   lenr   )r   tokenr   r   r   r@      s
    zTokenizer.readN)
span_startspan_endz
int | Noner   )r   rK   rL   r   c                C  s8   |dkr| j n||dkr| j n|f}t|| j|ddS )z.Raise ParserSyntaxError at the given position.N)r   r   )r   r   r   )r   r   rK   rL   r   r   r   r   rG      s    	zTokenizer.raise_syntax_errorzIterator[None])
open_tokenclose_tokenaroundr   c                c  sf   |  |r| j}|   nd }d V  |d kr0d S |  |sZ| jd| d| d| |d |   d S )NzExpected matching z for z, after )rK   )r?   r   r@   rG   )r   rM   rN   rO   Zopen_positionr   r   r   enclosing_tokens   s    


zTokenizer.enclosing_tokens)r   r   r   r&   r   rA   r?   rH   r@   rG   
contextlibcontextmanagerrP   r   r   r   r   r6   Z   s   	r6   )
__future__r   rQ   r8   Zdataclassesr   typingr   r   
specifiersr   r   	Exceptionr   r9   VERBOSEZ_operator_regex_strZ_version_regex_str
IGNORECASEr5   r   r6   r   r   r   r   <module>   sP    


3