a
    QAbZ'                    @   sJ
  d dl Z d dlZd dlZd dlmZ d dlmZ g dZG dd deZ	G dd deZ
G dd	 d	eZG d
d deZG dd de jZe ej eZeeB ZeeB eB Zed eeiZeeB eB eB eB eB e B Z!ee"B e#B e$B e%B e&B Z'e(ej)Z*e(ej+Z,e*e,B Z-e(ej.Z/e(ej0Z1e(de(dgB Z2e-e(dB Z3e-e(dB Z4dZ5e6 Z7e7d Z8de8> d Z9eeeee"ee#ee e$eeee%e&dZ:ee"B Z;d Z<ee"B Z=ee=B Z>d d ed e"e"e=e=iZ?ddddZ@dZAG dd dZBeB ZCeDeAE D ]\ZFZGeHeCeGeF qdEddZIdd  ZJd!d" ZKd#d$ ZLd%d& ZMd'd( ZNd)d* ZOd+d, ZPdFd.d/ZQd0d1 ZRd2d3 ZSd4d5 ZTd6d7 ZUd8d9 ZVd:d; ZWd<d= ZXd>d?d@dAZYdBdC ZZdDdE Z[dFdG Z\dHdI Z]dJdK Z^dLdM Z_dNdO Z`dPdQ ZadRdS ZbdTdU ZcdVdW ZddXdY ZedZd[ Zfd\d] Zgd^d_ Zhd`da Zidbdc Zjddde Zkdfdg Zldhdi Zmdjdk Zndldm Zodndo Zpdpdq Zqdrds Zrdtdu Zsdvdw Ztdxdy ZudGdzd{Zvd|d} Zwd~d Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZedE ZedE ZdHddZdd Zdd Zdd Zdd ZdZdZdZdZdZdZdddZe<de"dede=diZdd ZG dd dZG ddĄ deZG ddƄ deZG ddȄ deZG ddʄ deZG dd̄ deZG dd΄ deZG ddЄ deZG dd҄ deZG ddԄ deZG ddք deZG dd؄ deZG ddڄ deZG dd܄ deZG ddބ deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG dd deZG dd deZG dd deZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deǃZG dd deǃZG dd deǃZG dd deǃZG dd deZG dd deZG dd de̓ZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eуZG d'd( d(eZG d)d* d*ZG d+d, d,ZՐd-d. Z֐d/d0 ZG d1d2 d2Ze١ Zi Zeڠܡ D ]n\Z\ZZe۠edi f\ZZeeeed3Zeefee< eߠܡ D ]&\ZZeeedeed3ee< 	q,qd4d5d6d7d8d9d:d;Zedd<d=edd<d-edd>d=edd?d=edd?d-edd@d=edd@d-dAZeσ e ed-e eЃ e e dBZeeZee ed-e e dC e e e ẽ dDZdS (I      N)defaultdict)%AASCIIB	BESTMATCHDDEBUGEENHANCEMATCHFFULLCASEI
IGNORECASELLOCALEM	MULTILINEPPOSIXRREVERSESDOTALLTTEMPLATEUUNICODEV0VERSION0V1VERSION1WWORDXVERBOSEerrorScanner	RegexFlagc                   @   s   e Zd ZdZdddZdS )r%   a  Exception raised for invalid regular expressions.

    Attributes:

        msg: The unformatted error message
        pattern: The regular expression pattern
        pos: The position in the pattern where compilation failed, or None
        lineno: The line number where compilation failed, unless pos is None
        colno: The column number where compilation failed, unless pos is None
    Nc                 C   s   t |trdnd}|| _|| _|| _|d ur|d ur||d|d | _|||d| | _d	||}||v r|d	| j| j7 }t
| | d S )N
   
r      z{} at position {}z (line {}, column {}))
isinstancestrmsgpatternposcountlinenorfindcolnoformat	Exception__init__)selfmessager.   r/   newline r:   0lib/python3.9/site-packages/regex/_regex_core.pyr6   *   s    
zerror.__init__)NN)__name__
__module____qualname____doc__r6   r:   r:   r:   r;   r%      s   r%   c                   @   s   e Zd ZdS )_UnscopedFlagSetNr<   r=   r>   r:   r:   r:   r;   r@   =   s   r@   c                   @   s   e Zd ZdS )
ParseErrorNrA   r:   r:   r:   r;   rB   A   s   rB   c                   @   s   e Zd ZdS )_FirstSetErrorNrA   r:   r:   r:   r;   rC   E   s   rC   c                   @   s   e Zd Zd ZZd ZZd ZZd Z	Z
d ZZd ZZd ZZd ZZd	 ZZd
 ZZd ZZd ZZd ZZd ZZd ZZ d Z!Z"d Z#Z$dd Z%e&j'Z'dS )r'      i   i   i   i @           i   i          i       i   @   r*   c                 C   s   | j d urd| j  S | j}g }|dk }|r0| }| jD ]*}||j@ r6||j M }|d|j   q6|rt|t| d|}|rt|dkrd| }nd| }|S )Nzregex.%sr   |r*   z~(%s)z~%s)_name__value_	__class__appendhexjoinlen)r7   valuemembersnegativemresr:   r:   r;   __repr__]   s&    





zRegexFlag.__repr__N)(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   r   r   r    r!   r"   r#   r$   r   r   rY   object__str__r:   r:   r:   r;   r'   I   s&   r'   z()|?*+{^$.[\# z -z &_-.)||~~&&--rG   r*   )abefir   rW   prsur   r   wxrE   rF   )rk   ri   r   a  
FAILURE
SUCCESS
ANY
ANY_ALL
ANY_ALL_REV
ANY_REV
ANY_U
ANY_U_REV
ATOMIC
BOUNDARY
BRANCH
CALL_REF
CHARACTER
CHARACTER_IGN
CHARACTER_IGN_REV
CHARACTER_REV
CONDITIONAL
DEFAULT_BOUNDARY
DEFAULT_END_OF_WORD
DEFAULT_START_OF_WORD
END
END_OF_LINE
END_OF_LINE_U
END_OF_STRING
END_OF_STRING_LINE
END_OF_STRING_LINE_U
END_OF_WORD
FUZZY
GRAPHEME_BOUNDARY
GREEDY_REPEAT
GROUP
GROUP_CALL
GROUP_EXISTS
KEEP
LAZY_REPEAT
LOOKAROUND
NEXT
PROPERTY
PROPERTY_IGN
PROPERTY_IGN_REV
PROPERTY_REV
PRUNE
RANGE
RANGE_IGN
RANGE_IGN_REV
RANGE_REV
REF_GROUP
REF_GROUP_FLD
REF_GROUP_FLD_REV
REF_GROUP_IGN
REF_GROUP_IGN_REV
REF_GROUP_REV
SEARCH_ANCHOR
SET_DIFF
SET_DIFF_IGN
SET_DIFF_IGN_REV
SET_DIFF_REV
SET_INTER
SET_INTER_IGN
SET_INTER_IGN_REV
SET_INTER_REV
SET_SYM_DIFF
SET_SYM_DIFF_IGN
SET_SYM_DIFF_IGN_REV
SET_SYM_DIFF_REV
SET_UNION
SET_UNION_IGN
SET_UNION_IGN_REV
SET_UNION_REV
SKIP
START_OF_LINE
START_OF_LINE_U
START_OF_STRING
START_OF_WORD
STRING
STRING_FLD
STRING_FLD_REV
STRING_IGN
STRING_IGN_REV
STRING_REV
FUZZY_EXT
c                   @   s   e Zd ZdS )	NamespaceNrA   r:   r:   r:   r;   rl     s   rl      c              	   C   s   t |  }t|| }|dk r$dS || | }ddl}t|dsFdS |||D ]"}	z
| |	= W qR tyr   Y qR0 qR|  i }
t | D ]N\}}}}}}|||||||f< z|||f |
||f< W q ty   Y q0 q|  ||
 dS )aC  Make room in the given cache.

    Args:
        cache_dict: The cache dictionary to modify.
        args_dict: The dictionary of named list args used by patterns.
        max_length: Maximum # of entries in cache_dict before it is shrunk.
        divisor: Cache will shrink to max_length - 1/divisor*max_length items.
    r   Nsample)	tuplekeysrS   randomhasattrrn   KeyErrorclearupdate)Z
cache_dictZ	args_dictZlocale_sensitiveZ
max_lengthZdivisorZ
cache_keysZoverageZnumber_to_tossrq   Z
doomed_keyZsensitivity_dictr.   Zpattern_typeflagsargsZdefault_versionZlocaler:   r:   r;   _shrink_cache  s.    

rx   c                 C   s(   | j }|t@ dkr|| jO }t||S )zFolds the case of a string.r   )rv   _ALL_ENCODINGSZguess_encoding_regex	fold_case)infostringrv   r:   r:   r;   
_fold_case>  s    
r~   c                 C   s   t t| j|dkS z$Checks whether a character is cased.r*   )rS   rz   get_all_casesrv   )r|   charr:   r:   r;   
is_cased_iF  s    r   c                 C   s   t t| |dkS r   )rS   rz   r   )rv   r   r:   r:   r;   
is_cased_fJ  s    r   c                 C   s,   t | jt@ }t| ||}|s"g S ||S )z&Compiles the firstset for the pattern.)boolrv   r   _check_firstsetcompile)r|   fsreverser:   r:   r;   _compile_firstsetN  s
    r   c                 C   s   |rd|v rdS t  }t}|D ]6}t|tr8|js8 dS ||jO }||jtd q|tt	B krfdS t
| t||t @ dd}|j| |dd}|S )z$Checks the firstset for the pattern.N
case_flagsTr   	zerowidthin_set)setNOCASEr+   	Characterpositiver   add
with_flagsr   r   SetUnionlistoptimise)r|   r   r   rU   r   re   r:   r:   r;   r   X  s     
r   c                 C   s   g }| D ]}| | q|S )z(Flattens the code from a list of tuples.)extend)codeZ	flat_codecr:   r:   r;   _flatten_codew  s    r   c                 C   s"   | j t@ }| j t@ r|t M }|S )zMakes the case flags.)rv   
CASE_FLAGSr   r   )r|   rv   r:   r:   r;   make_case_flags  s    


r   Fc                 C   s   |rt |S t |t| dS )zMakes a character literal.r   )r   r   )r|   rT   r   r:   r:   r;   make_character  s    r   c                 C   s   t | ||t| dS )zMakes a group reference.r   )RefGroupr   )r|   namepositionr:   r:   r;   make_ref_group  s    r   c                 C   s   t | |t| dS )zMakes a string set.r   )	StringSetr   )r|   r   r:   r:   r;   make_string_set  s    r   c                 C   s   |r|S |j t| dS )zMakes a property.r   )r   r   )r|   propr   r:   r:   r;   make_property  s    r   c                 C   sD   t | |g}| dr(|t | | qt|dkr<|d S t|S )zParses a pattern, eg. 'a|b|c'.rL   r*   r   )parse_sequencematchrP   rS   Branch)sourcer|   branchesr:   r:   r;   _parse_pattern  s    
r   c           	      C   sp  dg}t |}| j}|  }|tv rB|dv r<|| _qZqX|dkrZ|t| |d qX|dkrt| |}|du r~t |}n
|| qX|dkr|jt@ r|t	  n$|jt
@ r|t  n|t  qX|dkr|t| | qX|dkr>|jt@ r.|jt
@ r |t  n|t  n|t  qX|d	kr|jt@ r||jt
@ rn|t  n|t  n&|jt
@ r|t  n|t  n|d
v r*t| ||}|rt| |||||| |d nHt| |||}|rt| ||||| |d n|tt||d n|tt||d q|tt||d qdd |D }t|S )zParses a sequence, eg. 'abc'.Nz)|\F(.[^$z?*+{r   c                 S   s   g | ]}|d ur|qS Nr:   ).0itemr:   r:   r;   
<listcomp>      z"parse_sequence.<locals>.<listcomp>)r   r/   getSPECIAL_CHARSrP   parse_escapeparse_parenrv   r   AnyAllr"   AnyUAny	parse_setr   StartOfLineUStartOfLineStartOfString
EndOfLineU	EndOfLineEndOfStringLineUEndOfStringLineparse_quantifierapply_quantifierparse_fuzzyapply_constraintr   ordSequence)	r   r|   sequencer   	saved_poschelementcountsconstraintsr:   r:   r;   r     sr    









r   c                 C   s   |  }|d u r0|r"td| j|td| j|t|tttfrNtd| j||\}}	| j}|  }|dkrrt}
n|dkrt}
n
|| _t}
|	 s|dks|	dkr|
|||	}|
| d S )Nzmultiple repeatznothing to repeat?+r*   )popr%   r}   r+   GreedyRepeat
LazyRepeatPossessiveRepeatr/   r   is_emptyrP   )r   r|   r   r   r   r   r   r   	min_count	max_countZrepeatedr:   r:   r;   r     s&    r   c                 C   sV   |  }|d u rtd| j|t|trBt|j||_|| n|t|| d S )Nznothing for fuzzy constraint)r   r%   r}   r+   GroupFuzzy
subpatternrP   )r   r|   r   r   r   r   r   r:   r:   r;   r     s    
r   )r   r*   r   Nr*   N)r   *r   c                 C   s.   t |}|r|S |dkr*t| }|r*|S dS )zParses a quantifier.{N)_QUANTIFIERSr   parse_limited_quantifier)r   r|   r   qr   r:   r:   r;   r   .  s    
r   c                 C   s   | duo| t kS )z,Checks whether a count is above the maximum.N	UNLIMITEDr0   r:   r:   r;   is_above_limit=  s    r   c                 C   s   | j }t| }| dr>t| }t|p(d}|r8t|nd}n|sL|| _ dS t| }}| dsl|| _ dS t|s|t|rtd| j||dur||krtd| j|||fS )zParses a limited quantifier.,r   N}zrepeat count too bigz"min repeat greater than max repeat)r/   parse_countr   intr   r%   r}   )r   r   r   r   r:   r:   r;   r   A  s(    

r   c                 C   s   | j }|dkrdS i }z$t| | | dr8t| | q"W n tyT   || _ Y dS 0 | drpt| |||d< | dstd| j| j |S )z#Parses a fuzzy setting, if present.r   Nr   :testr   z
expected })r/   parse_fuzzy_itemr   rB   parse_fuzzy_testr%   r}   )r   r|   r   r   r   r   r:   r:   r;   r   _  s     



r   c                 C   s<   | j }zt| | W n" ty6   || _ t| | Y n0 dS )zParses a fuzzy setting item.N)r/   parse_cost_constraintrB   parse_cost_equation)r   r   r   r:   r:   r;   r   w  s    r   c           
      C   s:  | j }|  }|tv rzt| ||}t| }|du r<d||< n<| j }t| }|sV|d8 }|dk rltd| j|d|f||< n|tv r0|| _ | j }t| }t| }	|	du rt	 t| ||  }t| }|du rt	 | j }t| }|	s|d7 }|s|d8 }d|  kr|ks"n td| j|||f||< nt	 dS )zParses a cost constraint.Nr   r*   r   bad fuzzy cost limit)
r/   r   ALPHAparse_constraintparse_fuzzy_compareparse_cost_limitr%   r}   DIGITSrB   )
r   r   r   r   Z
constraintmax_inccost_posmax_costZmin_costZmin_incr:   r:   r;   r     sF    

r   c                 C   s>   | j }t| }z
t|W S  ty*   Y n0 td| j|dS )zParses a cost limit.r   N)r/   r   r   
ValueErrorr%   r}   )r   r   digitsr:   r:   r;   r     s    
r   c                 C   s    |dvrt  ||v rt  |S )zParses a constraint.Zdeis)rB   )r   r   r   r:   r:   r;   r     s
    r   c                 C   s$   |  drdS |  drdS dS dS )zParses a cost comparator.z<=T<FNr   r   r:   r:   r;   r     s
    

r   c                 C   s   d|v rt d| j| ji }t| | | dr<t| | q&t| }|du rRt tt| }|sj|d8 }|dk rt d| j| j||d< ||d< dS )	zParses a cost equation.costzmore than one cost equationr   Nr*   r   r   max)	r%   r}   r/   parse_cost_termr   r   rB   r   r   )r   r   r  r   r   r:   r:   r;   r     s     

r   c                 C   sJ   t | }|  }|dvrt ||v r6td| j| jt|p>d||< dS )zParses a cost equation term.diszrepeated fuzzy costr*   N)r   r   rB   r%   r}   r/   r   )r   r  coeffr   r:   r:   r;   r    s    r  c                 C   s   | j }|  }|tv r||dkr*t| |dS |dkrZ|jt@ rBt S |jt@ rRt S t	 S q|dkrlt
| |S td| j|n"|rtt||dS td| j|d S )Nr   Fr   r   zexpected character setr   )r/   r   r   r   rv   r   r   r"   r   r   r   r%   r}   r   r   )r   r|   r   r   r   r:   r:   r;   r     s"    


r   c                 C   s
   |  tS )z0Parses a quantifier's count, which can be empty.)	get_whiler   r  r:   r:   r;   r     s    r   c              	   C   s  | j }| d}|dkr| j }| d}|dkr| j }|  }|dv rZt| |d|dkS || _ t| }||}| d |j}z.t| |}	| d W ||_t|jt	@ | _
n||_t|jt	@ | _
0 |  t|||	S |dv rt| |d|dkS |d	krt| |S |d
krt| S |dkr2t| |S |dkrFt| |S |dkrZt| |S |dksd|  kr|dkrn nt| |||S |dkrt| ||S || _ t| |S |dkr| j }| jtddd}
|
dd  rt|
}|std| j|| d |S || _ | }|j}z.t| |}	| d W ||_t|jt	@ | _
n||_t|jt	@ | _
0 |  t|||	S )z[Parses a parenthesised subpattern or a flag. Returns FLAGS if it's an
    inline flag.
    Tr   r   =!r
  >)Fr   #r   rL   r   09&r   )>includeNr*   zunknown verb)r/   r   parse_lookaround
parse_name
open_groupexpectrv   r   r   r$   ignore_spaceclose_groupr   parse_extensionparse_commentparse_conditionalparse_atomicparse_commonparse_call_groupparse_call_named_groupparse_flags_subpatternr  r   isalphaVERBSr%   r}   )r   r|   r   r   Zsaved_pos_2Zsaved_pos_3r   groupsaved_flagsr   ZwordZverbr:   r:   r;   r   "  s~    














&





r   c              	   C   s
  | j }|  }|dkrt| }||}| d |j}z.t| |}| d W ||_t|jt@ | _	n||_t|jt@ | _	0 |
  t|||S |dkrt| dd}| d ||rtd| j|t|||S |dks|dkrt| ||S || _ td	| j|d
S )zParses a Python extension.r   r  r  r
  T)allow_numericcannot refer to an open groupr  unknown extensionN)r/   r   r  r  r  rv   r   r   r$   r  r  r   is_open_groupr%   r}   r   r!  )r   r|   r   r   r   r%  r&  r   r:   r:   r;   r  |  s8    




r  c                 C   sF   | j }| d}|r2|dkrq2|dkr | d}q || _ | d dS )zParses a comment.Tr  r   N)r/   r   r  )r   r   r   r:   r:   r;   r    s    

r  c              	   C   sZ   |j }z.t| |}| d W ||_ t|j t@ | _n||_ t|j t@ | _0 t|||S )zParses a lookaround.r  )rv   r   r  r   r$   r  
LookAround)r   r|   behindr   r&  r   r:   r:   r;   r    s    
r  c              	   C   s&  |j }| j}|  }|dkr~|  }|dv r>t| |d|dkS |dkrh|  }|dv rht| |d|dkS || _td| j| j|| _z^t| d}| d t| |}| 	d	rt| |}nt
 }| d W ||_ t|j t@ | _n||_ t|j t@ | _0 | r| rt
 S t|||||S )
z Parses a conditional subpattern.r   r	  Fr
  r   Tzexpected lookaround conditionalr  rL   )rv   r/   r   parse_lookaround_conditionalr%   r}   r  r  r   r   r   r   r$   r  r   Conditional)r   r|   r&  r   r   r%  
yes_branch	no_branchr:   r:   r;   r    sB    




r  c              	   C   s   |j }z.t| |}| d W ||_ t|j t@ | _n||_ t|j t@ | _0 t| |}| drnt| |}nt }| d t	|||||S )Nr  rL   )
rv   r   r  r   r$   r  r   r   r   LookAroundConditional)r   r|   r,  r   r&  r   r/  r0  r:   r:   r;   r-    s     




r-  c              	   C   sV   |j }z.t| |}| d W ||_ t|j t@ | _n||_ t|j t@ | _0 t|S )zParses an atomic subpattern.r  )rv   r   r  r   r$   r  Atomic)r   r|   r&  r   r:   r:   r;   r    s    
r  c                 C   sr   |j }t| |g}|j }| drF||_ |t| | t||j }q||_ | d t|dkrj|d S t|S )zParses a common groups branch.rL   r  r*   r   )group_countr   r   rP   r  r  rS   r   )r   r|   Zinitial_group_countr   Zfinal_group_countr:   r:   r;   r    s    

r  c                 C   s2   |dkrd}n||  t }| d t|||S )zParses a call to a group.r   r  r  )r  r   r  	CallGroup)r   r|   r   r/   r%  r:   r:   r;   r     s
    
r   c                 C   s   t | }| d t|||S )zParses a call to a named group.r  )r  r  r4  )r   r|   r/   r%  r:   r:   r;   r!  %  s    
r!  c                 C   sV   d}z4| j }|  }|dkr(||  7 }|t| O }qW n tyP   || _ Y n0 |S )zParses a set of inline flags.r   V)r/   r   REGEX_FLAGSrs   )r   rv   r   r   r:   r:   r;   parse_flag_set,  s    r7  c                 C   sJ   t | }| dr0t | }|s4td| j| jnd}|t@ rBd|_||fS )z!Parses flags being turned on/off.-z$bad inline flags: no flags after '-'r   T)r7  r   r%   r}   r/   r   inline_locale)r   r|   flags_on	flags_offr:   r:   r;   parse_flags<  s    
r<  c              	   C   st   |j }|j |B | @ |_ t|j t@ | _z.t| |}| d W ||_ t|j t@ | _n||_ t|j t@ | _0 |S )z&Parses a subpattern with scoped flags.r  )rv   r   r$   r  r   r  )r   r|   r:  r;  r&  r   r:   r:   r;   parse_subpatternM  s    
r=  c                 C   s   t | |\}}|t@ r&td| j| j||@ r>td| j| j||j @ t@ }|rj| j|O  _t|j|t M }| drt| |||S | drt	| ||| dS td| j| jdS )zParses a flags subpattern. It could be inline flags or a subpattern
    possibly with local flags. If it's a subpattern, then that's returned;
    if it's a inline flags, then None is returned.
    z-bad inline flags: cannot turn off global flagz(bad inline flags: flag turned on and offr   r  Nr)  )
r<  GLOBAL_FLAGSr%   r}   r/   global_flagsr@   r   r=  parse_positional_flags)r   r|   r:  r;  new_global_flagsr:   r:   r;   r"  [  s(    



r"  c                 C   sz   |j t@ pt}|tkrT|r*td| j| j||j @ }|rf| j|O  _t|jn|j |B | @ |_ t	|j t
@ | _dS )zParses positional flags.z'bad inline flags: cannot turn flags offN)rv   _ALL_VERSIONSDEFAULT_VERSIONr   r%   r}   r/   r?  r@   r   r$   r  )r   r|   r:  r;  versionrA  r:   r:   r;   r@  ~  s    r@  c                 C   sx   | j tddd}|s&td| j| j| r\|r6dnd}|rJt||k rttd| j| jn| sttd| j| j|S )zParses a name.r  Fr  zmissing group namer   r*   zbad character in group name)r  r   r%   r}   r/   isdigitr   isidentifier)r   r'  Zallow_group_0r   Z	min_groupr:   r:   r;   r    s    r  c                 C   s   t dd | D S )z!Checks whether a string is octal.c                 s   s   | ]}|t v V  qd S r   )
OCT_DIGITSr   r   r:   r:   r;   	<genexpr>  r   zis_octal.<locals>.<genexpr>allr}   r:   r:   r;   is_octal  s    rM  c                 C   s   t dd | D S )z#Checks whether a string is decimal.c                 s   s   | ]}|t v V  qd S r   )r   rH  r:   r:   r;   rI    r   zis_decimal.<locals>.<genexpr>rJ  rL  r:   r:   r;   
is_decimal  s    rN  c                 C   s   t dd | D S )z'Checks whether a string is hexadecimal.c                 s   s   | ]}|t v V  qd S r   )
HEX_DIGITSrH  r:   r:   r;   rI    r   z!is_hexadecimal.<locals>.<genexpr>rJ  rL  r:   r:   r;   is_hexadecimal  s    rP  c                 C   s  | j }d| _ |  }|| _ |s.td| j| j|tv rLt| ||t| ||S |dkr|s| j}zt| |W S  ty   || _Y n0 t|t	||S |dkr|st
 S |dkr|st| |S |dkrt| ||S |dv  rt| ||dk|S |d	kr|st S |tv r|s>|jt@ r*t|}n
t|}|r>|S t|}|rR|S t|}|rntt	|S td
| | j| jn(|tv rt| |||S t|t	||S dS )zParses an escape sequence.Fbad escape (end of pattern)gGr   NZpPrf   r#   bad escape \%sN)r  r   r%   r}   r/   HEX_ESCAPESparse_hex_escapeparse_group_refr   r   SearchAnchorparse_string_setparse_named_charparse_propertyGraphemer   rv   r"   WORD_POSITION_ESCAPESPOSITION_ESCAPESCHARSET_ESCAPESCHARACTER_ESCAPESr   r   parse_numeric_escape)r   r|   r   saved_ignorer   r   rT   r:   r:   r;   r     sT    






r   c           	      C   s   |s|dkrt | ||g|S |}| j}|  }|tv r||7 }| j}|  }t|r|tv r|jt@ }|tksv|t	kr|d}nd}t
|| d|@ }t||S || _||rtd| j| jt||| jS )z!Parses a numeric escape sequence.r       rG   r(  )parse_octal_escaper/   r   r   rM  rG  rv   ry   r   r   r   r   r*  r%   r}   r   )	r   r|   r   r   r   r   encoding
octal_maskrT   r:   r:   r;   rb    s(    


rb  c                 C   s   | j }|  }t|dk r<|tv r<|| | j }|  }q|| _ ztd|d}t|||W S  ty   |d tv rt	dd| | j
| j nt	d|d  | j
| j Y n0 dS )z Parses an octal escape sequence.   r\   rG   r   zincomplete escape \%srU  N)r/   r   rS   rG  rP   r   rR   r   r   r%   r}   )r   r|   r   r   r   r   rT   r:   r:   r;   rf    s$    

rf  c                 C   s   | j }g }t|D ]:}|  }	|	tvrBtd|d|f | j|||	 qztd|d}
W n t	yt   Y n0 |
dk rt
||
|S td|d|f | j|dS )zParses a hex escape sequence.incomplete escape \%s%sr\   rH   i   zbad hex escape \%s%sN)r/   ranger   rO  r%   rR   r}   rP   r   r   r   )r   r|   Zescexpected_lenr   typer   r   re   r   rT   r:   r:   r;   rW  (  s$    rW  c                 C   sJ   |  d | j}t| d}|  d ||r>td| j| jt|||S )zParses a group reference.r   Tr  r(  )r  r/   r  r*  r%   r}   r   )r   r|   r   r   r:   r:   r;   rX  ?  s    



rX  c                 C   sJ   |  d t| d}|  d |du s0||jvr@td| j| jt||S )zParses a string set reference.r   Tr  Nzundefined named list)r  r  kwargsr%   r}   r/   r   )r   r|   r   r:   r:   r;   rZ  J  s    


rZ  c                 C   sz   | j }| drd| t}| drdzt|}t|t||W S  tyb   t	d| j
| j Y n0 || _ t|td|S )zParses a named character.r   r   undefined character namerT  )r/   r   r  NAMED_CHAR_PARTunicodedatalookupr   r   rs   r%   r}   )r   r|   r   r   r   rT   r:   r:   r;   r[  T  s    




r[  c           
      C   s   | j }|  }|dkrV| d}t| \}}| dr|t||||k| }	t||	|S n&|r||dv r|td||| }	t||	|S || _ |rdnd}t|t||S )zParses a Unicode property.r   r   r   ZCLMNPSZNrf   r   )r/   r   r   parse_property_namelookup_propertyr   r   r   )
r   r|   r   r   r   r   negate	prop_namer   r   r:   r:   r;   r\  d  s    

r\  c                 C   sh   |  t}| j}|  }|rV|dv rV|}|  ttdB  }|rJ| j}qZd| }}nd}|| _||fS )z/Parses a property name, which may be qualified.z:=z &_-./N)r  PROPERTY_NAME_PARTr/   r   ALNUMr   strip)r   r   r   r   rv  r:   r:   r;   rs  y  s    
rs  c                 C   s   |j t@ pt}| j}d| _| d}zB|tkr:t| |}n
t| |}| ds^td| j	| j
W || _n|| _0 |r|j|j d}|jt|d}|S )zParses a character set.Fr   ]	missing ]r   r   )rv   rB  rC  r  r   r   parse_set_imp_unionparse_set_unionr%   r}   r/   r   r   r   )r   r|   rD  rc  ru  r   r:   r:   r;   r     s    


r   c                 C   sF   t | |g}| dr(|t | | qt|dkr<|d S t||S )zParses a set union ([x||y]).r]   r*   r   )parse_set_symm_diffr   rP   rS   r   r   r|   itemsr:   r:   r;   r~    s    
r~  c                 C   sF   t | |g}| dr(|t | | qt|dkr<|d S t||S )z+Parses a set symmetric difference ([x~~y]).r^   r*   r   )parse_set_interr   rP   rS   
SetSymDiffr  r:   r:   r;   r    s    
r  c                 C   sF   t | |g}| dr(|t | | qt|dkr<|d S t||S )z#Parses a set intersection ([x&&y]).r_   r*   r   )parse_set_diffr   rP   rS   SetInterr  r:   r:   r;   r    s    
r  c                 C   sF   t | |g}| dr(|t | | qt|dkr<|d S t||S )z!Parses a set difference ([x--y]).r`   r*   r   )r}  r   rP   rS   SetDiffr  r:   r:   r;   r    s    
r  c                    s   |j t@ pt}t |g} j} dr2| _qj|tkrXt fddtD rX| _qj|	t | qt
|dkr~|d S t||S )z#Parses a set implicit union ([xy]).rz  c                 3   s   | ]}  |V  qd S r   r  )r   opr  r:   r;   rI    r   z&parse_set_imp_union.<locals>.<genexpr>r*   r   )rv   rB  rC  parse_set_memberr/   r   r    anySET_OPSrP   rS   r   )r   r|   rD  r  r   r:   r  r;   r}    s    
r}  c                 C   s   t | |}| j}t|tr*|jr*| ds.|S |jt@ p:t}| j}|t	kr^| dr^|| _|S | dr|| _t
||ttdgS t | |}t|tr|jst
||ttd|gS |j|jkrtd| j| j|j|jkr|S t|j|jS )z#Parses a member in a character set.r8  rz  zbad character range)parse_set_itemr/   r+   r   r   r   rv   rB  rC  r    r   r   rT   r%   r}   Range)r   r|   startZ
saved_pos1rD  Z
saved_pos2endr:   r:   r;   r    s,    


r  c                 C   s   |j t@ pt}| dr$t| |dS | j}| drZzt| |W S  tyX   || _Y n0 |tkr| dr| d}t	| |}| dst
d| j| j|r|j|j d}|S |  }|st
d	| j| jtt|S )
z"Parses an item in a character set.r   Tz[:r   r   rz  r{  r|  zunterminated character set)rv   rB  rC  r   r   r/   parse_posix_classrB   r    r~  r%   r}   r   r   r   r   r   )r   r|   rD  r   ru  r   r   r:   r:   r;   r    s*    




r  c                 C   s:   |  d}t| \}}|  ds&t t||| | ddS )zParses a POSIX character class.r   z:]T)posix)r   rs  rB   rt  )r   r|   ru  rv  r   r:   r:   r;   r  7  s
    

r  c                 C   sD   t | }| | }t|dk r$|dfS td| \}}|| | |fS )z$Converts a float to a rational pair.g-C6?r*   g      ?)r   absfloat_to_rational)ZfltZint_partr%   dennumr:   r:   r;   r  @  s    r  c                 C   s   | dd dkr(| d | dd  }} nd}|  d}t|dkrdtt|d t|d  \}}n(t|dkrtt|d \}}nt d|||}|d	r|dd
 S |S )z<Converts a numeric string to a rational string, if possible.Nr*   r8  r   r\   /rE   z{}{}/{}z/1)splitrS   r  floatr   r4   endswith)numericZsignpartsr  r  resultr:   r:   r;   numeric_to_rationalK  s    
"
r  c              	   C   sD   zt d| W S  ttfy>   ddd | D   Y S 0 dS )z&Standardises a property or value name.r\   c                 s   s   | ]}|d vr|V  qdS )z_- Nr:   rH  r:   r:   r;   rI  e  r   z#standardise_name.<locals>.<genexpr>N)r  rR   r   ZeroDivisionErrorupper)r   r:   r:   r;   standardise_name`  s    r  zALNUM DIGIT PUNCT XDIGITzYES Y NO N TRUE T FALSE Fc           
      C   s  | rt | nd} t |}| |fdkr6dd|   } }}|rR| sR| tv rRd| }| rt| }|s|sptdtd|j|j|\}}||}|du r|stdtd|j|jt|d> |B |S d	D ]:} t| \}}||}|durt|d> |B |  S qt|}|rP|\}}t	|t
kr@t|d> d
B |S t|d> | S |drt|dd }|r|\}}d|v rt|d> d
B |S dD ]V\}	} ||	rt| \}}||dd }|durt|d> |B |  S q|stdtd|j|jdS )zLooks up a property.N)GENERALCATEGORYZASSIGNEDr  Z
UNASSIGNEDr   zunknown propertyzunknown property valuerH   )ZGCSCRIPTBLOCKr*   ISrE   ZYES))r  r  )INr  )r  r  _POSIX_CLASSES
PROPERTIESr   r%   r}   r/   Propertyr   _BINARY_VALUES
startswith)
propertyrT   r   r   r  r   prop_idZ
value_dictval_idprefixr:   r:   r;   rt  k  sZ    





rt  c                 C   s  |   }|tv rt |}|r,dt|gfS |tv rV|dks@|rVdt| t| |gfS |dkrndt| |gfS |dkr|rt| }|durd|gfS td| | j	| j
t| jtrd}nd	}|d
kr|}t|dk r| j
}|   }|tvr|| _
q||7 }qdt|d|@ gfS |tv r|}| j
}|   }|tv r||7 }| j
}|   }|rt|| rdt|| d|@ gfS || _
dt|gfS |dkrdtdgfS |std| j	| j
dtdt|gfS )z0Compiles a replacement template escape sequence.Frk   rR  TrT  NrU  rd  re  r  ri  rG   r   rQ  )r   r   ra  r   rV  parse_repl_hex_escapecompile_repl_groupparse_repl_named_charr%   r}   r/   r+   sepbytesrS   rG  r   r   rM  )r   r.   Z
is_unicoder   rT   rh  r   r   r:   r:   r;   _compile_replacement  sX    






r  c                 C   sZ   g }t |D ]<}|  }|tvr>td|d|f | j| j|| qtd|dS )z5Parses a hex escape sequence in a replacement string.rj  r\   rH   )	rk  r   rO  r%   rR   r}   r/   rP   r   )r   rl  rm  r   re   r   r:   r:   r;   r    s    r  c                 C   sn   | j }| drd| ttdB }| drdzt|}t|W S  tyb   t	d| j
| j Y n0 || _ dS )z1Parses a named character in a replacement string.r    r   ro  N)r/   r   r  r   r   rq  rr  r   rs   r%   r}   )r   r   r   rT   r:   r:   r;   r    s    




r  c                 C   s   |  d t| dd}|  d | r\t|}d|  krF|jksXn td| j| j|S z|j| W S  t	y   t
dY n0 dS )z0Compiles a replacement template group reference.r   Tr  r   invalid group referenceunknown groupN)r  r  rE  r   groupsr%   r}   r/   
groupindexrs   
IndexError)r   r.   r   indexr:   r:   r;   r    s    

r  z  rH   z	NON-MATCHZMATCHFTz SIMPLE_IGNORE_CASEz FULL_IGNORE_CASEc                 C   s   t | dkr| d S t| S Nr*   r   )rS   r   r  r:   r:   r;   make_sequence6  s    r  c                   @   s   e Zd Zdd Zd%ddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zd&ddZdd Zdd Zdd  Zd!d" Zd#d$ ZdS )'	RegexBasec                 C   s   | j | _d S r   )rO   _keyr7   r:   r:   r;   r6   =  s    zRegexBase.__init__Nc                 C   s|   |d u r| j }nt|}|d u r(| j}nt|t@  }|d u rD| j}nt|}|| j krn|| jkrn|| jkrn| S | |||S r   )r   r   r   CASE_FLAGS_COMBINATIONSr   r   rebuildr7   r   r   r   r:   r:   r;   r   @  s    zRegexBase.with_flagsc                 C   s   d S r   r:   r7   r.   r   fuzzyr:   r:   r;   
fix_groupsT  s    zRegexBase.fix_groupsc                 C   s   | S r   r:   r7   r|   r   r:   r:   r;   r   W  s    zRegexBase.optimisec                 C   s   | S r   r:   r7   r|   r:   r:   r;   pack_charactersZ  s    zRegexBase.pack_charactersc                 C   s   | S r   r:   r  r:   r:   r;   remove_captures]  s    zRegexBase.remove_capturesc                 C   s   dS NTr:   r  r:   r:   r;   	is_atomic`  s    zRegexBase.is_atomicc                 C   s   dS r  r:   r  r:   r:   r;   can_be_affixc  s    zRegexBase.can_be_affixc                 C   s   dS NFr:   r  r:   r:   r;   contains_groupf  s    zRegexBase.contains_groupc                 C   s
   t  d S r   )rC   r7   r   r:   r:   r;   get_firstseti  s    zRegexBase.get_firstsetc                 C   s   dS r  r:   r  r:   r:   r;   has_simple_startl  s    zRegexBase.has_simple_startFc                 C   s   |  ||S r   )_compiler7   r   r  r:   r:   r;   r   o  s    zRegexBase.compilec                 C   s   dS r  r:   r  r:   r:   r;   r   r  s    zRegexBase.is_emptyc                 C   s
   t | jS r   )hashr  r  r:   r:   r;   __hash__u  s    zRegexBase.__hash__c                 C   s   t | t |u o| j|jkS r   )rm  r  r7   otherr:   r:   r;   __eq__x  s    zRegexBase.__eq__c                 C   s   |  | S r   )r  r  r:   r:   r;   __ne__{  s    zRegexBase.__ne__c                 C   s   |   d fS r   	max_widthr  r:   r:   r;   get_required_string~  s    zRegexBase.get_required_string)NNN)FF)r<   r=   r>   r6   r   r  r   r  r  r  r  r  r  r  r   r   r  r  r  r  r:   r:   r:   r;   r  <  s"   

r  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )ZeroWidthBaseTc                 C   s&   t |  t|| _| j| jf| _d S r   )r  r6   r   r   rO   r  )r7   r   r:   r:   r;   r6     s    

zZeroWidthBase.__init__c                 C   s
   t d gS r   r   r  r:   r:   r;   r    s    zZeroWidthBase.get_firstsetc                 C   s6   d}| j r|tO }|r|tO }|r*|tO }| j|fgS Nr   )r   POSITIVE_OPFUZZY_OP
REVERSE_OP_opcoder7   r   r  rv   r:   r:   r;   r    s    zZeroWidthBase._compilec                 C   s"   t dt| | jt| j  d S )Nz{}{} {})printr4   INDENT_op_namePOS_TEXTr   r7   indentr   r:   r:   r;   dump  s    zZeroWidthBase.dumpc                 C   s   dS r  r:   r  r:   r:   r;   r    s    zZeroWidthBase.max_widthN)T)r<   r=   r>   r6   r  r  r  r  r:   r:   r:   r;   r    s
   

r  c                   @   s>   e Zd ZejejdZdZdd Zdd Z	dd Z
d	d
 ZdS )r   r  ANYc                 C   s   dS r  r:   r  r:   r:   r;   r    s    zAny.has_simple_startc                 C   s    d}|r|t O }| j| |fgS r  )r  r  r  r:   r:   r;   r    s    zAny._compilec                 C   s   t dt| | j d S )N{}{})r  r4   r  r  r  r:   r:   r;   r    s    zAny.dumpc                 C   s   dS Nr*   r:   r  r:   r:   r;   r    s    zAny.max_widthN)r<   r=   r>   OPr  ZANY_REVr  r  r  r  r  r  r:   r:   r:   r;   r     s   r   c                   @   s   e Zd ZejejdZdZdS )r   r  ANY_ALLN)r<   r=   r>   r  r  ZANY_ALL_REVr  r  r:   r:   r:   r;   r     s   r   c                   @   s   e Zd ZejejdZdZdS )r   r  ANY_UN)r<   r=   r>   r  r  Z	ANY_U_REVr  r  r:   r:   r:   r;   r     s   r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) r2  c                 C   s   t |  || _d S r   )r  r6   r   )r7   r   r:   r:   r;   r6     s    
zAtomic.__init__c                 C   s   | j ||| d S r   r   r  r  r:   r:   r;   r    s    zAtomic.fix_groupsc                 C   s$   | j ||| _ | j  r | j S | S r   )r   r   r   r  r:   r:   r;   r     s    
zAtomic.optimisec                 C   s   | j || _ | S r   r   r  r  r:   r:   r;   r    s    zAtomic.pack_charactersc                 C   s   | j  | _ | S r   r   r  r  r:   r:   r;   r    s    zAtomic.remove_capturesc                 C   s
   | j  S r   r   r  r  r:   r:   r;   r    s    zAtomic.can_be_affixc                 C   s
   | j  S r   r   r  r  r:   r:   r;   r    s    zAtomic.contains_groupc                 C   s   | j |S r   r   r  r  r:   r:   r;   r    s    zAtomic.get_firstsetc                 C   s
   | j  S r   r   r  r  r:   r:   r;   r    s    zAtomic.has_simple_startc                 C   s"   t jfg| j|| t jfg S r   )r  ATOMICr   r   ENDr  r:   r:   r;   r    s    zAtomic._compilec                 C   s(   t dt|  | j|d | d S )N{}ATOMICr*   )r  r4   r  r   r  r  r:   r:   r;   r    s    zAtomic.dumpc                 C   s
   | j  S r   r   r   r  r:   r:   r;   r     s    zAtomic.is_emptyc                 C   s   t | t |u o| j|jkS r   )rm  r   r  r:   r:   r;   r    s    zAtomic.__eq__c                 C   s
   | j  S r   r   r  r  r:   r:   r;   r    s    zAtomic.max_widthc                 C   s   | j |S r   r   r  r  r:   r:   r;   r    s    zAtomic.get_required_stringN)r<   r=   r>   r6   r  r   r  r  r  r  r  r  r  r  r   r  r  r  r:   r:   r:   r;   r2    s   r2  c                   @   s   e Zd ZejZdZdS )BoundaryBOUNDARYN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   r    s   r  c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Z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#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zed-d. Zed/d0 Zd1d2 Zd3d4 Zd5d6 Zd7S )8r   c                 C   s   t |  || _d S r   )r  r6   r   )r7   r   r:   r:   r;   r6     s    
zBranch.__init__c                 C   s   | j D ]}|||| qd S r   )r   r  )r7   r.   r   r  rb   r:   r:   r;   r    s    
zBranch.fix_groupsc                 C   s   | j stg S t||| j }|r8t||\}}g }nt||\}}g }t|||}t|dkrt|g}|rx|s| |||}|r|r|	| q|
d| n|}t|| | S r  )r   r   r   _flatten_branches_split_common_suffix_split_common_prefix_reduce_to_setrS   _add_precheckrP   insertr  )r7   r|   r   r   suffixr  r   Zfirstsetr:   r:   r;   r     s&    
zBranch.optimisec                 C   sh   t  }|rdnd}|D ]2}t|tu rB|jtkrB||j|  q d S q|sRd S t||dd |D S )Nr   c                 S   s   g | ]}t |qS r:   r   r   r   r:   r:   r;   r   -  r   z(Branch._add_precheck.<locals>.<listcomp>)r   rm  Literalr   r   r   
charactersr   )r7   r|   r   r   charsetr/   branchr:   r:   r;   r     s    zBranch._add_precheckc                    s    fdd| j D | _ | S )Nc                    s   g | ]}|  qS r:   )r  r   rb   r|   r:   r;   r   0  r   z*Branch.pack_characters.<locals>.<listcomp>r   r  r:   r  r;   r  /  s    zBranch.pack_charactersc                 C   s   dd | j D | _ | S )Nc                 S   s   g | ]}|  qS r:   r  r  r:   r:   r;   r   4  r   z*Branch.remove_captures.<locals>.<listcomp>r  r  r:   r:   r;   r  3  s    zBranch.remove_capturesc                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   r  r  r:   r:   r;   rI  8  r   z#Branch.is_atomic.<locals>.<genexpr>rK  r   r  r:   r:   r;   r  7  s    zBranch.is_atomicc                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   )r  r  r:   r:   r;   rI  ;  r   z&Branch.can_be_affix.<locals>.<genexpr>r  r  r:   r:   r;   r  :  s    zBranch.can_be_affixc                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   r  r  r:   r:   r;   rI  >  r   z(Branch.contains_group.<locals>.<genexpr>)r  r   r  r:   r:   r;   r  =  s    zBranch.contains_groupc                 C   s.   t  }| jD ]}|||O }q|p,t d gS r   )r   r   r  )r7   r   r   rb   r:   r:   r;   r  @  s    
zBranch.get_firstsetc                 C   sF   t jfg}| jD ]$}|||| |t jf qt jf|d< |S Nr  )r  BRANCHr   r   r   rP   NEXTr  )r7   r   r  r   rb   r:   r:   r;   r  G  s    

zBranch._compilec                 C   sb   t dt|  | jd |d | | jdd  D ]&}t dt|  ||d | q6d S )Nz{}BRANCHr   r*   {}OR)r  r4   r  r   r  )r7   r  r   rb   r:   r:   r;   r  Q  s
    zBranch.dumpc                 C   s@   g }|D ]2}| | |}t|tr0||j q|| q|S r   )r   r+   r   r   r   rP   )r|   r   r   new_branchesrb   r:   r:   r;   r  X  s    
zBranch._flatten_branchesc                    s  g }|D ](}t |tr$||j q||g qtdd |D }|d d|}|k r  rtfdd|D rd7 qT | jt@ rĈ  dkrt fdd|D sĈ d8  q dkrg |fS g }|D ]}|t	| d   q܈d   |fS )Nc                 s   s   | ]}t |V  qd S r   rS   r   ra   r:   r:   r;   rI  q  r   z.Branch._split_common_prefix.<locals>.<genexpr>r   c                 3   s   | ]}|    kV  qd S r   r:   r  )r/   r  r:   r;   rI  w  s   r*   c                 3   s   | ]}t | V  qd S r   )r   
_can_splitr  r   r:   r;   rI    r   
r+   r   rP   r  minr  rK  rv   r   r  r|   r   Zalternativesrb   r   Zend_posr  ra   r:   )r0   r/   r  r;   r  e  s4    
"


zBranch._split_common_prefixc                    s  g }|D ](}t |tr$||j q||g qtdd |D }|d dd| }|kr  rtfdd|D rd8 qXd  | jt@ rȈ dkrt fdd|D sȈ d8  q dkrg |fS g }|D ]}|t	|d     q  d  |fS )Nc                 s   s   | ]}t |V  qd S r   r  r  r:   r:   r;   rI    r   z.Branch._split_common_suffix.<locals>.<genexpr>r   r  c                 3   s   | ]}|    kV  qd S r   r:   r  )r/   r
  r:   r;   rI    s   r*   c                 3   s   | ]}t | V  qd S r   )r   _can_split_revr  r   r:   r;   rI    r   r!  r#  r:   )r0   r/   r
  r;   r    s2    
"


zBranch._split_common_suffixc                 C   s   t | |d sdS t | |s$dS t | |d |d  rBdS t | |d rpt | |d |d  rpdS t | |d rt | |d |d  rdS dS )Nr*   TFrE   )r   _is_full_case
_is_folded)r  r0   r:   r:   r;   r     s    zBranch._can_splitc                 C   s   t | }t| || sdS t| || d s4dS t| || d || d  rZdS t| || d rt| || d || d  rdS t| || d rt| || d || d  rdS dS )NTr*   FrE   )rS   r   r%  r&  )r  r0   r  r:   r:   r;   r$    s     "  zBranch._can_split_revc                 C   s   t t}i }g }|D ]}t|rH||j |g ||jt| qt|t	r|j
rt|j
d r||j
d j |j
 ||j
d jt| qt| |||| || qt| ||| |S r  )r   r   r   _is_simple_characterrT   rP   
setdefaultrS   r+   r   r  _flush_char_prefix)r|   r   r   prefixedorderr  rb   r:   r:   r;   _merge_common_prefixes  s$    
zBranch._merge_common_prefixesc                 C   s   t | to| jo| j S r   )r+   r   r   r   r   r:   r:   r;   r'  	  s    zBranch._is_simple_characterc                 C   s   g }t  }t}|D ]f}t|tttfr\|j|krHt| |||| |j}|	|j
td qt| |||| || qt| |||| |S )Nr   )r   r   r+   r   r  SetBaser   r   _flush_set_membersr   r   rP   )r|   r   r   r  r  r   rb   r:   r:   r;   r  	  s&    
zBranch._reduce_to_setc                    s   |sd S t |  fdddD ]\}}t|dkrH|t|d  q g }d}|D ]<}	t|	dkr||t|	dd   qT|sT|t  d}qTtt|t|g}
||
| | q |	   	  d S )Nc                    s    | d  S r  r:   )Zpairr+  r:   r;   <lambda>.	  s    z+Branch._flush_char_prefix.<locals>.<lambda>keyr*   r   FT)
sortedr  rS   rP   r  r   r   r   r   rt   )r|   r   r*  r+  r  rT   r   ZsubbranchesZoptionalrb   r   r:   r0  r;   r)  (	  s"     zBranch._flush_char_prefixc                 C   sV   |sd S t |dkr"t|d }nt| t|| |}||j|d |  d S )Nr*   r   r   )rS   r   r   r   rP   r   rt   )r|   r   r  r   r  r   r:   r:   r;   r/  B	  s    zBranch._flush_set_membersc                 C   sD   d|  krt | k sn dS | | }t|toB|joB|jt@ tkS )Nr   F)rS   r+   r   r   r   FULLIGNORECASE)r  re   r   r:   r:   r;   r%  Q	  s    zBranch._is_full_casec                 C   s   t | dk rdS | D ] }t|tr.|jr.|js dS qddd | D }tt|}t	 }|D ]}|tt|krb dS qbdS )NrE   Fr\   c                 s   s   | ]}t |jV  qd S r   )chrrT   r   re   r:   r:   r;   rI  d	  r   z$Branch._is_folded.<locals>.<genexpr>T)
rS   r+   r   r   r   rR   rz   r{   FULL_CASE_FOLDINGget_expand_on_folding)r  re   foldedexpanding_charsr   r:   r:   r;   r&  Z	  s    zBranch._is_foldedc                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   r   r  r:   r:   r;   rI  q	  r   z"Branch.is_empty.<locals>.<genexpr>r  r  r:   r:   r;   r   p	  s    zBranch.is_emptyc                 C   s   t | t |u o| j|jkS r   )rm  r   r  r:   r:   r;   r  s	  s    zBranch.__eq__c                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   r  r  r:   r:   r;   rI  w	  r   z#Branch.max_width.<locals>.<genexpr>)r  r   r  r:   r:   r;   r  v	  s    zBranch.max_widthN)r<   r=   r>   r6   r  r   r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r   r$  r,  r'  r  r)  r/  r%  r&  r   r  r  r:   r:   r:   r;   r     sN   #


)
(








r   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )r4  c                 C   s.   t |  || _|| _|| _| j| jf| _d S r   )r  r6   r|   r%  r   rO   r  )r7   r|   r%  r   r:   r:   r;   r6   z	  s
    
zCallGroup.__init__c                 C   s   zt | j| _W nH tyX   z| jj| j | _W n  tyR   td|| jY n0 Y n0 d| j  krt| jjksn td|| j| jdkr| jj	| j dkrtd|| j| jj
| ||f | j| jf| _d S )Nr  r   r  r*   zambiguous group reference)r   r%  r   r|   group_indexrs   r%   r   r3  open_group_countgroup_callsrP   rO   r  r  r:   r:   r;   r  	  s    zCallGroup.fix_groupsc                 C   s   t dt| jd S Nzgroup reference not allowedr%   r.   r   r  r:   r:   r;   r  	  s    zCallGroup.remove_capturesc                 C   s   t j| jfgS r   )r  Z
GROUP_CALLcall_refr  r:   r:   r;   r  	  s    zCallGroup._compilec                 C   s   t dt| | j d S )Nz{}GROUP_CALL {})r  r4   r  r%  r  r:   r:   r;   r  	  s    zCallGroup.dumpc                 C   s   t | t |u o| j|jkS r   )rm  r%  r  r:   r:   r;   r  	  s    zCallGroup.__eq__c                 C   s   t S r   r   r  r:   r:   r;   r  	  s    zCallGroup.max_widthc                 C   s
   d | _ d S r   r  r  r:   r:   r;   __del__	  s    zCallGroup.__del__N)r<   r=   r>   r6   r  r  r  r  r  r  rD  r:   r:   r:   r;   r4  y	  s   r4  c                   @   s   e Zd Zdd Zdd ZdS )CallRefc                 C   s   || _ || _d S r   )refparsed)r7   rF  rG  r:   r:   r;   r6   	  s    zCallRef.__init__c                 C   s&   t j| jfg| j|| t jfg S r   )r  CALL_REFrF  rG  r  r  r  r:   r:   r;   r  	  s
    zCallRef._compileNr<   r=   r>   r6   r  r:   r:   r:   r;   rE  	  s   rE  c                   @   s   e Zd Zedfejedfejedfeje	dfejedfej
edfejedfej
e	dfejiZdedfddZdd ZdddZd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )r   FTc                 C   s   t |  || _t|| _t| | _t|| _| jrX| jt@ tkrXt	
tt| j| _nt| j| _| j| j| j| j| jf| _d S r   )r  r6   rT   r   r   r  r   r   r5  rz   r{   r8  r6  r:  rO   r  r7   rT   r   r   r   r:   r:   r;   r6   	  s    



zCharacter.__init__c                 C   s   t | j|||S r   )r   rT   r  r:   r:   r;   r  	  s    zCharacter.rebuildc                 C   s   | S r   r:   r7   r|   r   r   r:   r:   r;   r   	  s    zCharacter.optimisec                 C   s
   t | gS r   r  r  r:   r:   r;   r  	  s    zCharacter.get_firstsetc                 C   s   dS r  r:   r  r:   r:   r;   r  	  s    zCharacter.has_simple_startc                 C   s   d}| j r|tO }| jr |tO }|r,|tO }t| j| j|f || jg}t	| j
dkrxt|tdd | j
D | jdg}|||S )Nr   r*   c                 S   s   g | ]}t |qS r:   r   r  r:   r:   r;   r   	  r   z&Character._compile.<locals>.<listcomp>r   )r   r  r   ZEROWIDTH_OPr  PrecompiledCoder  r   rT   rS   r:  r   Stringr   )r7   r   r  rv   r   r:   r:   r;   r  	  s    
zCharacter._compilec                 C   s<   t t| jd}tdt| t| j |t	| j
  d S )Nbuz{}CHARACTER {} {}{})asciir6  rT   lstripr  r4   r  r  r   	CASE_TEXTr   r7   r  r   displayr:   r:   r;   r  	  s    zCharacter.dumpc                 C   s   || j k| jkS r   )rT   r   r7   r   r:   r:   r;   matches	  s    zCharacter.matchesc                 C   s
   t | jS r   )rS   r:  r  r:   r:   r;   r  	  s    zCharacter.max_widthc                 C   s(   | j s
dS tdd | jD | _d| fS )Nr   c                 s   s   | ]}t |V  qd S r   rL  r  r:   r:   r;   rI  	  r   z0Character.get_required_string.<locals>.<genexpr>r   )r   ro   r:  folded_charactersr  r:   r:   r;   r  	  s    zCharacter.get_required_stringN)F)r<   r=   r>   r   r  	CHARACTERr   ZCHARACTER_IGNr   r5  ZCHARACTER_REVZCHARACTER_IGN_REVr  r6   r  r   r  r  r  r  rW  r  r  r:   r:   r:   r;   r   	  s,   


r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) r.  c                 C   s,   t |  || _|| _|| _|| _|| _d S r   )r  r6   r|   r%  yes_itemno_itemr   )r7   r|   r%  rZ  r[  r   r:   r:   r;   r6   	  s    
zConditional.__init__c                 C   s   zt | j| _W nZ tyj   z| jj| j | _W n2 tyd   | jdkrRd| _ntd|| jY n0 Y n0 d| j  kr| jjksn td|| j| j	
||| | j
||| d S )NZDEFINEr   r  r  )r   r%  r   r|   r>  rs   r%   r   r3  rZ  r  r[  r  r:   r:   r;   r  
  s    
zConditional.fix_groupsc                 C   s0   | j ||}| j||}t|| j||| jS r   )rZ  r   r[  r.  r%  r   )r7   r|   r   rZ  r[  r:   r:   r;   r   
  s    zConditional.optimisec                 C   s    | j || _ | j|| _| S r   )rZ  r  r[  r  r:   r:   r;   r  
  s    zConditional.pack_charactersc                 C   s   | j  | _ | j | _d S r   )rZ  r  r[  r  r:   r:   r;   r  "
  s    zConditional.remove_capturesc                 C   s   | j  o| j S r   )rZ  r  r[  r  r:   r:   r;   r  &
  s    zConditional.is_atomicc                 C   s   | j  o| j S r   )rZ  r  r[  r  r:   r:   r;   r  )
  s    zConditional.can_be_affixc                 C   s   | j  p| j S r   )rZ  r  r[  r  r:   r:   r;   r  ,
  s    zConditional.contains_groupc                 C   s   | j || j|B S r   )rZ  r  r[  r  r:   r:   r;   r  /
  s    

zConditional.get_firstsetc                 C   s^   t j| jfg}|| j|| | j||}|rL|t jf || |t j	f |S r   )
r  ZGROUP_EXISTSr%  r   rZ  r   r[  rP   r  r  r7   r   r  r   Zadd_coder:   r:   r;   r  3
  s    
zConditional._compilec                 C   sZ   t dt| | j | j|d | | j sVt dt|  | j|d | d S )Nz{}GROUP_EXISTS {}r*   r  )r  r4   r  r%  rZ  r  r[  r   r  r:   r:   r;   r  ?
  s
    
zConditional.dumpc                 C   s   | j  o| j S r   )rZ  r   r[  r  r:   r:   r;   r   F
  s    zConditional.is_emptyc                 C   s0   t | t |u o.| j| j| jf|j|j|jfkS r   )rm  r%  rZ  r[  r  r:   r:   r;   r  I
  s
    zConditional.__eq__c                 C   s   t | j | j S r   r  rZ  r  r[  r  r:   r:   r;   r  M
  s    zConditional.max_widthc                 C   s
   d | _ d S r   r  r  r:   r:   r;   rD  P
  s    zConditional.__del__N)r<   r=   r>   r6   r  r   r  r  r  r  r  r  r  r  r   r  r  rD  r:   r:   r:   r;   r.  	  s   r.  c                   @   s   e Zd ZejZdZdS )DefaultBoundaryDEFAULT_BOUNDARYN)r<   r=   r>   r  r_  r  r  r:   r:   r:   r;   r^  S
  s   r^  c                   @   s   e Zd ZejZdZdS )DefaultEndOfWordDEFAULT_END_OF_WORDN)r<   r=   r>   r  ra  r  r  r:   r:   r:   r;   r`  W
  s   r`  c                   @   s   e Zd ZejZdZdS )DefaultStartOfWordDEFAULT_START_OF_WORDN)r<   r=   r>   r  rc  r  r  r:   r:   r:   r;   rb  [
  s   rb  c                   @   s   e Zd ZejZdZdS )r   END_OF_LINEN)r<   r=   r>   r  rd  r  r  r:   r:   r:   r;   r   _
  s   r   c                   @   s   e Zd ZejZdZdS )r   END_OF_LINE_UN)r<   r=   r>   r  re  r  r  r:   r:   r:   r;   r   c
  s   r   c                   @   s   e Zd ZejZdZdS )EndOfStringEND_OF_STRINGN)r<   r=   r>   r  rg  r  r  r:   r:   r:   r;   rf  g
  s   rf  c                   @   s   e Zd ZejZdZdS )r   END_OF_STRING_LINEN)r<   r=   r>   r  rh  r  r  r:   r:   r:   r;   r   k
  s   r   c                   @   s   e Zd ZejZdZdS )r   END_OF_STRING_LINE_UN)r<   r=   r>   r  ri  r  r  r:   r:   r:   r;   r   o
  s   r   c                   @   s   e Zd ZejZdZdS )	EndOfWordEND_OF_WORDN)r<   r=   r>   r  rk  r  r  r:   r:   r:   r;   rj  s
  s   rj  c                   @   s   e Zd ZdZdd ZdS )FailureFAILUREc                 C   s
   t jfgS r   )r  rm  r  r:   r:   r;   r  z
  s    zFailure._compileNr<   r=   r>   r  r  r:   r:   r:   r;   rl  w
  s   rl  c                   @   sn   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )r   Nc                 C   s   t |  |d u ri }|| _|| _d|v rLdD ]}||d v r.||d q.t|td@ rtdD ]}||d q`ndD ]}||d qx|dd d|v rdD ]}|d |d qnddd|d d d|d< d S )	Nr  r  r   )r   r   rc   r   r*   )dre   rh   r  )r  r6   r   r   r(  r   )r7   r   r   rc   r:   r:   r;   r6   ~
  s*    

zFuzzy.__init__c                 C   s   | j ||d d S r  r  r  r:   r:   r;   r  
  s    zFuzzy.fix_groupsc                 C   s   | j || _ | S r   r  r  r:   r:   r;   r  
  s    zFuzzy.pack_charactersc                 C   s   | j  | _ | S r   r  r  r:   r:   r;   r  
  s    zFuzzy.remove_capturesc                 C   s
   | j  S r   r   r  r  r:   r:   r;   r  
  s    zFuzzy.is_atomicc                 C   s
   | j  S r   r  r  r:   r:   r;   r  
  s    zFuzzy.contains_groupc                 C   s  g }dD ]:}| j | }||d  ||d d u r8tn|d  qdD ]}|| j d |  qH| j d d }||d u rtn| d}|r|tO }| j d}|rtj|ft| g||d tj	fg | j
|d tjfg S tj|ft| g| j
|d tjfg S )	NZdiser   r*   r  r  r  r   T)r   rP   r   r  r   r  Z	FUZZY_EXTro   r   r  r   r  ZFUZZY)r7   r   r  Z	argumentsrc   vrv   r   r:   r:   r;   r  
  s8    
 
zFuzzy._compilec                 C   s>   |   }|rd| }tdt| | | j|d | d S )Nr  z	{}FUZZY{}r*   )_constraints_to_stringr  r4   r  r   r  )r7   r  r   r   r:   r:   r;   r  
  s
    z
Fuzzy.dumpc                 C   s
   | j  S r   r  r  r:   r:   r;   r   
  s    zFuzzy.is_emptyc                 C   s(   t | t |u o&| j|jko&| j|jkS r   )rm  r   r   r  r:   r:   r;   r  
  s
    
zFuzzy.__eq__c                 C   s   t S r   r   r  r:   r:   r;   r  
  s    zFuzzy.max_widthc           	      C   s   g }dD ]Z}| j | \}}|dkr$qd}|dkr:d|}||7 }|d urX|d|7 }|| qg }dD ],}| j d | }|dkrl|d|| ql| j d d }|d ur|dkrd	d
||}|| d|S )NZidsr   r\   z{}<=z<={}r  r  r  z{}<={}r   r   )r   r4   rP   rR   )	r7   r   r   r"  r  Zconr  r  limitr:   r:   r;   rr  
  s,    

zFuzzy._constraints_to_string)N)r<   r=   r>   r6   r  r  r  r  r  r  r  r   r  r  rr  r:   r:   r:   r;   r   }
  s   
#r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r]  c                 C   s(   t ttt dd t g}|||S r  )r2  r   r   r   GraphemeBoundaryr   )r7   r   r  Zgrapheme_matcherr:   r:   r;   r    s    zGrapheme._compilec                 C   s   t dt|  d S )Nz
{}GRAPHEME)r  r4   r  r  r:   r:   r;   r    s    zGrapheme.dumpc                 C   s   t S r   r   r  r:   r:   r;   r    s    zGrapheme.max_widthN)r<   r=   r>   r  r  r  r:   r:   r:   r;   r]    s   r]  c                   @   s   e Zd Zdd ZdS )rt  c                 C   s   t jdfgS r  )r  ZGRAPHEME_BOUNDARYr  r:   r:   r;   r     s    zGraphemeBoundary.compileN)r<   r=   r>   r   r:   r:   r:   r;   rt    s   rt  c                   @   s   e Zd ZejZdZdd Zdd Zdd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd S )!r   GREEDY_REPEATc                 C   s    t |  || _|| _|| _d S r   )r  r6   r   r   r   )r7   r   r   r   r:   r:   r;   r6     s    
zGreedyRepeat.__init__c                 C   s   | j ||| d S r   r  r  r:   r:   r;   r    s    zGreedyRepeat.fix_groupsc                 C   s"   | j ||}t| || j| jS r   )r   r   rm  r   r   r7   r|   r   r   r:   r:   r;   r   "  s    zGreedyRepeat.optimisec                 C   s   | j || _ | S r   r  r  r:   r:   r;   r  '  s    zGreedyRepeat.pack_charactersc                 C   s   | j  | _ | S r   r  r  r:   r:   r;   r  +  s    zGreedyRepeat.remove_capturesc                 C   s   | j | jko| j S r   )r   r   r   r  r  r:   r:   r;   r  /  s    zGreedyRepeat.is_atomicc                 C   s   dS r  r:   r  r:   r:   r;   r  2  s    zGreedyRepeat.can_be_affixc                 C   s
   | j  S r   r  r  r:   r:   r;   r  5  s    zGreedyRepeat.contains_groupc                 C   s$   | j |}| jdkr |d  |S r  )r   r  r   r   )r7   r   r   r:   r:   r;   r  8  s    

zGreedyRepeat.get_firstsetc                 C   s\   | j | jg}| jd u r"|t n|| j | j||}|sDg S t|g| tj	fg S r   )
r  r   r   rP   r   r   r   ro   r  r  )r7   r   r  repeatr   r:   r:   r;   r  ?  s    
zGreedyRepeat._compilec                 C   sH   | j d u rd}n| j }tdt| | j| j| | j|d | d S )NINF
{}{} {} {}r*   )r   r  r4   r  r  r   r   r  r7   r  r   rs  r:   r:   r;   r  L  s    
zGreedyRepeat.dumpc                 C   s
   | j  S r   r  r  r:   r:   r;   r   V  s    zGreedyRepeat.is_emptyc                 C   s0   t | t |u o.| j| j| jf|j|j|jfkS r   )rm  r   r   r   r  r:   r:   r;   r  Y  s    zGreedyRepeat.__eq__c                 C   s   | j d u rtS | j | j  S r   )r   r   r   r  r  r:   r:   r;   r  ^  s    
zGreedyRepeat.max_widthc                 C   sr   | j d u rtn| j }| jdkr:| j | }t|td fS | j|\}}|rV||fS | j | }t|td fS r  )r   r   r   r   r  r"  r  )r7   r   r   rj   ofsreqr:   r:   r;   r  d  s    
z GreedyRepeat.get_required_stringN)r<   r=   r>   r  ru  r  r  r6   r  r   r  r  r  r  r  r  r  r  r   r  r  r  r:   r:   r:   r;   r     s"   
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s   dS r  r:   r  r:   r:   r;   r  r  s    zPossessiveRepeat.is_atomicc                 C   sh   | j ||}|sg S | j| jg}| jd u r8|t n|| j tjft	|g| tj
ftj
fg S r   )r   r   r  r   r   rP   r   r  r  ro   r  )r7   r   r  r   rw  r:   r:   r;   r  u  s    
zPossessiveRepeat._compilec                 C   s^   t dt|  | jd u r"d}n| j}t dt|d  | j| j| | j|d | d S )Nr  rx  ry  r*   rE   )r  r4   r  r   r  r   r   r  rz  r:   r:   r;   r    s    
zPossessiveRepeat.dumpN)r<   r=   r>   r  r  r  r:   r:   r:   r;   r   q  s   r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!S )"r   c                 C   s&   t |  || _|| _|| _d | _d S r   )r  r6   r|   r%  r   rC  )r7   r|   r%  r   r:   r:   r;   r6     s
    
zGroup.__init__c                 C   s(   | ||f| j j| j< | j||| d S r   )r|   defined_groupsr%  r   r  r  r:   r:   r;   r    s    zGroup.fix_groupsc                 C   s   | j ||}t| j| j|S r   )r   r   r   r|   r%  rv  r:   r:   r;   r     s    zGroup.optimisec                 C   s   | j || _ | S r   r  r  r:   r:   r;   r    s    zGroup.pack_charactersc                 C   s
   | j  S r   r  r  r:   r:   r;   r    s    zGroup.remove_capturesc                 C   s
   | j  S r   rp  r  r:   r:   r;   r    s    zGroup.is_atomicc                 C   s   dS r  r:   r  r:   r:   r;   r    s    zGroup.can_be_affixc                 C   s   dS r  r:   r  r:   r:   r;   r    s    zGroup.contains_groupc                 C   s   | j |S r   r  r  r:   r:   r;   r    s    zGroup.get_firstsetc                 C   s
   | j  S r   r  r  r:   r:   r;   r    s    zGroup.has_simple_startc                 C   s   g }| j ||f}| jj|}|d ur6|tj|fg7 }| j  }}|dk r`| jj| }| jj| }|tjt	| ||fg| j
|| tjfg 7 }|d ur|tjfg7 }|S r  )r%  r|   	call_refsr   r  rH  private_groupsr3  ZGROUPr   r   r   r  )r7   r   r  r   r3  rF  Zpublic_groupZprivate_groupr:   r:   r;   r    s"    
zGroup._compilec                 C   s@   | j }|dk rt| }tdt| | | j|d | d S )Nr   z
{}GROUP {}r*   )r%  r  r  r4   r  r   r  )r7   r  r   r%  r:   r:   r;   r    s
    z
Group.dumpc                 C   s(   t | t |u o&| j| jf|j|jfkS r   )rm  r%  r   r  r:   r:   r;   r    s    
zGroup.__eq__c                 C   s
   | j  S r   r   r  r:   r:   r;   r    s    zGroup.max_widthc                 C   s   | j |S r   r  r  r:   r:   r;   r    s    zGroup.get_required_stringc                 C   s
   d | _ d S r   r  r  r:   r:   r;   rD    s    zGroup.__del__N)r<   r=   r>   r6   r  r   r  r  r  r  r  r  r  r  r  r  r  r  rD  r:   r:   r:   r;   r     s    r   c                   @   s   e Zd ZejZdZdS )KeepKEEPN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   r    s   r  c                   @   s   e Zd ZejZdZdS )r   LAZY_REPEATN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   r     s   r   c                   @   s   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd S )!r+  AHEADBEHINDr  c                 C   s(   t |  t|| _t|| _|| _d S r   )r  r6   r   r,  r   r   )r7   r,  r   r   r:   r:   r;   r6     s    


zLookAround.__init__c                 C   s   | j || j| d S r   )r   r  r,  r  r:   r:   r;   r    s    zLookAround.fix_groupsc                 C   s2   | j || j}| jr"| r"|S t| j| j|S r   )r   r   r,  r   r   r+  rv  r:   r:   r;   r     s    zLookAround.optimisec                 C   s   | j || _ | S r   r  r  r:   r:   r;   r    s    zLookAround.pack_charactersc                 C   s
   | j  S r   r  r  r:   r:   r;   r    s    zLookAround.remove_capturesc                 C   s
   | j  S r   rp  r  r:   r:   r;   r    s    zLookAround.is_atomicc                 C   s
   | j  S r   r  r  r:   r:   r;   r    s    zLookAround.can_be_affixc                 C   s
   | j  S r   r  r  r:   r:   r;   r    s    zLookAround.contains_groupc                 C   s&   | j r| j|kr| j|S td gS r   )r   r,  r   r  r   r  r:   r:   r;   r    s    zLookAround.get_firstsetc                 C   sX   d}| j r|tO }|r|tO }|r*|tO }tj|t| j fg| j	| j tj
fg S r  )r   r  r  r  r  Z
LOOKAROUNDr   r,  r   r   r  r  r:   r:   r;   r    s    zLookAround._compilec                 C   s<   t dt| | j| j t| j  | j|d | j d S )Nz{}LOOK{} {}r*   )	r  r4   r  	_dir_textr,  r  r   r   r  r  r:   r:   r;   r    s    zLookAround.dumpc                 C   s   | j o| j S r   )r   r   r   r  r:   r:   r;   r   "  s    zLookAround.is_emptyc                 C   s0   t | t |u o.| j| j| jf|j|j|jfkS r   )rm  r,  r   r   r  r:   r:   r;   r  %  s
    zLookAround.__eq__c                 C   s   dS r  r:   r  r:   r:   r;   r  )  s    zLookAround.max_widthN)r<   r=   r>   r  r6   r  r   r  r  r  r  r  r  r  r  r   r  r  r:   r:   r:   r;   r+    s   
r+  c                   @   s   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd S )!r1  r  r  r  c                 C   s4   t |  t|| _t|| _|| _|| _|| _d S r   )r  r6   r   r,  r   r   rZ  r[  )r7   r,  r   r   rZ  r[  r:   r:   r;   r6   /  s    


zLookAroundConditional.__init__c                 C   s4   | j ||| | j||| | j||| d S r   )r   r  rZ  r[  r  r:   r:   r;   r  7  s    z LookAroundConditional.fix_groupsc                 C   sD   | j || j}| j|| j}| j|| j}t| j| j|||S r   )r   r   r,  rZ  r[  r1  r   )r7   r|   r   r   rZ  r[  r:   r:   r;   r   <  s    zLookAroundConditional.optimisec                 C   s.   | j || _ | j|| _| j|| _| S r   )r   r  rZ  r[  r  r:   r:   r;   r  D  s    z%LookAroundConditional.pack_charactersc                 C   s(   | j  | _ | j | _| j | _d S r   )r   r  rZ  r[  r  r:   r:   r;   r  J  s    z%LookAroundConditional.remove_capturesc                 C   s   | j  o| j o| j S r   )r   r  rZ  r[  r  r:   r:   r;   r  O  s    zLookAroundConditional.is_atomicc                 C   s   | j  o| j o| j S r   )r   r  rZ  r[  r  r:   r:   r;   r  S  s    z"LookAroundConditional.can_be_affixc                 C   s   | j  p| j p| j S r   )r   r  rZ  r[  r  r:   r:   r;   r  W  s
    
z$LookAroundConditional.contains_groupc                 C   s   t jt| jt| j fg}|| j| j| |t j	f || j
|| | j||}|r~|t j	f || |t jf |S r   )r  ZCONDITIONALr   r   r,  r   r   r   rP   r  rZ  r[  r  r\  r:   r:   r;   r  [  s    
zLookAroundConditional._compilec                 C   s   t dt| | j| j t| j  | j|d | j t dt|  | j	|d | | j
 st dt|  | j
|d | d S )Nz{}CONDITIONAL {} {}r*   z{}EITHERr  )r  r4   r  r  r,  r  r   r   r  rZ  r[  r   r  r:   r:   r;   r  i  s    
zLookAroundConditional.dumpc                 C   s   | j  r| j p| j S r   )r   r   rZ  r[  r  r:   r:   r;   r   s  s    zLookAroundConditional.is_emptyc                 C   s0   t | t |u o.| j| j| jf|j|j|jfkS r   )rm  r   rZ  r[  r  r:   r:   r;   r  w  s
    zLookAroundConditional.__eq__c                 C   s   t | j | j S r   r]  r  r:   r:   r;   r  {  s    zLookAroundConditional.max_widthc                 C   s   |   d fS r   r  r  r:   r:   r;   r  ~  s    z)LookAroundConditional.get_required_stringN)r<   r=   r>   r  r6   r  r   r  r  r  r  r  r  r  r   r  r  r  r:   r:   r:   r;   r1  ,  s   

r1  c                   @   s   e Zd Zdd Zdd ZdS )rN  c                 C   s
   || _ d S r   )r   )r7   r   r:   r:   r;   r6     s    zPrecompiledCode.__init__c                 C   s   t | jgS r   )ro   r   r  r:   r:   r;   r    s    zPrecompiledCode._compileNrI  r:   r:   r:   r;   rN    s   rN  c                   @   s   e Zd Zedfejedfejedfeje	dfejedfej
edfejedfej
e	dfejiZdedfddZdd ZdddZd	d
 Zdd Zdd Zdd Zdd Zdd ZdS )r  FTc                 C   sL   t |  || _t|| _t| | _t|| _| j| j| j| j| jf| _	d S r   )
r  r6   rT   r   r   r  r   r   rO   r  rJ  r:   r:   r;   r6     s    



zProperty.__init__c                 C   s   t | j|||S r   )r  rT   r  r:   r:   r;   r    s    zProperty.rebuildc                 C   s   | S r   r:   rK  r:   r:   r;   r     s    zProperty.optimisec                 C   s
   t | gS r   r  r  r:   r:   r;   r    s    zProperty.get_firstsetc                 C   s   dS r  r:   r  r:   r:   r;   r    s    zProperty.has_simple_startc                 C   sF   d}| j r|tO }| jr |tO }|r,|tO }| j| j|f || jfgS r  )r   r  r   rM  r  r  r   rT   r  r:   r:   r;   r    s    zProperty._compilec              	   C   sT   t | jd?  }|d |d | jd@   }}tdt| t| j ||t| j  d S )NrH   r   r*   i  z{}PROPERTY {} {}:{}{})	PROPERTY_NAMESrT   r  r4   r  r  r   rS  r   )r7   r  r   r   r   rT   r:   r:   r;   r    s
    zProperty.dumpc                 C   s   t | j|| jkS r   )rz   Zhas_property_valuerT   r   rV  r:   r:   r;   rW    s    zProperty.matchesc                 C   s   dS r  r:   r  r:   r:   r;   r    s    zProperty.max_widthN)F)r<   r=   r>   r   r  ZPROPERTYr   ZPROPERTY_IGNr   r5  ZPROPERTY_REVZPROPERTY_IGN_REVr  r6   r  r   r  r  r  r  rW  r  r:   r:   r:   r;   r    s&   


r  c                   @   s   e Zd ZdZdd ZdS )PrunePRUNEc                 C   s
   t jfgS r   )r  r  r  r:   r:   r;   r    s    zPrune._compileNrn  r:   r:   r:   r;   r    s   r  c                   @   s   e Zd Zedfejedfejedfeje	dfejedfej
edfejedfej
e	dfejiZdZdedfddZdd Zddd	Zd
d Zdd Zdd Zdd ZdS )r  FTRANGEc                 C   sV   t |  || _|| _t|| _t| | _t|| _| j	| j| j| j| j| jf| _
d S r   )r  r6   lowerr  r   r   r  r   r   rO   r  )r7   r  r  r   r   r   r:   r:   r;   r6     s    



zRange.__init__c                 C   s   t | j| j|||S r   )r  r  r  r  r:   r:   r;   r    s    zRange.rebuildc                 C   s   | j r| jt@ r|r| S |jt@ r0| jt@ tkr4| S t }g }|D ]N}| jt	|  krd| j
krDn qDtt|}|tdd |D | jd qD|s| S t|| j
| j d k r|d|  t|S )Nc                 S   s   g | ]}t |qS r:   rL  r  r:   r:   r;   r     r   z"Range.optimise.<locals>.<listcomp>r   r*   r   )r   r   r   rv   r   r5  rz   r9  r  r   r  r{   r8  rP   rO  rS   r	  r   )r7   r|   r   r   r;  r  r   r:  r:   r:   r;   r     s&     
zRange.optimisec                 C   sJ   d}| j r|tO }| jr |tO }|r,|tO }| j| j|f || j| jfgS r  )	r   r  r   rM  r  r  r   r  r  r  r:   r:   r;   r    s    zRange._compilec              	   C   sR   t t| jd}t t| jd}tdt| t| j	 ||t
| j  d S )NrP  z{}RANGE {} {} {}{})rQ  r6  r  rR  r  r  r4   r  r  r   rS  r   )r7   r  r   Zdisplay_lowerZdisplay_upperr:   r:   r;   r    s    z
Range.dumpc                 C   s"   | j |  ko| jkn  | jkS r   )r  r  r   rV  r:   r:   r;   rW  	  s    zRange.matchesc                 C   s   dS r  r:   r  r:   r:   r;   r    s    zRange.max_widthN)F)r<   r=   r>   r   r  r  r   Z	RANGE_IGNr   r5  Z	RANGE_REVZRANGE_IGN_REVr  r  r6   r  r   r  r  rW  r  r:   r:   r:   r;   r    s   

r  c                   @   s   e Zd Zedfejedfejedfeje	dfej
edfejedfejedfeje	dfejiZefddZdd Zdd Zd	d
 Zdd Zdd Zdd ZdS )r   FTc                 C   s<   t |  || _|| _|| _t| | _| j| j| jf| _d S r   )	r  r6   r|   r%  r   r  r   rO   r  )r7   r|   r%  r   r   r:   r:   r;   r6     s    

zRefGroup.__init__c                 C   s   zt | j| _W nH tyX   z| jj| j | _W n  tyR   td|| jY n0 Y n0 d| j  krt| jjksn td|| j| j	| j| j
f| _d S )Nr  r*   r  )r   r%  r   r|   r>  rs   r%   r   r3  rO   r   r  r  r:   r:   r;   r    s    zRefGroup.fix_groupsc                 C   s   t dt| jd S rA  rB  r  r:   r:   r;   r  -  s    zRefGroup.remove_capturesc                 C   s*   d}|r|t O }| j| j|f || jfgS r  )r  r  r   r%  r  r:   r:   r;   r  0  s    zRefGroup._compilec                 C   s"   t dt| | jt| j  d S )Nz{}REF_GROUP {}{})r  r4   r  r%  rS  r   r  r:   r:   r;   r  6  s    zRefGroup.dumpc                 C   s   t S r   r   r  r:   r:   r;   r  :  s    zRefGroup.max_widthc                 C   s
   d | _ d S r   r  r  r:   r:   r;   rD  =  s    zRefGroup.__del__N)r<   r=   r>   r   r  Z	REF_GROUPr   ZREF_GROUP_IGNr   r5  ZREF_GROUP_FLDZREF_GROUP_REVZREF_GROUP_IGN_REVZREF_GROUP_FLD_REVr  r6   r  r  r  r  r  rD  r:   r:   r:   r;   r     s"   
	r   c                   @   s   e Zd ZejZdZdS )rY  SEARCH_ANCHORN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   rY  @  s   rY  c                   @   s   e Zd Zd(ddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zedd Zedd Zedd Zd d! Zd"d# Zd$d% Zd&d' ZdS ))r   Nc                 C   s    t |  |d u rg }|| _d S r   )r  r6   r  )r7   r  r:   r:   r;   r6   E  s    
zSequence.__init__c                 C   s   | j D ]}|||| qd S r   )r  r  )r7   r.   r   r  rh   r:   r:   r;   r  L  s    
zSequence.fix_groupsc                 C   sF   g }| j D ]2}|||}t|tr2||j  q
|| q
t|S r   )r  r   r+   r   r   rP   r  )r7   r|   r   r  rh   r:   r:   r;   r   P  s    

zSequence.optimisec                    s
  g }g }t }| jD ]}t|tu rn|jrn|jsn|j|kr`|jsJt |jr`t	
 ||| |j}||j qt|tu st|tu r|j|kr|jst fdd|D rt	
 ||| |j}||j qt	
 ||| ||  qt	
 ||| t|S )z+Packs sequences of characters into strings.c                 3   s   | ]}t  |V  qd S r   r   r  r  r:   r;   rI  q  r   z+Sequence.pack_characters.<locals>.<genexpr>)r   r  rm  r   r   r   r   r   rT   r   _flush_charactersrP   rO  r  r  r   r  r  r  )r7   r|   r  r  r   rh   r:   r  r;   r  \  s4    


zSequence.pack_charactersc                 C   s   dd | j D | _ | S )Nc                 S   s   g | ]}|  qS r:   r  r   rh   r:   r:   r;   r     r   z,Sequence.remove_captures.<locals>.<listcomp>r  r  r:   r:   r;   r    s    zSequence.remove_capturesc                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   r  r  r:   r:   r;   rI    r   z%Sequence.is_atomic.<locals>.<genexpr>rK  r  r  r:   r:   r;   r    s    zSequence.is_atomicc                 C   s   dS r  r:   r  r:   r:   r;   r    s    zSequence.can_be_affixc                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   r  r  r:   r:   r;   rI    r   z*Sequence.contains_group.<locals>.<genexpr>)r  r  r  r:   r:   r;   r    s    zSequence.contains_groupc                 C   sX   t  }| j}|r|  |D ],}|||O }d |vr>|  S |d  q|t d gB S r   )r   r  r   r  discard)r7   r   r   r  rh   r:   r:   r;   r    s    zSequence.get_firstsetc                 C   s   t | jo| jd  S r  )r   r  r  r  r:   r:   r;   r    s    zSequence.has_simple_startc                 C   s<   | j }|r|d d d }g }|D ]}|||| q |S r  )r  r   r   )r7   r   r  seqr   rh   r:   r:   r;   r    s    zSequence._compilec                 C   s   | j D ]}||| qd S r   )r  r  )r7   r  r   rh   r:   r:   r;   r    s    
zSequence.dumpc                    s   |sd S |t @ r*t fdd|D s*t}|t@ tkrt|}|D ]D}|j}t|dkrt|t	|d |j
d qD|t||j
d qDn6t|dkr|t	|d |d n|t||d g |d d < d S )Nc                 3   s   | ]}t  |V  qd S r   r  r  r  r:   r;   rI    r   z-Sequence._flush_characters.<locals>.<genexpr>r*   r   r   )r   r  r   r5  r   _fix_full_casefoldr  rS   rP   r   r   rO  )r|   r  r   r  literalsr   charsr:   r  r;   r    s     
zSequence._flush_charactersc           
      C   s   dd t  D }t tddd | D  }g }|D ]>}||}|dkr:|||t| f |||d }qHq:d}g }t	
|D ]H\}}	||k r|t| || td |t| ||	 td |	}q|t| k r|t| |d  td |S )	Nc                 S   s   g | ]}t t|qS r:   )rz   r{   r8  r  r:   r:   r;   r     r   z/Sequence._fix_full_casefold.<locals>.<listcomp>r\   c                 s   s   | ]}t |V  qd S r   r6  r  r:   r:   r;   rI    s   z.Sequence._fix_full_casefold.<locals>.<genexpr>r   r*   r   )rz   r9  r{   r8  rR   r  findrP   rS   r   _merge_chunksr  r   r5  )
r  Zexpandedr}   chunksrc   foundr/   r  r  r  r:   r:   r;   r    s4    
zSequence._fix_full_casefoldc                 C   s|   t | dk r| S |   | d \}}g }| dd  D ]4\}}||krPt||}q4|||f || }}q4|||f |S )NrE   r   r*   )rS   sortr  rP   )r  r  r  Z
new_chunksrh   rc   r:   r:   r;   r    s    zSequence._merge_chunksc                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   r<  r7  r:   r:   r;   rI    r   z$Sequence.is_empty.<locals>.<genexpr>r  r  r:   r:   r;   r     s    zSequence.is_emptyc                 C   s   t | t |u o| j|jkS r   )rm  r  r  r:   r:   r;   r    s    zSequence.__eq__c                 C   s   t dd | jD S )Nc                 s   s   | ]}|  V  qd S r   r  r  r:   r:   r;   rI    r   z%Sequence.max_width.<locals>.<genexpr>)sumr  r  r:   r:   r;   r    s    zSequence.max_widthc                 C   sT   | j }|r|d d d }d}|D ]*}||\}}||7 }|r ||f  S q |d fS )Nr  r   )r  r  )r7   r   r  offsetrh   r{  r|  r:   r:   r;   r  
  s    zSequence.get_required_string)N)r<   r=   r>   r6   r  r   r  r  r  r  r  r  r  r  r  r=  r  r  r  r   r  r  r  r:   r:   r:   r;   r   D  s,   
&

!
r   c                   @   s\   e Zd ZdedfddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )r.  TFc                 C   s\   t |  || _t|| _t|| _t| | _t|| _	d| _
| j| j| j| j| j	f| _d S r  )r  r6   r|   ro   r  r   r   r  r   r   Z
char_widthrO   r  )r7   r|   r  r   r   r   r:   r:   r;   r6     s    




zSetBase.__init__c                 C   s"   t | | j| j|||| jdS r  )rm  r|   r  r   r  r:   r:   r;   r  (  s
    zSetBase.rebuildc                 C   s
   t | gS r   r  r  r:   r:   r;   r  ,  s    zSetBase.get_firstsetc                 C   s   dS r  r:   r  r:   r:   r;   r  /  s    zSetBase.has_simple_startc                 C   sn   d}| j r|tO }| jr |tO }|r,|tO }| j| j|f |fg}| jD ]}||	  qH|
tjf |S r  )r   r  r   rM  r  r  r   r  r   r   rP   r  r  )r7   r   r  rv   r   rW   r:   r:   r;   r  2  s    
zSetBase._compilec                 C   sF   t dt| | jt| j t| j  | jD ]}|	|d | q,d S )Nz	{}{} {}{}r*   )
r  r4   r  r  r  r   rS  r   r  r  )r7   r  r   re   r:   r:   r;   r  B  s
    
zSetBase.dumpc                 C   s   | j r| jt@ r|r| S | jjt@ r2| jt@ tkr6| S t }g }t	 }|D ]N}| 
t|rLtt|}||vrL|tdd |D | jd || qL|s| S t| g| S )Nc                 S   s   g | ]}t |qS r:   rL  r  r:   r:   r;   r   \  r   z0SetBase._handle_case_folding.<locals>.<listcomp>r   )r   r   r   r|   rv   r   r5  rz   r9  r   rW  r   r{   r8  rP   rO  r   r   )r7   r|   r   r;  r  seenr   r:  r:   r:   r;   _handle_case_foldingH  s,    zSetBase._handle_case_foldingc                 C   s   | j r| jt@ sdS | jjt@ r.| jt@ tkr2dS t }t	 }|D ](}| 
t|rDtt|}|| qD|svdS tdd |D S )Nr*   c                 s   s   | ]}t |V  qd S r   r  )r   r:  r:   r:   r;   rI  }  r   z$SetBase.max_width.<locals>.<genexpr>)r   r   r   r|   rv   r   r5  rz   r9  r   rW  r   r{   r8  r   r  )r7   r;  r  r   r:  r:   r:   r;   r  f  s"    zSetBase.max_widthc                 C   s
   d | _ d S r   r  r  r:   r:   r;   rD    s    zSetBase.__del__N)r<   r=   r>   r   r6   r  r  r  r  r  r  r  rD  r:   r:   r:   r;   r.    s   
r.  c                   @   sv   e Zd Zedfejedfejedfeje	dfejedfej
edfejedfej
e	dfejiZdZd	ddZdd ZdS )
r  FTSET_DIFFc                    s~   | j }t|dkr,|d t |dd  g}t|dkrX|d j| j| jd |S t fdd|D | _ |  |S )NrE   r   r*   r   c                 3   s   | ]}|j  d dV  qdS )Tr   N)r   )r   rW   r|   r   r:   r;   rI    r   z#SetDiff.optimise.<locals>.<genexpr>)	r  rS   r   r   r   r   r   ro   r  )r7   r|   r   r   r  r:   r  r;   r     s    
zSetDiff.optimisec                 C   s,   | j d |o | j d | }|| jkS Nr   r*   r  rW  r   r7   r   rW   r:   r:   r;   rW    s    "zSetDiff.matchesN)F)r<   r=   r>   r   r  r  r   ZSET_DIFF_IGNr   r5  ZSET_DIFF_REVZSET_DIFF_IGN_REVr  r  r   rW  r:   r:   r:   r;   r    s   
r  c                   @   sv   e Zd Zedfejedfejedfeje	dfejedfej
edfejedfej
e	dfejiZdZd	ddZdd ZdS )
r  FT	SET_INTERc                 C   s   g }| j D ]<}|j||dd}t|tr<|jr<||j  q
|| q
t|dkrt|d j| j	| j
d|||S t|| _ | ||S NTr   r*   r   r   )r  r   r+   r  r   r   rP   rS   r   r   r   ro   r  r7   r|   r   r   r  rW   r:   r:   r;   r     s    

zSetInter.optimisec                    s"   t  fdd| jD }|| jkS )Nc                 3   s   | ]}|  V  qd S r   rW  r7  r   r:   r;   rI    r   z#SetInter.matches.<locals>.<genexpr>)rK  r  r   r  r:   r  r;   rW    s    zSetInter.matchesN)F)r<   r=   r>   r   r  r  r   ZSET_INTER_IGNr   r5  ZSET_INTER_REVZSET_INTER_IGN_REVr  r  r   rW  r:   r:   r:   r;   r    s   

r  c                   @   sv   e Zd Zedfejedfejedfeje	dfejedfej
edfejedfej
e	dfejiZdZd	ddZdd ZdS )
r  FTSET_SYM_DIFFc                 C   s   g }| j D ]<}|j||dd}t|tr<|jr<||j  q
|| q
t|dkrt|d j| j	| j
d|||S t|| _ | ||S r  )r  r   r+   r  r   r   rP   rS   r   r   r   ro   r  r  r:   r:   r;   r     s    

zSetSymDiff.optimisec                 C   s(   d}| j D ]}|||k}q
|| jkS r  r  )r7   r   rW   re   r:   r:   r;   rW    s    
zSetSymDiff.matchesN)F)r<   r=   r>   r   r  r  r   ZSET_SYM_DIFF_IGNr   r5  ZSET_SYM_DIFF_REVZSET_SYM_DIFF_IGN_REVr  r  r   rW  r:   r:   r:   r;   r    s   
r  c                   @   s~   e Zd Zedfejedfejedfeje	dfejedfej
edfejedfej
e	dfejiZdZdddZdd Zdd	 Zd
S )r   FT	SET_UNIONc                 C   s   g }| j D ]<}|j||dd}t|tr<|jr<||j  q
|| q
t|dkr|d }|j|j| jk| j	| j
d|||S t|| _ | ||S )NTr   r*   r   )r   r   r   )r  r   r+   r   r   r   rP   rS   r   r   r   ro   r  )r7   r|   r   r   r  rW   re   r:   r:   r;   r     s     

zSetUnion.optimisec           
      C   s  d}| j r|tO }| jr |tO }|r,|tO }ttg  }}| jD ],}t|t	rb||j  
|j q@|
| q@| j| j|f |fg}| D ]Z\}}	d}|r|tO }t|	dkr|
tj||	d f q|
tj|t|	ft|	  q|D ]}||  q|
tjf |S r  )r   r  r   rM  r  r   r   r  r+   r   rP   rT   r  r   rS   r  rY  STRINGro   r   r   r  )
r7   r   r  rv   r  ZothersrW   r   r   valuesr:   r:   r;   r    s0    

 zSetUnion._compilec                    s"   t  fdd| jD }|| jkS )Nc                 3   s   | ]}|  V  qd S r   r  r7  r  r:   r;   rI    r   z#SetUnion.matches.<locals>.<genexpr>)r  r  r   r  r:   r  r;   rW    s    zSetUnion.matchesN)F)r<   r=   r>   r   r  r  r   ZSET_UNION_IGNr   r5  ZSET_UNION_REVZSET_UNION_IGN_REVr  r  r   r  rW  r:   r:   r:   r;   r     s   

"r   c                   @   s   e Zd ZdZejZdS )SkipSKIPN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   r    s   r  c                   @   s   e Zd ZejZdZdS )r   START_OF_LINEN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   r   !  s   r   c                   @   s   e Zd ZejZdZdS )r   START_OF_LINE_UN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   r   %  s   r   c                   @   s   e Zd ZejZdZdS )r   START_OF_STRINGN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   r   )  s   r   c                   @   s   e Zd ZejZdZdS )StartOfWordSTART_OF_WORDN)r<   r=   r>   r  r  r  r  r:   r:   r:   r;   r  -  s   r  c                   @   s   e Zd Zedfejedfejedfeje	dfej
edfejedfejedfeje	dfejiZefddZdd Zdd Zd	d
 Zdd Zdd Zdd ZdS )rO  FTc                 C   s   t || _t| | _| jt@ tkrXg }| jD ](}ttt|}|	dd |D  q,n| j}t || _
d| _| j| j| jf| _d S )Nc                 s   s   | ]}t |V  qd S r   rL  r  r:   r:   r;   rI  @  r   z"String.__init__.<locals>.<genexpr>F)ro   r  r  r   r5  rz   r{   r8  r6  r   rX  requiredrO   r  )r7   r  r   rX  r   r:  r:   r:   r;   r6   8  s    



zString.__init__c                 C   s(   |r
d}nd}t t| j| | jdgS )Nr  r   r   )r   r   r  r   )r7   r   r/   r:   r:   r;   r  I  s    zString.get_firstsetc                 C   s   dS r  r:   r  r:   r:   r;   r  Q  s    zString.has_simple_startc                 C   sB   d}|r|t O }| jr|tO }| j| j|f |t| jf| j gS r  )r  r  REQUIRED_OPr  r   rS   rX  r  r:   r:   r;   r  T  s    zString._compilec                 C   s@   t ddd | jD d}tdt| |t| j  d S )Nr\   c                 s   s   | ]}t |V  qd S r   r  r  r:   r:   r;   rI  ^  r   zString.dump.<locals>.<genexpr>rP  z{}STRING {}{})	rQ  rR   r  rR  r  r4   r  rS  r   rT  r:   r:   r;   r  ]  s     zString.dumpc                 C   s
   t | jS r   )rS   rX  r  r:   r:   r;   r  b  s    zString.max_widthc                 C   s   d| fS r  r:   r  r:   r:   r;   r  e  s    zString.get_required_stringN)r<   r=   r>   r   r  r  r   Z
STRING_IGNr   r5  Z
STRING_FLDZ
STRING_REVZSTRING_IGN_REVZSTRING_FLD_REVr  r6   r  r  r  r  r  r  r:   r:   r:   r;   rO  1  s   	rO  c                   @   s   e Zd Zdd ZdS )r  c                 C   sD   d dd | jD }t|d}tdt| |t| j  d S )Nr\   c                 s   s   | ]}t |V  qd S r   r  r  r:   r:   r;   rI  j  r   zLiteral.dump.<locals>.<genexpr>rP  z{}LITERAL MATCH {}{})	rR   r  rQ  rR  r  r4   r  rS  r   )r7   r  r   literalrU  r:   r:   r;   r  i  s
    zLiteral.dumpN)r<   r=   r>   r  r:   r:   r:   r;   r  h  s   r  c                   @   s(   e Zd ZefddZdd Zdd ZdS )r   c           
         s   || _ || _t  | _| j| j| jf| _|| jf| _| j|jvrRt|j|j| j< | j j| j }| j j	| j }| j | j j
t@ }| B }g }|D ]4}	t|	trdd |	D }	| fdd|	D  q|jtdd dd |D | _d S )Nc                 S   s   g | ]}t |qS r:   rL  r  r:   r:   r;   r     r   z&StringSet.__init__.<locals>.<listcomp>c                    s   g | ]}t | d qS )r   r  r  r   r:   r;   r     r   T)r3  r   c                 S   s   g | ]}t |qS r:   )r   )r   Zchoicer:   r:   r;   r     r   )r|   r   r  r   rO   r  Zset_keynamed_lists_usedrS   rn  rv   ry   r+   r,   rP   r  r   )
r7   r|   r   r   r  r  rg  Z
fold_flagschoicesr}   r:   r   r;   r6   p  s*    


zStringSet.__init__c                 C   s"   t dt| | jt| j  d S )Nz{}STRING_SET {}{})r  r4   r  r   rS  r   r  r:   r:   r;   r    s    zStringSet.dumpc                 C   s
   d | _ d S r   r  r  r:   r:   r;   rD    s    zStringSet.__del__N)r<   r=   r>   r   r6   r  rD  r:   r:   r:   r;   r   o  s   !r   c                   @   sX   e Zd ZdZdd ZdddZddd	ZdddZdddZdd Z	dd Z
dd ZdS )Sourcez1Scanner for the regular expression source string.c                 C   sL   t |tr|| _t| _n|d| _dd | _d| _d| _|d d | _d S )Nzlatin-1c                 S   s
   t | gS r   )r  r-  r:   r:   r;   r1    r   z!Source.__init__.<locals>.<lambda>r   F)	r+   r,   r}   r6  	char_typedecoder/   r  r  )r7   r}   r:   r:   r;   r6     s    

zSource.__init__Fc                 C   s   | j }| j}zV| jrL|sL||  r.|d7 }q|| dkrL|d|}qqLq|| }|d | _|W S  ty   || _|d d  Y S  ty   t|| _|d d  Y S 0 d S )Nr*   r  r(   r   )r}   r/   r  isspacer  r  r   rS   )r7   Zoverride_ignorer}   r/   r   r:   r:   r;   r     s$    



z
Source.getr*   c                 C   s   | j }| j}z| jr|g }t||k rp||  r:|d7 }q$|| dkrX|d|}q$qXq$|||  |d7 }qd|}n||||  }|t|7 }|| _|W S  ty   t|| _d| Y S  t	y   t|| _d| Y S 0 d S Nr*   r  r(   r\   )
r}   r/   r  rS   r  r  rP   rR   r  r   )r7   r0   r}   r/   	substringr:   r:   r;   get_many  s0    



zSource.get_manyTc                 C   s$  | j }| j}| jrzjg }||  r.|d7 }q|| dkrH|d|}q|| |v |krt|||  |d7 }qqtq|| _W n6 ty   t|| _Y n ty   t|| _Y n0 d	|S z4|| |v |kr|d7 }q|| j| }|| _|W S  ty   || j| }|| _| Y S 0 d S r  )
r}   r/   r  r  r  rP   r  rS   r   rR   )r7   test_setr  r}   r/   r  r:   r:   r;   r    s:    




zSource.get_whilec                 C   s   | j }| j}zz| jrd||  r*|d7 }q|| dkrD|d|}q|| |v |krb|d7 }qq~qn|| |v |kr~|d7 }qd|| _W n6 ty   t|| _Y n ty   t|| _Y n0 d S )Nr*   r  r(   )r}   r/   r  r  r  r  rS   r   )r7   r  r  r}   r/   r:   r:   r;   
skip_while  s$    



zSource.skip_whilec                 C   s   | j }| j}| jrzf|D ]T}||  r2|d7 }q|| dkrP|d|}qqPq|| |krd W dS |d7 }q|| _W dS  ty   Y dS  ty   Y dS 0 n"|||sdS |t| | _dS d S )Nr*   r  r(   FT)	r}   r/   r  r  r  r  r   r  rS   )r7   r  r}   r/   r   r:   r:   r;   r   5  s.    


zSource.matchc                 C   s$   |  |s td|| j| jd S )Nz
missing {})r   r%   r4   r}   r/   )r7   r  r:   r:   r;   r  \  s    
zSource.expectc                 C   s   | j }| j}zH| jrH||  r*|d7 }q|| dkrH|d|}qqHq|t|kW S  tyh   Y dS  tyz   Y dS 0 d S )Nr*   r  r(   T)r}   r/   r  r  r  rS   r  r   )r7   r}   r/   r:   r:   r;   at_end`  s    
zSource.at_endN)F)r*   )T)T)r<   r=   r>   r?   r6   r   r  r  r  r   r  r  r:   r:   r:   r;   r    s   

&
0
'r  c                   @   s:   e Zd ZdZddi fddZdddZdd	 Zd
d ZdS )Infoz"Info about the regular expression.r   Nc                 C   sl   |t |t@ pt O }|| _|| _d| _|| _d| _i | _i | _	|| _
i | _g | _i | _i | _g | _i | _d S )NFr   )DEFAULT_FLAGSrB  rC  rv   r?  r9  rn  r3  r>  
group_namer  r  open_groupsr?  r}  r@  r  )r7   rv   r  rn  r:   r:   r;   r6   y  s    zInfo.__init__c                 C   s   | j |}|d u rX|  jd7  _|d u s:| j| jvrq:q| j}|rX|| j |< || j|< || jv rt| jd  }|| j|< |}| j| | j|dd | j|< |S r  )	r>  r   r3  r  r  rS   r  rP   r?  )r7   r   r%  Zgroup_aliasr:   r:   r;   r    s     



zInfo.open_groupc                 C   s   | j   d S r   )r  r   r  r:   r:   r;   r    s    zInfo.close_groupc                 C   sB   | j t@ pt}|tkrdS | r,t|}n| j|}|| jv S r  )	rv   rB  rC  r    rE  r   r>  r   r  )r7   r   rD  r%  r:   r:   r;   r*    s    
zInfo.is_open_group)N)r<   r=   r>   r?   r6   r  r  r*  r:   r:   r:   r;   r  v  s
   
r  c                 C   s   i }g }| j D ]\}}}|j||f}||}|du r|jdkrt| jt@ }	t|t}
|	|
f||fkr|t	t
||||f n8| j|j }|d }|dd ||fkr||||f t
|}|||< ||_q|| _|| _dS )zkChecks whether the reverse and fuzzy features of the group calls match
    the groups which they call.
    Nr   r*   )r@  r%  r   r   rv   r   r+   r   rP   rE  rS   r}  rC  r~  additional_groups)r|   rG  r~  r  Zcallr   r  r3  rF  ZrevZfuzZdef_infor%  r:   r:   r;   _check_group_features  s,    


r  c                 C   sb   |  t|t@ \}}|rLd|_|tkr,d}|j}|t@ sD|t M }|j}nd}d}d}|||fS )z>Gets the required string and related info of a parsed pattern.Tr  r   r:   )r  r   r   r  r   r   r   rX  )rG  rv   
req_offsetr  	req_flags	req_charsr:   r:   r;   _get_required_string  s    
r  c                   @   s   e Zd ZdddZdd ZdS )r&   r   c                    s  || _ g }|D ]\\}}t|}t||j t jt@ |_t| }|	 s\t
d|j|j||  qt|  fddt|D }t|}t jt@ }| |}| }t| j\}	}
}t |  jrt
d|j|jt jt@ }||tjfg }t|}| sVz$t ||}t|}|| }W n tyT   Y n0  jt@ pdt }|dt!t"fvr~t#dt$d |t%@ |B |i i i g |	|
|t&|| _'d S )Nzunbalanced parenthesisc                    s    g | ]\}}t  |d  |qS )r*   )r   )r   rR  rf   r  r:   r;   r     r   z$Scanner.__init__.<locals>.<listcomp>z(recursive regex not supported by Scannerr   z5VERSION0 and VERSION1 flags are mutually incompatible)(lexiconr  r  r  r   rv   r$   r  r   r  r%   r}   r/   rP   r  	enumerater   r   r   r  r  r  r~  r   r  SUCCESSr   r  r   r  rC   rB  rC  r   r    r   rz   r>  rS   scanner)r7   r  rv   Zpatternsphraseactionr   rG  r   r  r  r  r   Zfs_coderD  r:   r  r;   r6     sV    




zScanner.__init__c           	      C   s   g }|j }| j|j}d}| }|s(q| }||kr:q| j|jd  d }t|drl|| _|| | }|d ur||| |}q|||d  fS )Nr   r*   __call__)rP   r  r   r  r  	lastindexrr   r%  )	r7   r}   r  rP   r   re   rW   jr  r:   r:   r;   scan=  s$    
zScanner.scanN)r   )r<   r=   r>   r6   r  r:   r:   r:   r;   r&     s   
Ir&   r2  r(   	)ra   rb   rd   nrg   trq  ZDigitTZBlankZSpaceZWord)ro  r   hrh   r   rj   r!   )r   rb   r   KrW   r   Z)rb   r   rW   r   )ZFAILr   r  r  )rm   )F)FF)NF)enumr}   rq  collectionsr   Zregex._regexrz   __all__r5   r%   r@   rB   rC   IntFlagr'   globalsru   __members__r    rC  r   rB  r   r   r   ry   r   r  r   r   r
   r   r   r>  r   r   r   r"   r$   ZSCOPED_FLAGS	frozensetZascii_lettersr   r   r   rx  Z	octdigitsrG  Z	hexdigitsrO  r   rp  rw  r  Zget_code_sizeZBYTES_PER_CODEZBITS_PER_CODEr   r6  r   r   r5  r8  r  rV  OPCODESrl   r  r  r  re   r  setattrrx   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   r   r   r  r  r  r  r-  r  r  r   r!  r7  r<  r=  r"  r@  r  rM  rN  rP  r   rb  rf  rW  rX  rZ  r[  r\  rs  r   r~  r  r  r  r}  r  r  r  r  r  r  r   r  r  rt  r  r  r  r  r  r  rM  r  r  r  r  rS  r  r  r  r   r   r   r2  r  r   r4  rE  r   r.  r^  r`  rb  r   r   rf  r   r   rj  rl  r   r]  rt  r   r   r   r  r   r+  r1  rN  r  r  r  r   rY  r   r.  r  r  r  r   r  r   r   r   r  rO  r  r   r  r  r  r  r&   Zget_propertiesr  r  r  rv  r  r  r   r   Zprop_valuesr  rS   Zval_namer  ra  r`  r_  dictr^  r$  r:   r:   r:   r;   <module>   s  3





U2


T 
=
	Z$+#A!




)&	FH
F8   .	JY \QDU4M1 Vi!B7) _A'a
	