o
    e                  
   @   sh  d Z ddlZddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZ dedefddZG dd	 d	eZG d
d deeZed Zedef ZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd  d ZG d!d" d"ZG d#d$ d$ZG d%d& d&Z e!d'Z"e!d(Z#e!d)Z$d*edee fd+d,Z%d-d.dee fd/d0Z&d-d.de
eee f fd1d2Z'	3ddd-d.d4e(de
eee f fd5d6Z)d-d.ded7 fd8d9Z*d-d.de
d7ef fd:d;Z+d-d.dee fd<d=Z,d>ed-d.defd?d@Z-dAed7 de
e.e.f fdBdCZ/G dDd7 d7e
eee f Z0G dEdF dFe0Z1G dGdH dHZ2ej3rQG dIdJ dJej4Z5dKeddJfdLdMZ6e6dNZ7e6dOZ8e6dPZ9e6dQZ:e6dRe6dSdTZ;e!dUj<Z=e!e2j>ej?j<Z@e!dVj<ZAeBdWdXZCdYdZdefd[d\ZDd]edefd^d_ZEd`edee0 fdadbZFG dcd. d.ZGdS )ea  
    cssselect.parser
    ================

    Tokenizer, parser and parsed objects for CSS selectors.


    :copyright: (c) 2007-2012 Ian Bicking and contributors.
                See AUTHORS for more details.
    :license: BSD, see LICENSE for more details.

    N)IterableIteratorListOptionalSequenceTupleUnionstringreturnc                 C   s   |  d dS )z(Lower-case, but only in the ASCII range.utf8)encodelowerdecode)r	    r   @D:\Projects\ConvertPro\env\Lib\site-packages\cssselect/parser.pyascii_lower   s   r   c                   @      e Zd ZdZdS )SelectorErrorzCommon parent for :class:`SelectorSyntaxError` and
    :class:`ExpressionError`.

    You can just use ``except SelectorError:`` when calling
    :meth:`~GenericTranslator.css_to_xpath` and handle both exceptions types.

    N__name__
__module____qualname____doc__r   r   r   r   r          r   c                   @   r   )SelectorSyntaxErrorz3Parsing a selector that does not match the grammar.Nr   r   r   r   r   r   %   r   r   )ElementHashClassFunctionPseudoAttribNegationRelationMatchingSpecificityAdjustmentCombinedSelectorFunctionalPseudoElementc                   @   s`   e Zd ZdZddedee ddfddZdefdd	Z	defd
dZ
deeeef fddZdS )Selectoru"  
    Represents a parsed selector.

    :meth:`~GenericTranslator.selector_to_xpath` accepts this object,
    but ignores :attr:`pseudo_element`. It is the user’s responsibility
    to account for pseudo-elements and reject selectors with unknown
    or unsupported pseudo-elements.

    Ntreepseudo_elementr
   c                 C   s*   || _ |d urt|tst|}|| _d S N)parsed_tree
isinstancer&   r   r)   )selfr(   r)   r   r   r   __init__F   s   
zSelector.__init__c                 C   sB   t | jtrt| j}n| jrd| j }nd}d| jj| j|f S )N::%s z%s[%r%s])r,   r)   r&   repr	__class__r   r+   )r-   r)   r   r   r   __repr__`   s   zSelector.__repr__c                 C   s^   t | jtrd| j  }n| jrd| j }nd}d| j |f }t|dkr-|d}|S )z8Return a CSS representation for this selector (a string)r/   r0   z%s%s   *)r,   r)   r&   	canonicalr+   lenlstrip)r-   r)   resr   r   r   r6   i   s   
zSelector.canonicalc                 C   s(   | j  \}}}| jr|d7 }|||fS )zReturn the specificity_ of this selector as a tuple of 3 integers.

        .. _specificity: http://www.w3.org/TR/selectors/#specificity

        r4   )r+   specificityr)   r-   abcr   r   r   r:   v   s   
zSelector.specificityr*   )r   r   r   r   Treer   PseudoElementr.   strr3   r6   r   intr:   r   r   r   r   r'   ;   s    
	r'   c                   @   Z   e Zd ZdZdededdfddZdefdd	Zdefd
dZde	e
e
e
f fddZdS )r   z(
    Represents selector.class_name
    selector
class_namer
   Nc                 C      || _ || _d S r*   )rD   rE   )r-   rD   rE   r   r   r   r.         
zClass.__init__c                 C      d| j j| j| jf S )Nz	%s[%r.%s])r2   r   rD   rE   r-   r   r   r   r3         zClass.__repr__c                 C      d| j  | jf S )Nz%s.%s)rD   r6   rE   rI   r   r   r   r6         zClass.canonicalc                 C   "   | j  \}}}|d7 }|||fS Nr4   rD   r:   r;   r   r   r   r:         
zClass.specificityr   r   r   r   r?   rA   r.   r3   r6   r   rB   r:   r   r   r   r   r          r   c                   @   sT   e Zd ZdZdeded fddZdefdd	Zdee fd
dZ	defddZ
dS )r&   ax  
    Represents selector::name(arguments)

    .. attribute:: name

        The name (identifier) of the pseudo-element, as a string.

    .. attribute:: arguments

        The arguments of the pseudo-element, as a list of tokens.

        **Note:** tokens are not part of the public API,
        and may change between cssselect versions.
        Use at your own risks.

    name	argumentsTokenc                 C   s   t || _|| _d S r*   )r   rS   rT   )r-   rS   rT   r   r   r   r.      s   

z FunctionalPseudoElement.__init__r
   c                 C   s    d| j j| jdd | jD f S )Nz%s[::%s(%r)]c                 S      g | ]}|j qS r   value.0tokenr   r   r   
<listcomp>       z4FunctionalPseudoElement.__repr__.<locals>.<listcomp>)r2   r   rS   rT   rI   r   r   r   r3      s
   z FunctionalPseudoElement.__repr__c                 C      dd | j D S )Nc                 S   rV   r   typerY   r   r   r   r\      r]   z:FunctionalPseudoElement.argument_types.<locals>.<listcomp>rT   rI   r   r   r   argument_types      z&FunctionalPseudoElement.argument_typesc                 C   s$   d dd | jD }d| j|f S )Nr0   c                 s       | ]}|  V  qd S r*   cssrY   r   r   r   	<genexpr>       z4FunctionalPseudoElement.canonical.<locals>.<genexpr>z%s(%s))joinrT   rS   r-   argsr   r   r   r6      s   z!FunctionalPseudoElement.canonicalN)r   r   r   r   rA   r   r.   r3   r   rb   r6   r   r   r   r   r&      s    c                   @   st   e Zd ZdZdededed ddfdd	Zdefd
dZde	e fddZ
defddZdeeeef fddZdS )r   z(
    Represents selector:name(expr)
    rD   rS   rT   rU   r
   Nc                 C   s   || _ t|| _|| _d S r*   )rD   r   rS   rT   )r-   rD   rS   rT   r   r   r   r.      s   

zFunction.__init__c                 C   s$   d| j j| j| jdd | jD f S )Nz%s[%r:%s(%r)]c                 S   rV   r   rW   rY   r   r   r   r\      r]   z%Function.__repr__.<locals>.<listcomp>)r2   r   rD   rS   rT   rI   r   r   r   r3      s   zFunction.__repr__c                 C   r^   )Nc                 S   rV   r   r_   rY   r   r   r   r\      r]   z+Function.argument_types.<locals>.<listcomp>ra   rI   r   r   r   rb      rc   zFunction.argument_typesc                 C   s,   d dd | jD }d| j | j|f S )Nr0   c                 s   rd   r*   re   rY   r   r   r   rg      rh   z%Function.canonical.<locals>.<genexpr>z	%s:%s(%s))ri   rT   rD   r6   rS   rj   r   r   r   r6      s   zFunction.canonicalc                 C   rM   rN   rO   r;   r   r   r   r:      rP   zFunction.specificity)r   r   r   r   r?   rA   r   r.   r3   r   rb   r6   r   rB   r:   r   r   r   r   r      s    r   c                   @   rC   )r   z#
    Represents selector:ident
    rD   identr
   Nc                 C   s   || _ t|| _d S r*   )rD   r   rl   )r-   rD   rl   r   r   r   r.      s   zPseudo.__init__c                 C   rH   )Nz	%s[%r:%s])r2   r   rD   rl   rI   r   r   r   r3      rJ   zPseudo.__repr__c                 C   rK   )Nz%s:%s)rD   r6   rl   rI   r   r   r   r6      rL   zPseudo.canonicalc                 C   rM   rN   rO   r;   r   r   r   r:      rP   zPseudo.specificityrQ   r   r   r   r   r      rR   r   c                   @   sZ   e Zd ZdZdededdfddZdefdd	Zdefd
dZde	e
e
e
f fddZdS )r!   z.
    Represents selector:not(subselector)
    rD   subselectorr
   Nc                 C   rF   r*   )rD   rm   )r-   rD   rm   r   r   r   r.      rG   zNegation.__init__c                 C   rH   )Nz%s[%r:not(%r)]r2   r   rD   rm   rI   r   r   r   r3      rJ   zNegation.__repr__c                 C   s2   | j  }t|dkr|d}d| j |f S )Nr4   r5   z
%s:not(%s))rm   r6   r7   r8   rD   r-   Zsubselr   r   r   r6      s   

zNegation.canonicalc                 C   6   | j  \}}}| j \}}}|| || || fS r*   rD   r:   rm   r-   Za1b1c1Za2b2c2r   r   r   r:        zNegation.specificity)r   r   r   r   r?   r.   rA   r3   r6   r   rB   r:   r   r   r   r   r!      s    r!   c                   @   sZ   e Zd ZdZdedddefddZdefd	d
ZdefddZ	de
eeef fddZdS )r"   z.
    Represents selector:has(subselector)
    rD   
combinatorrU   rm   c                 C   s   || _ || _|| _d S r*   rD   rx   rm   r-   rD   rx   rm   r   r   r   r.     s   
zRelation.__init__r
   c                 C   rH   )Nz%s[%r:has(%r)]rn   rI   r   r   r   r3     s
   zRelation.__repr__c                 C   sX   z	| j d  }W n ty   | j  }Y nw t|dkr#|d}d| j |f S )Nr   r4   r5   z
%s:has(%s))rm   r6   	TypeErrorr7   r8   rD   ro   r   r   r   r6     s   
zRelation.canonicalc                 C   sb   | j  \}}}z| jd  \}}}W n ty%   | j \}}}Y nw || || || fS )N)rD   r:   rm   r{   rr   r   r   r   r:   "  s   zRelation.specificityN)r   r   r   r   r?   r'   r.   rA   r3   r6   r   rB   r:   r   r   r   r   r"     s    	r"   c                   @   Z   e Zd ZdZdedee fddZdefddZdefd	d
Z	de
eeef fddZdS )r#   z/
    Represents selector:is(selector_list)
    rD   selector_listc                 C   rF   r*   rD   r~   r-   rD   r~   r   r   r   r.   0  rG   zMatching.__init__r
   c                 C   "   d| j j| jdtt| jf S )Nz%s[%r:is(%s)], r2   r   rD   ri   mapr1   r~   rI   r   r   r   r3   4  
   zMatching.__repr__c                 C   F   g }| j D ]}| }||d qd| j dtt|f S )Nr5   z	%s:is(%s)r   r~   r6   appendr8   rD   ri   r   rA   r-   Zselector_argumentssZselargr   r   r   r6   ;  s
   
zMatching.canonicalc                 C   s   t dd | jD S )Nc                 s   rd   r*   )r:   )rZ   xr   r   r   rg   C  rh   z'Matching.specificity.<locals>.<genexpr>)maxr~   rI   r   r   r   r:   B  rL   zMatching.specificityN)r   r   r   r   r?   r   r.   rA   r3   r6   r   rB   r:   r   r   r   r   r#   +  s    r#   c                   @   r}   )r$   zz
    Represents selector:where(selector_list)
    Same as selector:is(selector_list), but its specificity is always 0
    rD   r~   c                 C   rF   r*   r   r   r   r   r   r.   L  rG   zSpecificityAdjustment.__init__r
   c                 C   r   )Nz%s[%r:where(%s)]r   r   rI   r   r   r   r3   P  r   zSpecificityAdjustment.__repr__c                 C   r   )Nr5   z%s:where(%s)r   r   r   r   r   r   r6   W  s   
zSpecificityAdjustment.canonicalc                 C   s   dS )Nr   r   r   r   rI   r   r   r   r:   a  s   z!SpecificityAdjustment.specificityN)r   r   r   r   r?   r   r.   rA   r3   r6   r   rB   r:   r   r   r   r   r$   F  s    
r$   c                   @   s   e Zd ZdZejdedee deddddd	dfd
dZ	ejdedee dededdd	dfddZ	dedee dededed d	dfddZ	d	efddZ
d	efddZd	eeeef fddZdS )r    z>
    Represents selector[namespace|attrib operator value]
    rD   	namespaceattriboperatorztyping.Literal["exists"]rX   Nr
   c                 C      d S r*   r   r-   rD   r   r   r   rX   r   r   r   r.   j  s   	zAttrib.__init__rU   c                 C   r   r*   r   r   r   r   r   r.   u  s   c                 C   s"   || _ || _|| _|| _|| _d S r*   )rD   r   r   r   rX   r   r   r   r   r.   {  s
   
c              	   C   sb   | j rd| j | jf }n| j}| jdkrd| jj| j|f S d| jj| j|| jtd| jjf S )N%s|%sexistsz
%s[%r[%s]]z%s[%r[%s %s %r]]rU   )	r   r   r   r2   r   rD   typingcastrX   )r-   r   r   r   r   r3     s   
zAttrib.__repr__c                 C   s^   | j rd| j | jf }n| j}| jdkr|}nd|| jtd| j f }d| j |f S )Nr   r   z%s%s%srU   %s[%s])	r   r   r   r   r   rX   rf   rD   r6   )r-   r   opr   r   r   r6     s   
zAttrib.canonicalc                 C   rM   rN   rO   r;   r   r   r   r:     rP   zAttrib.specificity)r   r   r   r   r   overloadr?   r   rA   r.   r3   r6   r   rB   r:   r   r   r   r   r    e  s\    

r    c                   @   sd   e Zd ZdZddee dee ddfddZdefdd	Zdefd
dZde	e
e
e
f fddZdS )r   zU
    Represents namespace|element

    `None` is for the universal selector '*'

    Nr   elementr
   c                 C   rF   r*   )r   r   )r-   r   r   r   r   r   r.     rG   zElement.__init__c                 C   s   d| j j|  f S )Nr   )r2   r   r6   rI   r   r   r   r3     rL   zElement.__repr__c                 C   s"   | j pd}| jrd| j|f }|S )Nr5   r   )r   r   )r-   r   r   r   r   r6     s   
zElement.canonicalc                 C   s   | j rdS dS )N)r   r   r4   r   r   rI   r   r   r   r:     s   zElement.specificity)NN)r   r   r   r   r   rA   r.   r3   r6   r   rB   r:   r   r   r   r   r     s     r   c                   @   rC   )r   z 
    Represents selector#id
    rD   idr
   Nc                 C   rF   r*   )rD   r   )r-   rD   r   r   r   r   r.     rG   zHash.__init__c                 C   rH   )Nz	%s[%r#%s])r2   r   rD   r   rI   r   r   r   r3     rJ   zHash.__repr__c                 C   rK   )Nz%s#%s)rD   r6   r   rI   r   r   r   r6     rL   zHash.canonicalc                 C   s"   | j  \}}}|d7 }|||fS rN   rO   r;   r   r   r   r:     rP   zHash.specificityrQ   r   r   r   r   r     rR   r   c                   @   sZ   e Zd ZdedededdfddZdefdd	Zdefd
dZdee	e	e	f fddZ
dS )r%   rD   rx   rm   r
   Nc                 C   s"   |d usJ || _ || _|| _d S r*   ry   rz   r   r   r   r.     s   
zCombinedSelector.__init__c                 C   s.   | j dkrd}n| j }d| jj| j|| jf S )N z
<followed>z%s[%r %s %r])rx   r2   r   rD   rm   )r-   combr   r   r   r3     s   
zCombinedSelector.__repr__c                 C   s6   | j  }t|dkr|d}d| j | j|f S )Nr4   r5   z%s %s %s)rm   r6   r7   r8   rD   rx   ro   r   r   r   r6     s   

zCombinedSelector.canonicalc                 C   rp   r*   rq   rr   r   r   r   r:     rw   zCombinedSelector.specificity)r   r   r   r?   rA   r.   r3   r6   r   rB   r:   r   r   r   r   r%     s
    r%   z%^[ \t\r\n\f]*([a-zA-Z]+)[ \t\r\n\f]*$z6^[ \t\r\n\f]*([a-zA-Z]*)#([a-zA-Z0-9_-]+)[ \t\r\n\f]*$z?^[ \t\r\n\f]*([a-zA-Z]*)\.([a-zA-Z][a-zA-Z0-9_-]*)[ \t\r\n\f]*$rf   c                 C   s   t | }|rtt|ddgS t| }|dur.ttt|dp$dd|dgS t| }|durJttt|dp@dd|dgS t	t
| }| |_tt|S )a  Parse a CSS *group of selectors*.

    If you don't care about pseudo-elements or selector specificity,
    you can skip this and use :meth:`~GenericTranslator.css_to_xpath`.

    :param css:
        A *group of selectors* as a string.
    :raises:
        :class:`SelectorSyntaxError` on invalid selectors.
    :returns:
        A list of parsed :class:`Selector` objects, one for each
        selector in the comma-separated group.

    r4   r   N   )_el_rematchr'   r   group_id_rer   	_class_rer   TokenStreamtokenizesourcelistparse_selector_group)rf   r   streamr   r   r   parse  s   

&
&r   r   r   c                 c   s>    |    	 tt|  V  |  dkr|   |    nd S q)Nr4   DELIM,)skip_whitespacer'   parse_selectorpeeknext)r   r   r   r   r   +  s   
r   c                 C   s   t | \}}	 |   |  }|dv r	 ||fS |r td| |dddr5tt|  j	}|   nd}t | \}}t
|||}q)Nr4   )EOFNr   4Got pseudo-element ::%s not at the end of a selector+>~r   )parse_simple_selectorr   r   r   is_delimr   r   rA   r   rX   r%   )r   resultr)   r   rx   Znext_selectorr   r   r   r   6  s$   
r   Finside_negationc                 C   s  |    t| j}|  }|jdks|dkr;|jdkr!|  j}n|   d }|  dkr6|   |  }n	|}d }nd  }}t||}d }	 |  }|jdv s^|	dddd	s^|r`|d
kr`ng|rht
d| |jdkr{t|tt|  j}nK|dkr|   t||  }n:|dkr|   td |  }n)|dkr|   t|| }n|dkr|   |  dkr|   |  }|  dkr|   t|t| }qF|  }| dv rt|}qF|  dkr@t||}t|dkr?t| jdks?t| jdkr| jd jdks?t| jdkr!| jd 	ds?t| jdkr;| jd jdkr;| jd 	ds?t
dqF|   |    | dkr|rVt
dt| dd\}	}
|  }|
rnt
d|
|jf |d
krzt
d |f t||	}nF| d!krt| \}}t|||}n2| d"v rt| }t||}n!| d#krt| }t||}nt||t| }nt
d$|f qGt| j|krt
d$|  f ||fS )%NIDENTr   r5   r   |r4   )Sr   r   r   r   r   r   )r   HASHr   .)r   [)r   :)r   ()z
first-linezfirst-letterbeforeafterzPseudo[Element[*]:scope]r      r   r      zJGot immediate child pseudo-element ":scope" not at the start of a selectornotzGot nested :not()T)r   z+Got pseudo-element ::%s inside :not() at %szExpected ')', got %shas)matchesiswherezExpected selector, got %s) r   r7   usedr   r`   r   rX   next_ident_or_starr   r   r   r   r   r   rA   r   
next_identparse_attribr&   parse_argumentsr   r   r1   r   posr!   parse_relative_selectorr"   parse_simple_selector_argumentsr#   r$   r   )r   r   Zselector_startr   r   r   r   r)   rl   ZargumentZargument_pseudo_elementr   rx   rT   	selectorsr   r   r   r   N  s   







""

Yr   rU   c                 C   sP   g }	 |    |  }|jdv s|dv r|| n|dkr |S td|f q)Nr4   r   STRINGNUMBER)r   r   r   -r   Expected an argument, got %s)r   r   r`   r   r   )r   rT   r   r   r   r   r     s   r   c                 C   s   |    d}|  }|dv r|}|    |  }ntdddd}	 |jdv s*|d	v r4|tt|j7 }n|d
krBt|}||d fS t	d|f |  }q!)Nr0   )r   r   )r   r   )r   r   r   r   r   r   r4   r   )r   r   r   r   )
r   r   rU   r`   r   r   rA   rX   r   r   )r   rm   r   rx   r   r   r   r   r     s"   
r   c                 C   s   g }	 t | d\}}|rtd|f |   |  }|dv r-|   |   || n|dkr9|| 	 |S td|f q)Nr4   Tz'Got pseudo-element ::%s inside functionr   r   r   )r   r   r   r   r   )r   rT   r   r)   r   r   r   r   r     s&   
r   rD   c                 C   sx  |   | }|d u r| dkrtd| f | dkr=|  | dkr4d }|  d}n|}| }d }nd  }}|d u r|   | }|dkr]t| |tt	|dd S |dkrdd}n%|
dd	d
dddr| dkrtt	|jd }|  ntd|f |   | }|jdvrtd|f |   | }|dkrtd|f t| |tt	|||S )Nr   zExpected '|', got %s)r   =z|=)r   ]r   r   ^$r5   r   r   !zOperator expected, got %s)r   r   z Expected string or ident, got %szExpected ']', got %s)r   r   r   r   r   r   r    r   r   rA   r   rX   r`   )rD   r   r   r   r   r   rX   r   r   r   r     sD    

r   tokensc                 C   s   | D ]}|j dkrtdqddd | D  }|dkr dS |dkr&d	S |d
kr,dS d
|vr6dt|fS |d
d\}}|sCd}n|dksK|dkrRt|d }nt|}|s^d}||fS t|}||fS )zv
    Parses the arguments for :nth-child() and friends.

    :raises: A list of tokens
    :returns: :``(a, b)``

    r   z$String tokens not allowed in series.r0   c                 s   s    | ]
}t t|jV  qd S r*   )r   r   rA   rX   rY   r   r   r   rg   1  s    zparse_series.<locals>.<genexpr>Zodd)r   r4   Zeven)r   r   n)r4   r   r   r4   r   r   1)r`   
ValueErrorri   striprB   split)r   r[   r   r<   r=   Za_as_intZb_as_intr   r   r   parse_series&  s0   
r   c                	   @   s   e Zd ZU ejdddededd fddZejdddd	dedd fd
dZdedee dedd fddZdefddZ	dede
fddZeed< edefddZedee fddZdefddZd	S )rU   type_zAtyping.Literal["IDENT", "HASH", "STRING", "S", "DELIM", "NUMBER"]rX   r   r
   c                 C   r   r*   r   clsr   rX   r   r   r   r   __new__O  s   zToken.__new__ztyping.Literal["EOF"]Nc                 C   r   r*   r   r   r   r   r   r   X  s   c                 C   s   t | ||f}||_|S r*   )tupler   r   )r   r   rX   r   objr   r   r   r   \  s   c                 C   s   d| j | j| jf S )Nz<%s '%s' at %i>)r`   rX   r   rI   r   r   r   r3   a  rL   zToken.__repr__valuesc                 G   s   | j dko	| j|v S )Nr   )r`   rX   )r-   r   r   r   r   r   d  rL   zToken.is_delimc                 C      | d S )Nr   r   rI   r   r   r   r`   i     z
Token.typec                 C   r   rN   r   rI   r   r   r   rX   m  r   zToken.valuec                 C   s"   | j dkr
t| jS tt| jS )Nr   )r`   r1   rX   r   r   rA   rI   r   r   r   rf   q  s   

z	Token.css)r   r   r   r   r   rA   rB   r   r   r3   boolr   __annotations__propertyr`   rX   rf   r   r   r   r   rU   N  s,   
 c                   @   s,   e Zd Zdedd fddZdefddZdS )EOFTokenr   r
   c              	   C   s   t dt| dd |S )Nr   r   )r   r   rU   r   )r   r   r   r   r   r   y     zEOFToken.__new__c                 C   s   d| j | jf S )Nz
<%s at %i>)r`   r   rI   r   r   r   r3   |  rc   zEOFToken.__repr__N)r   r   r   rB   r   rA   r3   r   r   r   r   r   x  s    r   c                   @   s<   e Zd ZdZed Zde ZdZdeef Zdeef ZdS )TokenMacrosz&\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?z|\\[^\n\r\f0-9a-f]z\\(?:\n|\r\n|\r|\f)|z
[^\0-\177]z[_a-z0-9-]|%s|%sz[_a-z]|%s|%sN)	r   r   r   unicode_escapeescapeZstring_escapeZnonasciiZnmcharZnmstartr   r   r   r   r     s    r   c                
   @   s.   e Zd Z	d
dedededed fddZd	S )	MatchFunc.r	   r   endposr
   re.Match[str]c                 C   r   r*   r   )r-   r	   r   r  r   r   r   __call__  s   zMatchFunc.__call__N)..)r   r   r   rA   rB   r   r  r   r   r   r   r    s    r  patternc                 C   s   t | tt t jjS r*   )recompilevarsr   
IGNORECASEr   )r  r   r   r   _compile  r   r  z[ \t\r\n\f]+z[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)z#(?:%(nmchar)s)+z -?(?:%(nmstart)s)(?:%(nmchar)s)*z!([^\n\r\f\\']|%(string_escape)s)*z!([^\n\r\f\\"]|%(string_escape)s)*)'"z\\(.)z\\(?:\n|\r\n|\r|\f)r   r4   r   r  c                 C   s&   t | dd}|tjkrd}t|S )Nr4      i  )rB   r   sys
maxunicodechr)r   	codepointr   r   r   _replace_unicode  s   
r  rX   c                 C   s   t t| } tt| } | S r*   )_sub_unicode_escaper  _sub_simple_escape_replace_simplerW   r   r   r   unescape_ident  s   

r  r   c                 c   s   d}t | }||k rt| |d}|rtdd|V  | }qt| |d}|r=tttt|	 }td||V  | }qt
| |d}|r_tttt|	 dd  }td||V  | }q| | }|tv rt| | |d d}|swJ d| }||krtd	| | | |krtd
| tttttd|	 }td||V  |d }qt| |d}|r|	 }td||V  | }q|d }| || dkr| d|}|dkr|}n|d7 }qtd| | |V  |d7 }||k s||ksJ t|V  d S )Nr   r   r   r   r   r4   r   z)Should have found at least an empty matchzUnclosed string at %szInvalid string at %sr0   r   r   r   z/*z*/r|   r   )r7   _match_whitespacerU   end_match_identr  r  r  r  r   _match_hash_match_string_by_quoter   _sub_newline_escape_match_numberfindr   )r   r   Zlen_sr   rX   quoteend_pospos2r   r   r   r     sv   =r   c                   @   sr   e Zd Zddee dee ddfddZdefddZdefd	d
Z	defddZ
dee fddZdddZdS )r   Nr   r   r
   c                 C   s0   g | _ t|| _|| _d | _d| _| jj| _d S NF)r   iterr   r   peeked_peeking__next__
next_token)r-   r   r   r   r   r   r.     s   
zTokenStream.__init__c                 C   sH   | j rd| _ | jtt| j tt| jS |  }| j| |S r$  )r'  r   r   r   r   rU   r&  r)  r-   r   r   r   r   r     s   zTokenStream.nextc                 C   s$   | j s|  | _d| _ tt| jS )NT)r'  r)  r&  r   r   rU   rI   r   r   r   r     s   
zTokenStream.peekc                 C   s.   |   }|jdkrtd|f tt|jS )Nr   zExpected ident, got %s)r   r`   r   r   r   rA   rX   r*  r   r   r   r     s   
zTokenStream.next_identc                 C   s2   |   }|jdkr|jS |dkrd S td|f )Nr   r   zExpected ident or '*', got %s)r   r`   rX   r   r*  r   r   r   r     s   
zTokenStream.next_ident_or_starc                 C   s"   |   }|jdkr|   d S d S )Nr   )r   r`   r   )r-   r   r   r   r   r   #  s   
zTokenStream.skip_whitespacer*   )r
   N)r   r   r   r   rU   r   rA   r.   r   r   r   r   r   r   r   r   r   r     s     
	)F)Hr   r  r  r   r   r   r   r   r   r   r   r   rA   r   	Exceptionr   SyntaxErrorr   r?   r@   r'   r   r&   r   r   r!   r"   r#   r$   r    r   r   r%   r	  r   r   r   r   r   r   r   r   r   r   r   r   rB   r   rU   r   r   TYPE_CHECKINGProtocolr  r  r  r  r  r  r  subr  r  Ir  r  methodcallerr  r  r  r   r   r   r   r   r   <module>   s   $
G%#G


(
t*(*	D