+
    VBi                         R t ^ RIt^ RIt]P                  ! R4      P                  tR tR tR tR t	R t
R tR	 tR
 tR tR tR tR tR]R]R]R]R]R]/tR]
/t ! R R4      tR tR tR tR tR# )z
A simple XPath-like language for tree traversal.

This works by creating a filter chain of generator functions.  Each
function selects a part of the expression, e.g. a child node, a
specific descendant or a node that holds an attribute.
NzH(b?'[^']*'|b?\"[^\"]*\"|//?|\(\)|==?|[/.*\[\]()@])|([^/\[\]()@=\s]+)|\s+c                 T    \        W4      pVe   \        V4      \        J d   V# V.# R# )N )getattrtypelist)node	attr_namechilds   && =/usr/lib/python3.14/site-packages/Cython/Compiler/TreePath.pyiterchildrenr      s/    D$E;$L7N	    c                 >     \        V 4      #   \         d     R # i ; iN)nextStopIteration)its   &r
   _get_first_or_noner   #   s"    Bx s   
 c                 Z    V P                   P                  P                  R 4      R,          # ).)	__class____name__split)r   s   &r
   	type_namer   )   s"    >>""((-b11r   c                 ~    V^,          pV ! 4       pV^ ,          R8w  d   \        RV,          4      h\        W4      pW#3# )   (z%Expected '(' after function name '%s')
ValueErrorhandle_predicate)r   tokenname	predicates   &&  r
   
parse_funcr"   ,   s@    8DFEQx3@4GHH -I?r   c                0   a \        W4      w  poV3R lpV# )z

not(...)
c              3   V   <"   V  F  p\        S! V.4      4      e   K  Vx  K  	  R # 5ir   )r   )resultr   r!   s   & r
   selecthandle_func_not.<locals>.select:   s'     D!)TF"34<
 s   )
))r"   )r   r   r    r&   r!   s   &&  @r
   handle_func_notr(   4   s     !-OD) Mr   c                b   a V^,          oS\         9   d   \         S,          ! W4      # V3R lpV# )z
/NodeName/
or
func(...)
c              3      <"   V  F>  pVP                    F+  p\        W4       F  p\        V4      S8X  g   K  Vx  K  	  K-  	  K@  	  R # 5ir   child_attrsr   r   )r%   r   r   r	   r    s   &   r
   r&   handle_name.<locals>.selectI   sA     D!--	)$:E '4/# ; . s
   0A
A
)	functions)r   r   r&   r    s   && @r
   handle_namer/   @   s1     8Dyt++$ Mr   c                    R pV# )z
/*/
c              3   p   "   V  F)  pVP                    F  p\        W4       R j  xL
  K  	  K+  	  R #  L5ir   r,   r   )r%   r   r    s   &  r
   r&   handle_star.<locals>.selectU   s0     D(('333 ) 3s   #646r   r   r   r&   s   && r
   handle_starr5   Q   s    4 Mr   c                    R pV# )z
/./
c                     V # r   r   )r%   s   &r
   r&   handle_dot.<locals>.select_   s    r   r   r4   s   && r
   
handle_dotr9   [   s    Mr   c                   aa V ! 4       pV^ ,          R8X  d   V3R loM+V^ ,          '       g   V^,          oVV3R loM\        R4      hV3R lpV# )z
//...
*c              3      <"   V P                    F)  p\        W4       F  pVx  S! V4       R j  xL
  K  	  K+  	  R #  L5ir   r2   )r   r    r	   iter_recursives   &  r
   r=   *handle_descendants.<locals>.iter_recursivei   s=     (()$5EK-e444 6 ) 5s   -A?Ac              3      <"   V P                    F9  p\        W4       F'  p\        V4      S8X  d   Vx  S! V4       R j  xL
  K)  	  K;  	  R #  L5ir   r+   )r   r    r	   r=   	node_names   &  r
   r=   r>   p   sJ     (()$5E '94#-e444 6 ) 5s   =A AAzExpected node name after '//'c              3   F   <"   V  F  pS! V4       R j  xL
  K  	  R #  L
5ir   r   )r%   r   r=   s   & r
   r&   "handle_descendants.<locals>.selecty   s!     D%d+++ +s   !!)r   )r   r   r&   r=   r@   s   && @@r
   handle_descendantsrC   c   sO     FEQx3	5
 1XX!H		5 899, Mr   c                   aa V ! 4       pV^ ,          '       d   \        R4      hV^,          pRoV P                  4       pV^ ,          R8X  d   V ! 4        \        V 4      o\        P                  ! V4      oSf	   V3R lpV# VV3R lpV# )    zExpected attribute nameN=c              3   l   <"   V  F  p S! V4      pTf   K  Tx  K  	  R #   \          d     K*  i ; i5ir   )AttributeError)r%   r   
attr_valuereadattrs   &  r
   r&    handle_attribute.<locals>.select   s?     !)$J )$$  & s    4"4
41414c              3     <"   V  Fd  p S! V4      pTS8X  d   Tx  K  \        T\        4      '       g   K1  \        S\        4      '       g   KI  TSP	                  4       8X  g   K`  Tx  Kf  	  R #   \          d     Kx  i ; i5ir   )rH   
isinstancebytesstrencode)r%   r   rI   rJ   values   &  r
   r&   rK      sn     !)$J &$$ U33
5#8N8N"elln4$$  & s8   BA0 BBB&
B0A?;B>A??B)r   peekparse_path_valueoperator
attrgetter)r   r   r    r&   rJ   rQ   s   &&  @@r
   handle_attributerV      s    FEQxx2338DEIIKEQx3 &""4(H}	%, M	% Mr   c                 8   V ! 4       pV^ ,          pV'       d   VR,          R8X  g   VR,          R8X  d   VR,          V^ ,          8X  g   Q hV^R # VR,          R8X  g   VR,          R8X  d,   VR,          V^,          8X  g   Q hV^R P                  R4      #  \        V4      # V^,          P                  4       '       d   \        V^,          4      # V^,          P	                  4       pVR8X  d   R	# VR
8X  d   R# \        RV R24      h  \         d     Li ; i)rE   :Nr   N'":N   Nzb'zb"zUTF-8trueTfalseFzInvalid attribute predicate: 'r   )rP   intr   isdigitlower)r   r   rQ   r    s   &   r
   rS   rS      s   FE!HE9uRyC/9a(((2;9b	T 19a(((2;%%g..	u: 
q				58}Qx~~6>W_
5eWA>
??  		s   
D DDc                   a V ! 4       p. .pV.oV^ ,          R9  d   VR,          P                  \        V^ ,          ,          ! W4      4        V ! 4       pV^ ,          R8X  d   V ! 4       pT^ ,          '       d   Kl  T^,          R8X  d   TP                  . 4       T ! 4       pK  T^,          R8X  g   K  . .pSP                  T4       T ! 4       pK  VR,          '       g   \        R4      hV3R lpV#   \         d     K0  i ; i)rE   /andorzIncomplete predicatec              3      <"   V  FK  pV3pS F?  pV F1  p\        V4      pV F  pV! V4      pK  	  \        V4      pVe   K0   K8  	  Vx   KI  	  KM  	  R # 5ir   )iterr   )	r%   r   	node_baseand_conditions	condition	subresultr&   predicate_resultor_conditionss	   &       r
   r&    handle_predicate.<locals>.select   sf     DI"/!/I $YI"+$*9$5	 #,'9)'D$'/ "0 J #0 s   ;AA)])r   )append
operationsr   r   )r   r   rg   r&   rk   s   &&  @r
   r   r      s    FETN#$M
(*
$r!!:eAh#7#DF	FE Qx3QxxQx5 %%b)qT!"$$$^4"/00" MG  		s   C2 2D D@ r;   r   z//[notc                   6   a  ] tR t^t o R tRR ltR tRtV tR# )_LookAheadTokenizerc                    \        V4       UUu. uF  w  r#V'       g   V'       g   K  W#3NK  	  uppV n        V P                  P                  4        R # u uppi r   )path_tokenizer_tokensreverse)selfpathspecialtexts   &&  r
   __init___LookAheadTokenizer.__init__   sJ     $2$#7
#7$ WO#7

 	
s
   AANc                P    V P                   '       d   V P                   R,          # T# )r   r   ry   )r{   defaults   &&r
   rR   _LookAheadTokenizer.peek  s    #'<<<t||B<W<r   c                d     V P                   P                  4       #   \         d	    \        R hi ; ir   )ry   pop
IndexErrorr   )r{   s   &r
   __call___LookAheadTokenizer.__call__	  s1    	*<<##%% 	*T)	*s    /r   ))NN)	r   
__module____qualname____firstlineno__r   rR   r   __static_attributes____classdictcell__)__classdict__s   @r
   rv   rv      s     =* *r   rv   c                    \        V 4      pV! 4       p. p  VP                  \        V^ ,          ,          ! W4      4        T! 4       pT^ ,          R8X  d
   T! 4       pKJ  KL    \         d    \	        R4      hi ; i  \         d     T# i ; i)r   zinvalid pathra   )rv   ro   rp   r   r   )r|   _nextr   selectors   &   r
   _build_path_iteratorr     s    %EGEH
	-OOJuQx0>?	GEQx3 	  	-^,,	-  	O	s   )A! A; !A8;B
	B
c                 V    \        V4      p\        V 34      pV F  pV! V4      pK  	  V# r   )r   re   )r   r|   selector_chainr%   r&   s   &&   r
   iterfindr   $  s/    )$/N4']F  !Mr   c                 *    \        \        W4      4      # r   )r   r   r   r|   s   &&r
   
find_firstr   +  s    ht233r   c                 *    \        \        W4      4      # r   )r   r   r   s   &&r
   find_allr   .  s    $%%r   )__doc__rerT   compilefindallrx   r   r   r   r"   r(   r/   r5   r9   rC   rV   rS   r   rp   r.   rv   r   r   r   r   r   r   r
   <module>r      s    
 	 g 	2
":#L@2-b 
++*


 
O	
* *&(4&r   