B
    h                 @   sF  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 eed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$eee d)d*d+Z%d,ee d-d.d/Z&d,e
eee f d-d0d1Z'dcd,e(e
eee f d3d4d5Z)d,ed6 d-d7d8Z*d,e
d6ef d-d9d:Z+d,ee d-d;d<Z,ed,ed=d>d?Z-ed6 e
e.e.f d@dAdBZ/G dCd6 d6e
eee f Z0G dDdE dEe0Z1G dFdG dGZ2ej3rG dHdI dIej4Z5edIdJdKdLZ6e6dMZ7e6dNZ8e6dOZ9e6dPZ:e6dQe6dRdSZ;e!dTj<Z=e!e2j>ej?j<Z@e!dUj<ZAeBdVdWZCdXedYdZd[ZDeed\d]d^ZEeee0 d_d`daZFG dbd, d,ZGdS )da  
    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   MC:\Users\sanjo\AppData\Local\Qlobot\Launcher\ext_packages\cssselect\parser.pyascii_lower   s    r   c               @   s   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      s   r   c               @   s   e Zd ZdZdS )SelectorSyntaxErrorz3Parsing a selector that does not match the grammar.N)r   r   r   r   r   r   r   r   r   %   s   r   )ElementHashClassFunctionPseudoAttribNegationRelationMatchingSpecificityAdjustmentCombinedSelectorFunctionalPseudoElementc               @   s\   e Zd ZdZdeee ddddZedddZ	edd	d
Z
eeeef d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 k	r t|ts t|}|| _d S )N)parsed_tree
isinstancer#   r   r&   )selfr%   r&   r   r   r   __init__F   s    zSelector.__init__)r
   c             C   sB   t | jtrt| j}n| jr*d| j }nd}d| jj| j|f S )Nz::%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rZ|d}|S )z8Return a CSS representation for this selector (a string)z::%sr+   z%s%s   *)r(   r&   r#   	canonicalr'   lenlstrip)r)   r&   resr   r   r   r1   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

        r/   )r'   specificityr&   )r)   abcr   r   r   r5   v   s    zSelector.specificity)N)r   r   r   r   Treer   PseudoElementr*   strr.   r1   r   intr5   r   r   r   r   r$   ;   s
   		r$   c               @   sV   e Zd ZdZeeddddZedddZedd	d
Ze	e
e
e
f dddZdS )r   z(
    Represents selector.class_name
    N)selector
class_namer
   c             C   s   || _ || _d S )N)r=   r>   )r)   r=   r>   r   r   r   r*      s    zClass.__init__)r
   c             C   s   d| j j| j| jf S )Nz	%s[%r.%s])r-   r   r=   r>   )r)   r   r   r   r.      s    zClass.__repr__c             C   s   d| j  | jf S )Nz%s.%s)r=   r1   r>   )r)   r   r   r   r1      s    zClass.canonicalc             C   s"   | j  \}}}|d7 }|||fS )Nr/   )r=   r5   )r)   r6   r7   r8   r   r   r   r5      s    zClass.specificity)r   r   r   r   r9   r;   r*   r.   r1   r   r<   r5   r   r   r   r   r      s
   r   c               @   sR   e Zd ZdZeed dddZedddZee dd	d
Z	ed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.

    Token)name	argumentsc             C   s   t || _|| _d S )N)r   r@   rA   )r)   r@   rA   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   s   g | ]
}|j qS r   )value).0tokenr   r   r   
<listcomp>   s    z4FunctionalPseudoElement.__repr__.<locals>.<listcomp>)r-   r   r@   rA   )r)   r   r   r   r.      s    z FunctionalPseudoElement.__repr__c             C   s   dd | j D S )Nc             S   s   g | ]
}|j qS r   )type)rC   rD   r   r   r   rE      s    z:FunctionalPseudoElement.argument_types.<locals>.<listcomp>)rA   )r)   r   r   r   argument_types   s    z&FunctionalPseudoElement.argument_typesc             C   s$   d dd | jD }d| j|f S )Nr+   c             s   s   | ]}|  V  qd S )N)css)rC   rD   r   r   r   	<genexpr>   s    z4FunctionalPseudoElement.canonical.<locals>.<genexpr>z%s(%s))joinrA   r@   )r)   argsr   r   r   r1      s    z!FunctionalPseudoElement.canonicalN)r   r   r   r   r;   r   r*   r.   r   rG   r1   r   r   r   r   r#      s
   c               @   sn   e Zd ZdZeeed ddddZeddd	Ze	e dd
dZ
edddZeeeef dddZdS )r   z(
    Represents selector:name(expr)
    r?   N)r=   r@   rA   r
   c             C   s   || _ t|| _|| _d S )N)r=   r   r@   rA   )r)   r=   r@   rA   r   r   r   r*      s    
zFunction.__init__)r
   c             C   s$   d| j j| j| jdd | jD f S )Nz%s[%r:%s(%r)]c             S   s   g | ]
}|j qS r   )rB   )rC   rD   r   r   r   rE      s    z%Function.__repr__.<locals>.<listcomp>)r-   r   r=   r@   rA   )r)   r   r   r   r.      s
    zFunction.__repr__c             C   s   dd | j D S )Nc             S   s   g | ]
}|j qS r   )rF   )rC   rD   r   r   r   rE      s    z+Function.argument_types.<locals>.<listcomp>)rA   )r)   r   r   r   rG      s    zFunction.argument_typesc             C   s,   d dd | jD }d| j | j|f S )Nr+   c             s   s   | ]}|  V  qd S )N)rH   )rC   rD   r   r   r   rI      s    z%Function.canonical.<locals>.<genexpr>z	%s:%s(%s))rJ   rA   r=   r1   r@   )r)   rK   r   r   r   r1      s    zFunction.canonicalc             C   s"   | j  \}}}|d7 }|||fS )Nr/   )r=   r5   )r)   r6   r7   r8   r   r   r   r5      s    zFunction.specificity)r   r   r   r   r9   r;   r   r*   r.   r   rG   r1   r   r<   r5   r   r   r   r   r      s   r   c               @   sV   e Zd ZdZeeddddZedddZedd	d
Ze	e
e
e
f dddZdS )r   z#
    Represents selector:ident
    N)r=   identr
   c             C   s   || _ t|| _d S )N)r=   r   rL   )r)   r=   rL   r   r   r   r*      s    zPseudo.__init__)r
   c             C   s   d| j j| j| jf S )Nz	%s[%r:%s])r-   r   r=   rL   )r)   r   r   r   r.      s    zPseudo.__repr__c             C   s   d| j  | jf S )Nz%s:%s)r=   r1   rL   )r)   r   r   r   r1      s    zPseudo.canonicalc             C   s"   | j  \}}}|d7 }|||fS )Nr/   )r=   r5   )r)   r6   r7   r8   r   r   r   r5      s    zPseudo.specificity)r   r   r   r   r9   r;   r*   r.   r1   r   r<   r5   r   r   r   r   r      s
   r   c               @   sV   e Zd ZdZeeddddZedddZedd	d
Ze	e
e
e
f dddZdS )r   z.
    Represents selector:not(subselector)
    N)r=   subselectorr
   c             C   s   || _ || _d S )N)r=   rM   )r)   r=   rM   r   r   r   r*      s    zNegation.__init__)r
   c             C   s   d| j j| j| jf S )Nz%s[%r:not(%r)])r-   r   r=   rM   )r)   r   r   r   r.      s    zNegation.__repr__c             C   s2   | j  }t|dkr |d}d| j |f S )Nr/   r0   z
%s:not(%s))rM   r1   r2   r3   r=   )r)   subselr   r   r   r1      s    

zNegation.canonicalc             C   s6   | j  \}}}| j \}}}|| || || fS )N)r=   r5   rM   )r)   a1b1c1a2b2c2r   r   r   r5     s    zNegation.specificity)r   r   r   r   r9   r*   r;   r.   r1   r   r<   r5   r   r   r   r   r      s
   r   c               @   sV   e Zd ZdZededddZedddZedd	d
Z	e
eeef dddZdS )r   z.
    Represents selector:has(subselector)
    r?   )r=   
combinatorrM   c             C   s   || _ || _|| _d S )N)r=   rU   rM   )r)   r=   rU   rM   r   r   r   r*     s    zRelation.__init__)r
   c             C   s   d| j j| j| jf S )Nz%s[%r:has(%r)])r-   r   r=   rM   )r)   r   r   r   r.     s    zRelation.__repr__c             C   sZ   y| j d  }W n tk
r0   | j  }Y nX t|dkrH|d}d| j |f S )Nr   r/   r0   z
%s:has(%s))rM   r1   	TypeErrorr2   r3   r=   )r)   rN   r   r   r   r1     s    
zRelation.canonicalc             C   sd   | j  \}}}y| jd  \}}}W n$ tk
rL   | j \}}}Y nX || || || fS )N)r=   r5   rM   rV   )r)   rO   rP   rQ   rR   rS   rT   r   r   r   r5   "  s    zRelation.specificityN)r   r   r   r   r9   r$   r*   r;   r.   r1   r   r<   r5   r   r   r   r   r     s
   	r   c               @   sX   e Zd ZdZeee dddZedddZeddd	Z	e
eeef dd
dZdS )r    z/
    Represents selector:is(selector_list)
    )r=   selector_listc             C   s   || _ || _d S )N)r=   rX   )r)   r=   rX   r   r   r   r*   0  s    zMatching.__init__)r
   c             C   s"   d| j j| jdtt| jf S )Nz%s[%r:is(%s)]z, )r-   r   r=   rJ   mapr,   rX   )r)   r   r   r   r.   4  s    zMatching.__repr__c             C   sJ   g }x&| j D ]}| }||d qW d| j dtt|f S )Nr0   z	%s:is(%s)z, )rX   r1   appendr3   r=   rJ   rY   r;   )r)   selector_argumentssselargr   r   r   r1   ;  s
    zMatching.canonicalc             C   s   t dd | jD S )Nc             s   s   | ]}|  V  qd S )N)r5   )rC   xr   r   r   rI   C  s    z'Matching.specificity.<locals>.<genexpr>)maxrX   )r)   r   r   r   r5   B  s    zMatching.specificityN)r   r   r   r   r9   r   r*   r;   r.   r1   r   r<   r5   r   r   r   r   r    +  s
   r    c               @   sX   e Zd ZdZeee dddZedddZeddd	Z	e
eeef dd
dZdS )r!   zz
    Represents selector:where(selector_list)
    Same as selector:is(selector_list), but its specificity is always 0
    )r=   rX   c             C   s   || _ || _d S )N)r=   rX   )r)   r=   rX   r   r   r   r*   L  s    zSpecificityAdjustment.__init__)r
   c             C   s"   d| j j| jdtt| jf S )Nz%s[%r:where(%s)]z, )r-   r   r=   rJ   rY   r,   rX   )r)   r   r   r   r.   P  s    zSpecificityAdjustment.__repr__c             C   sJ   g }x&| j D ]}| }||d qW d| j dtt|f S )Nr0   z%s:where(%s)z, )rX   r1   rZ   r3   r=   rJ   rY   r;   )r)   r[   r\   r]   r   r   r   r1   W  s    zSpecificityAdjustment.canonicalc             C   s   dS )N)r   r   r   r   )r)   r   r   r   r5   a  s    z!SpecificityAdjustment.specificityN)r   r   r   r   r9   r   r*   r;   r.   r1   r   r<   r5   r   r   r   r   r!   F  s
   
r!   c               @   s   e Zd ZdZejeee eddddddZ	ejeee eedddddZ	eee eeed ddd	dZ	ed
ddZ
ed
ddZeeeef d
ddZdS )r   z>
    Represents selector[namespace|attrib operator value]
    ztyping.Literal["exists"]N)r=   	namespaceattriboperatorrB   r
   c             C   s   d S )Nr   )r)   r=   r`   ra   rb   rB   r   r   r   r*   j  s    	zAttrib.__init__r?   c             C   s   d S )Nr   )r)   r=   r`   ra   rb   rB   r   r   r   r*   u  s    c             C   s"   || _ || _|| _|| _|| _d S )N)r=   r`   ra   rb   rB   )r)   r=   r`   ra   rb   rB   r   r   r   r*   {  s
    )r
   c          	   C   sf   | 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 d S )Nz%s|%sexistsz
%s[%r[%s]]z%s[%r[%s %s %r]]r?   )	r`   ra   rb   r-   r   r=   typingcastrB   )r)   ra   r   r   r   r.     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 )Nz%s|%src   z%s%s%sr?   z%s[%s])	r`   ra   rb   rd   re   rB   rH   r=   r1   )r)   ra   opr   r   r   r1     s    
zAttrib.canonicalc             C   s"   | j  \}}}|d7 }|||fS )Nr/   )r=   r5   )r)   r6   r7   r8   r   r   r   r5     s    zAttrib.specificity)r   r   r   r   rd   overloadr9   r   r;   r*   r.   r1   r   r<   r5   r   r   r   r   r   e  s(   r   c               @   s`   e Zd ZdZdee ee ddddZedddZedd	d
Ze	e
e
e
f dddZdS )r   zU
    Represents namespace|element

    `None` is for the universal selector '*'

    N)r`   elementr
   c             C   s   || _ || _d S )N)r`   rh   )r)   r`   rh   r   r   r   r*     s    zElement.__init__)r
   c             C   s   d| j j|  f S )Nz%s[%s])r-   r   r1   )r)   r   r   r   r.     s    zElement.__repr__c             C   s"   | j pd}| jrd| j|f }|S )Nr0   z%s|%s)rh   r`   )r)   rh   r   r   r   r1     s    
zElement.canonicalc             C   s   | j r
dS dS d S )N)r   r   r/   )r   r   r   )rh   )r)   r   r   r   r5     s    zElement.specificity)NN)r   r   r   r   r   r;   r*   r.   r1   r   r<   r5   r   r   r   r   r     s
   r   c               @   sV   e Zd ZdZeeddddZedddZedd	d
Ze	e
e
e
f dddZdS )r   z 
    Represents selector#id
    N)r=   idr
   c             C   s   || _ || _d S )N)r=   ri   )r)   r=   ri   r   r   r   r*     s    zHash.__init__)r
   c             C   s   d| j j| j| jf S )Nz	%s[%r#%s])r-   r   r=   ri   )r)   r   r   r   r.     s    zHash.__repr__c             C   s   d| j  | jf S )Nz%s#%s)r=   r1   ri   )r)   r   r   r   r1     s    zHash.canonicalc             C   s"   | j  \}}}|d7 }|||fS )Nr/   )r=   r5   )r)   r6   r7   r8   r   r   r   r5     s    zHash.specificity)r   r   r   r   r9   r;   r*   r.   r1   r   r<   r5   r   r   r   r   r     s
   r   c               @   sT   e Zd ZeeeddddZedddZeddd	Zee	e	e	f dd
dZ
dS )r"   N)r=   rU   rM   r
   c             C   s"   |d k	st || _|| _|| _d S )N)AssertionErrorr=   rU   rM   )r)   r=   rU   rM   r   r   r   r*     s    zCombinedSelector.__init__)r
   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])rU   r-   r   r=   rM   )r)   Zcombr   r   r   r.     s    
zCombinedSelector.__repr__c             C   s6   | j  }t|dkr |d}d| j | j|f S )Nr/   r0   z%s %s %s)rM   r1   r2   r3   r=   rU   )r)   rN   r   r   r   r1     s    

zCombinedSelector.canonicalc             C   s6   | j  \}}}| j \}}}|| || || fS )N)r=   r5   rM   )r)   rO   rP   rQ   rR   rS   rT   r   r   r   r5     s    zCombinedSelector.specificity)r   r   r   r9   r;   r*   r.   r1   r   r<   r5   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]*$)rH   r
   c             C   s   t | }|r$tt|ddgS t| }|dk	r\ttt|dpHdd|dgS t| }|dk	rttt|dpd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.

    r/   )rh   N   )_el_rematchr$   r   group_id_rer   	_class_rer   TokenStreamtokenizesourcelistparse_selector_group)rH   rn   streamr   r   r   parse  s    

&
&rx   rr   )rw   r
   c             c   s@   |    x2tt|  V  |  dkr6|   |    q
P q
W d S )N)DELIM,)skip_whitespacer$   parse_selectorpeeknext)rw   r   r   r   rv   +  s    
rv   c             C   s   t | \}}xt|   |  }|dkr(P |r8td| |dddrbtt|  j	}|   nd}t | \}}t
|||}qW ||fS )N))EOFN)ry   rz   z4Got pseudo-element ::%s not at the end of a selector+>~rk   )parse_simple_selectorr{   r}   r   is_delimrd   re   r;   r~   rB   r"   )rw   resultr&   r}   rU   Znext_selectorr   r   r   r|   6  s     

r|   F)rw   inside_negationr
   c             C   s  |    t| j}|  }|jdks,|dkrv|jdkrB|  j}n|   d }|  dkrl|   |  }q~|}d }nd  }}t||}d }x|  }|jdks|	dddds|r|d	krP |rt
d
| |jdkrt|tt|  j}q|dkr|   t||  }q|dkr8|   td |  }q|dkrV|   t|| }q|dkrv|   |  dkr|   |  }|  dkr|   t|t| }q|  }| dkrt|}q|  dkrxt||}t|dkrt| jdkst| jdkr| jd jdkst| jdkr<| jd 	dst| jdkrn| jd jdkrn| jd 	dst
dq|   |    | dkr|rt
dt| dd\}	}
|  }|
rt
d|
|jf |d	krt
d|f t||	}n|| d kr t| \}}t|||}nT| d!krBt| }t||}n2| d"krdt| }t||}nt||t| }qt
d#|f qW t| j|krt
d#|  f ||fS )$NIDENT)ry   r0   )ry   |)Sr   rz   r   r   r   )ry   )z4Got pseudo-element ::%s not at the end of a selectorHASH)ry   .)ry   [)ry   :)ry   ()z
first-linezfirst-letterbeforeafterzPseudo[Element[*]:scope]rl      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 %sZhas)matchesiswherezExpected selector, got %s) r{   r2   usedr}   rF   r~   rB   next_ident_or_starr   r   r   r   rd   re   r;   r   
next_identparse_attribr#   parse_argumentsr   r   r,   r   posr   parse_relative_selectorr   parse_simple_selector_argumentsr    r!   r   )rw   r   Zselector_startr}   r`   rh   r   r&   rL   argumentZargument_pseudo_elementr~   rU   rA   	selectorsr   r   r   r   N  s    











  
r   r?   c             C   sV   g }xL|    |  }|jdks(|dkr4|| q|dkr@|S td|f qW d S )N)r   STRINGNUMBER))ry   r   )ry   -)ry   r   zExpected an argument, got %s)r{   r~   rF   rZ   r   )rw   rA   r~   r   r   r   r     s    r   c             C   s   |    d}|  }|dkr2|}|    |  }ntdddd}x\|jdksT|dkrh|tt|j7 }n*|d	krt|}||d fS t	d
|f |  }qBW d S )Nr+   ))ry   r   )ry   r   )ry   r   )ry   r   ry   rk   r   )r   )r   r   r   ))ry   r   )ry   r0   )ry   r   zExpected an argument, got %s)
r{   r~   r?   rF   rd   re   r;   rB   rx   r   )rw   rM   r~   rU   r   r   r   r   r     s     
r   c             C   s   g }x|t | d\}}|r&td|f |   |  }|dkrZ|   |   || q|dkrp|| P qtd|f qW |S )NTz'Got pseudo-element ::%s inside function))r   N)ry   rz   )ry   r   zExpected an argument, got %s)r   r   r{   r~   rZ   )rw   rA   r   r&   r~   r   r   r   r     s"    
r   )r=   rw   r
   c             C   s  |   | }|d kr6| dkr6td| f | dkrz|  | dkrhd }|  d}q|}| }d }nd  }}|d kr|   | }|dkrt| |tt	|dd S |dkrd}nN|
dd	d
dddr
| dkr
tt	|jd }|  ntd|f |   | }|jdkrBtd|f |   | }|dkrjtd|f t| |tt	|||S )N)ry   r   zExpected '|', got %s)ry   =z|=)ry   ]rc   r   ^$r0   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   rd   re   r;   r   rB   rF   )r=   rw   ra   r`   rf   r~   rB   r   r   r   r     sD    
$

r   )tokensr
   c             C   s   x| D ]}|j dkrtdqW ddd | D  }|dkrDdS |dkrPd	S |d
kr\dS d
|krpdt|fS |d
d\}}|sd}n&|dks|dkrt|d }nt|}|sd}n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.r+   c             s   s   | ]}t t|jV  qd S )N)rd   re   r;   rB   )rC   rD   r   r   r   rI   1  s    zparse_series.<locals>.<genexpr>Zodd)rl   r/   Zeven)rl   r   n)r/   r   r   r/   r   r   1)rF   
ValueErrorrJ   stripr<   split)r   rD   r\   r6   r7   Za_as_intZb_as_intr   r   r   parse_series&  s,    

r   c               @   s   e Zd ZU ejdeed dddZejdded dddZeee ed dddZed	d
dZ	ee
dddZeed< eed	ddZeee d	ddZed	ddZdS )r?   zAtyping.Literal["IDENT", "HASH", "STRING", "S", "DELIM", "NUMBER"])type_rB   r   r
   c             C   s   d S )Nr   )clsr   rB   r   r   r   r   __new__O  s    zToken.__new__ztyping.Literal["EOF"]Nc             C   s   d S )Nr   )r   r   rB   r   r   r   r   r   X  s    c             C   s   t | ||f}||_|S )N)tupler   r   )r   r   rB   r   objr   r   r   r   \  s    )r
   c             C   s   d| j | j| jf S )Nz<%s '%s' at %i>)rF   rB   r   )r)   r   r   r   r.   a  s    zToken.__repr__)valuesr
   c             G   s   | j dko| j|kS )Nry   )rF   rB   )r)   r   r   r   r   r   d  s    zToken.is_delimr   c             C   s   | d S )Nr   r   )r)   r   r   r   rF   i  s    z
Token.typec             C   s   | d S )Nr/   r   )r)   r   r   r   rB   m  s    zToken.valuec             C   s&   | j dkrt| jS tt| jS d S )Nr   )rF   r,   rB   rd   re   r;   )r)   r   r   r   rH   q  s    

z	Token.css)r   r   r   rd   rg   r;   r<   r   r   r.   boolr   __annotations__propertyrF   rB   rH   r   r   r   r   r?   N  s    
c               @   s*   e Zd Zed dddZedddZdS )EOFToken)r   r
   c          	   C   s   t dt| dd |S )Nr   r   )rd   re   r?   r   )r   r   r   r   r   r   y  s    zEOFToken.__new__)r
   c             C   s   d| j | jf S )Nz
<%s at %i>)rF   r   )r)   r   r   r   r.   |  s    zEOFToken.__repr__N)r   r   r   r<   r   r;   r.   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eeeed dddZdS )	MatchFunc.zre.Match[str])r	   r   endposr
   c             C   s   d S )Nr   )r)   r	   r   r   r   r   r   __call__  s    zMatchFunc.__call__N)..)r   r   r   r;   r<   r   r   r   r   r   r   r     s   r   )patternr
   c             C   s   t | tt t jjS )N)recompilevarsr   
IGNORECASErn   )r   r   r   r   _compile  s    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)ro   r/   zre.Match[str])rn   r
   c             C   s&   t | dd}|tjkrd}t|S )Nr/      i  )r<   ro   sys
maxunicodechr)rn   	codepointr   r   r   _replace_unicode  s    
r   )rB   r
   c             C   s   t t| } tt| } | S )N)_sub_unicode_escaper   _sub_simple_escape_replace_simple)rB   r   r   r   unescape_ident  s    

r   )r\   r
   c             c   s
  d}t | }x||k rt| |d}|rBtdd|V  | }qt| |d}|r~tttt|	 }td||V  | }qt
| |d}|rtttt|	 dd  }td||V  | }q| | }|tkr^t| | |d d}|std| }||krtd	| | | |kr,t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|}q|d7 }qtd| | |V  |d7 }qW ||kstt|V  d S )Nr   )r   r   rk   r   r/   r   z)Should have found at least an empty matchzUnclosed string at %szInvalid string at %sr+   r   r   rl   z/*z*/rW   ry   )r2   _match_whitespacer?   end_match_identr   r   r   r   ro   _match_hash_match_string_by_quoterj   r   _sub_newline_escape_match_numberfindr   )r\   r   Zlen_srn   rB   quoteend_pospos2r   r   r   rs     sl    


rs   c               @   sr   e Zd Zdee ee ddddZedddZeddd	Z	edd
dZ
ee dddZddddZdS )rr   N)r   rt   r
   c             C   s0   g | _ t|| _|| _d | _d| _| jj| _d S )NF)r   iterr   rt   peeked_peeking__next__
next_token)r)   r   rt   r   r   r   r*     s    
zTokenStream.__init__)r
   c             C   sL   | j r0d| _ | jtt| j tt| jS |  }| j| |S d S )NF)r   r   rZ   rd   re   r?   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   rd   re   r?   )r)   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~   rF   r   rd   re   r;   rB   )r)   r~   r   r   r   r     s    
zTokenStream.next_identc             C   s6   |   }|jdkr|jS |dkr$d S td|f d S )Nr   )ry   r0   zExpected ident or '*', got %s)r~   rF   rB   r   )r)   r~   r   r   r   r     s    
zTokenStream.next_ident_or_starc             C   s   |   }|jdkr|   d S )Nr   )r}   rF   r~   )r)   r}   r   r   r   r{   #  s    
zTokenStream.skip_whitespace)N)r   r   r   r   r?   r   r;   r*   r~   r}   r   r   r{   r   r   r   r   rr     s   
	)F)Hr   r   r   rb   rd   r   r   r   r   r   r   r   r;   r   	Exceptionr   SyntaxErrorr   r9   r:   r$   r   r#   r   r   r   r   r    r!   r   r   r   r"   r   rm   rp   rq   rx   rv   r|   r   r   r   r   r   r   r<   r   r?   r   r   TYPE_CHECKINGProtocolr   r   r   r   r   r   r   subr   r   Ir   r   methodcallerr   r   r   rs   rr   r   r   r   r   <module>   sr   $
G%#G


(r*(*	D