
    vKgJ                         S r SSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJr   " S S	\	5      r
\ " S
 S\	5      5       rg)a  Top down operator precedence parser.

This is an implementation of Vaughan R. Pratt's
"Top Down Operator Precedence" parser.
(http://dl.acm.org/citation.cfm?doid=512927.512931).

These are some additional resources that help explain the
general idea behind a Pratt parser:

* http://effbot.org/zone/simple-top-down-parsing.htm
* http://javascript.crockford.com/tdop/tdop.html

A few notes on the implementation.

* All the nud/led tokens are on the Parser class itself, and are dispatched
  using getattr().  This keeps all the parsing logic contained to a single
  class.
* We use two passes through the data.  One to create a list of token,
  then one pass through the tokens to create the AST.  While the lexer actually
  yields tokens, we convert it to a list so we can easily implement two tokens
  of lookahead.  A previous implementation used a fixed circular buffer, but it
  was significantly slower.  Also, the average jmespath expression typically
  does not have a large amount of token so this is not an issue.  And
  interestingly enough, creating a token list first is actually faster than
  consuming from the token iterator one token at a time.

    N)lexer)with_repr_method)ast)
exceptions)visitorc                      \ rS rSr0 SS_SS_SS_SS_SS_SS_S	S_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SSSSSSSSSSSSS .ErS!r0 rS"rSXS# jrS$ r	S% r
S& rSYS' jrS( rS) rS* rS+ rS, rS- rS. rS/ rS0 rS1 rS2 rS3 rS4 rS5 rS6 rS7 rS8 rS9 rS: rS; r S< r!S= r"S> r#S? r$S@ r%SA r&SB r'SC r(SD r)SE r*SF r+SG r,SH r-SI r.SJ r/SK r0SZSM jr1SN r2SO r3SP r4SQ r5SR r6SS r7ST r8SU r9\:SV 5       r;SWr<gL)[Parser%   eofr   unquoted_identifierquoted_identifierliteralrbracketrparencommarbracenumbercurrentexprefcolonpipe   or   and   eq   gt	         (   -   2   7   <   )ltgtelteneflattenstarfilterdotnotlbracelbracketlparen
      c                 B    S U l         S /U-  U l        Xl        SU l        g Nr   )	tokenizer_tokens_buffer_size_index)self	lookaheads     O/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/jmespath/parser.py__init__Parser.__init__N   s$    v	)%    c                     U R                   R                  U5      nUb  U$ U R                  U5      nX0R                   U'   [        U R                   5      U R                  :  a  U R                  5         U$ N)_CACHEget	_do_parselen	_MAX_SIZE_free_cache_entries)r<   
expressioncachedparsed_results       r>   parseParser.parseT   s`    ,Mz2"/Jt{{dnn,$$&rA   c                      U R                  U5      $ ! [        R                   a  nXl        e S nAf[        R                   a  nUR                  U5        e S nAf[        R                   a  nXl        e S nAff = frC   )_parser   
LexerErrorrJ   IncompleteExpressionErrorset_expression
ParseError)r<   rJ   es      r>   rF   Parser._do_parse^   sk    
	;;z**$$ 	%L33 	Z($$ 	%L	s*    A:.A:AA:.A55A:c                 d   [         R                  " 5       R                  U5      U l        [	        U R                  5      U l        SU l        U R                  SS9nU R                  5       S:X  d9  U R                  S5      n[        R                  " US   US   US   SUS   -  5      e[        X5      $ )Nr   )binding_powerr   startvaluetypezUnexpected token: %s)r   Lexertokenizer8   listr9   r;   _expression_current_token_lookahead_tokenr   rT   ParsedResult)r<   rJ   parsedts       r>   rP   Parser._parsek   s    //
;DNN+!!!2""$-%%a(A'''
AgJ&	(>7(KM MJ//rA   c                    U R                  S5      nU R                  5         [        U SUS   -  U R                  5      nU" U5      nU R	                  5       nXR
                  U   :  ar  [        U SU-  S 5      nUc#  U R                  S5      nU R                  U5        O(U R                  5         U" U5      nU R	                  5       nXR
                  U   :  a  Mr  U$ )Nr   z_token_nud_%sr[   z_token_led_%s)ra   _advancegetattr_error_nud_tokenr`   BINDING_POWER_error_led_token)r<   rX   
left_tokennud_functionleftcurrent_tokenlederror_tokens           r>   r_   Parser._expressionv   s    **1-
/Jv$66!!# J'++-00??$- ?FC{"33A6%%k24y $ 3 3 5 00?? rA   c                 4    [         R                  " US   5      $ NrZ   )r   r   r<   tokens     r>   _token_nud_literalParser._token_nud_literal   s    {{5>**rA   c                 4    [         R                  " US   5      $ rt   )r   fieldru   s     r>   _token_nud_unquoted_identifier%Parser._token_nud_unquoted_identifier   s    yyw((rA   c                     [         R                  " US   5      nU R                  5       S:X  a0  U R                  S5      n[        R
                  " SUS   US   S5      eU$ )NrZ   r3   r   r[   z1Quoted identifier not allowed for function names.)r   rz   r`   ra   r   rT   )r<   rv   rz   rd   s       r>   _token_nud_quoted_identifier#Parser._token_nud_quoted_identifier   se    		%.)  H,%%a(A''1W:qyCE E rA   c                     [         R                  " 5       nU R                  5       S:X  a  [         R                  " 5       nOU R                  U R                  S   5      n[         R
                  " X#5      $ )Nr   r-   )r   identityr`   _parse_projection_rhsrj   value_projectionr<   rv   rn   rights       r>   _token_nud_starParser._token_nud_star   sU    ||~ J.LLNE..t/A/A&/IJE##D00rA   c                 J    U R                  [        R                  " 5       5      $ rC   )_token_led_filterr   r   ru   s     r>   _token_nud_filterParser._token_nud_filter   s    %%clln55rA   c                 "    U R                  5       $ rC   )_parse_multi_select_hashru   s     r>   _token_nud_lbraceParser._token_nud_lbrace   s    ,,..rA   c                 H    U R                  5       nU R                  S5        U$ )Nr   )r_   _matchr<   rv   rJ   s      r>   _token_nud_lparenParser._token_nud_lparen   s"    %%'
HrA   c                     [         R                  " [         R                  " 5       5      nU R                  U R                  S   5      n[         R
                  " X#5      $ Nr,   )r   r,   r   r   rj   
projectionr   s       r>   _token_nud_flattenParser._token_nud_flatten   sC    {{3<<>***y)+~~d**rA   c                 j    U R                  U R                  S   5      n[        R                  " U5      $ )Nr0   )r_   rj   r   not_expression)r<   rv   exprs      r>   _token_nud_notParser._token_nud_not   s.     2 25 9:!!$''rA   c                    U R                  5       S;   a5  U R                  5       nU R                  [        R                  " 5       U5      $ U R                  5       S:X  a}  U R                  S5      S:X  ah  U R                  5         U R                  5         U R                  U R                  S   5      n[        R                  " [        R                  " 5       U5      $ U R                  5       $ )Nr   r   r-   r   r   )r`   _parse_index_expression_project_if_slicer   r   
_lookaheadrg   r   rj   r   _parse_multi_select_list)r<   rv   r   s      r>   _token_nud_lbracketParser._token_nud_lbracket   s     $77002E
 ))#,,.%@@  "f,"j0MMOMMO..t/A/A&/IJE>>#,,.%880022rA   c                    U R                  S5      S:X  d  U R                  S5      S:X  a  U R                  5       $ [        R                  " U R	                  S5      S   5      nU R                  5         U R                  S5        U$ )Nr   r   r   rZ   r   )r   _parse_slice_expressionr   indexra   rg   r   )r<   nodes     r>   r   Parser._parse_index_expression   so    
 OOA')"g-//11 99T2215g>?DMMOKK
#KrA   c                    / SQnSnU R                  5       nUS:X  d  US:  a  US:X  a=  US-  nUS:X  a!  U R                  U R                  S5      S5        U R                  5         ONUS:X  a'  U R                  S5      S	   X'   U R                  5         O!U R                  U R                  S5      S5        U R                  5       nUS:X  d  US:  a  M  U R	                  S5        [
        R                  " U6 $ )
N)NNNr   r   r   r   r   syntax errorr   rZ   )r`   _raise_parse_error_for_tokenra   rg   r   r   slice)r<   partsr   ro   s       r>   r   Parser._parse_slice_expression   s     #++-:-%!)'
A:55--a0.B(*#44Q7@11))!,n> //1M  :-%!) 	Jyy%  rA   c                 ,    [         R                  " 5       $ rC   )r   current_noderu   s     r>   _token_nud_currentParser._token_nud_current   s    !!rA   c                 j    U R                  U R                  S   5      n[        R                  " U5      $ )Nr   )r_   rj   r   r   r   s      r>   _token_nud_exprefParser._token_nud_expref   s,    %%d&8&8&BC
zz*%%rA   c                 Z   U R                  5       S:X  dT  U R                  U R                  S   5      nUS   S:X  a  US   R                  U5        U$ [        R
                  " X/5      $ U R                  5         U R                  U R                  S   5      n[        R                  " X5      $ )Nr-   r/   r[   subexpressionchildren)	r`   _parse_dot_rhsrj   appendr   r   rg   r   r   r<   rn   r   s      r>   _token_led_dotParser._token_led_dot   s    ""$.''(:(:5(ABEF|.Z ''.(($77 MMO..""5)+E''44rA   c                 j    U R                  U R                  S   5      n[        R                  " X5      $ )Nr   )r_   rj   r   r   r   s      r>   _token_led_pipeParser._token_led_pipe  s,      !3!3F!;<xx$$rA   c                 j    U R                  U R                  S   5      n[        R                  " X5      $ )Nr   )r_   rj   r   or_expressionr   s      r>   _token_led_orParser._token_led_or	  s.      !3!3D!9:  --rA   c                 j    U R                  U R                  S   5      n[        R                  " X5      $ )Nr   )r_   rj   r   and_expressionr   s      r>   _token_led_andParser._token_led_and  s.      !3!3E!:;!!$..rA   c                    US   S:w  a9  U R                  S5      n[        R                  " US   US   US   SUS   -  5      eUS   n/ nU R                  5       S:X  d\  U R	                  5       nU R                  5       S:X  a  U R                  S5        UR                  U5        U R                  5       S:X  d  M\  U R                  S5        [        R                  " X45      nU$ )	Nr[   rz   rY   rZ   zInvalid function name '%s'r   r   )	ra   r   rT   r`   r_   r   r   r   function_expression)r<   rn   prev_tnameargsrJ   function_nodes          r>   _token_led_lparenParser._token_led_lparen  s    <7" **2.F''w&.,vg>@ @ G}%%'83))+J""$/G$KK
#	 %%'83
 	H//;rA   c                    U R                  S5      nU R                  S5        U R                  5       S:X  a  [        R                  " 5       nOU R                  U R                  S   5      n[        R                  " XU5      $ )Nr   r   r,   r.   )r_   r   r`   r   r   r   rj   filter_projection)r<   rn   	conditionr   s       r>   r   Parser._token_led_filter%  sh    $$Q'	J I-LLNE..t/A/A(/KLE$$T)<<rA   c                 &    U R                  US5      $ )Nr   _parse_comparatorr<   rn   s     r>   _token_led_eqParser._token_led_eq/      %%dD11rA   c                 &    U R                  US5      $ )Nr+   r   r   s     r>   _token_led_neParser._token_led_ne2  r   rA   c                 &    U R                  US5      $ )Nr   r   r   s     r>   _token_led_gtParser._token_led_gt5  r   rA   c                 &    U R                  US5      $ )Nr)   r   r   s     r>   _token_led_gteParser._token_led_gte8      %%dE22rA   c                 &    U R                  US5      $ )Nr(   r   r   s     r>   _token_led_ltParser._token_led_lt;  r   rA   c                 &    U R                  US5      $ )Nr*   r   r   s     r>   _token_led_lteParser._token_led_lte>  r   rA   c                     [         R                  " U5      nU R                  U R                  S   5      n[         R                  " X5      $ r   )r   r,   r   rj   r   r   s      r>   _token_led_flattenParser._token_led_flattenA  s=    {{4 **y)+~~d**rA   c                 b   U R                  S5      nUS   S;   a@  U R                  5       nUS   S:X  a  US   R                  U5        U$ U R                  X5      $ U R	                  S5        U R	                  S5        U R                  U R                  S   5      n[        R                  " X5      $ )Nr   r[   r   index_expressionr   r-   r   )	ra   r   r   r   r   r   rj   r   r   )r<   rn   rv   r   s       r>   _token_led_lbracketParser._token_led_lbracketG  s    %%a(=//002EF|11 Z ''.--d:: KKKK
#..t/A/A&/IJE>>$..rA   c                     [         R                  " X/5      nUS   S:X  a3  [         R                  " UU R                  U R                  S   5      5      $ U$ )Nr[   r   r-   )r   r   r   r   rj   )r<   rn   r   
index_exprs       r>   r   Parser._project_if_sliceZ  sW    ))4-8
=G#>>**4+=+=f+EFH H rA   c                 l    U R                  U R                  U   5      n[        R                  " X!U5      $ rC   )r_   rj   r   
comparator)r<   rn   r   r   s       r>   r   Parser._parse_comparatorc  s.      !3!3J!?@~~j66rA   c                     / n U R                  5       nUR                  U5        U R                  5       S:X  a  OU R                  S5        MI  U R                  S5        [        R
                  " U5      $ )Nr   r   )r_   r   r`   r   r   multi_select_list)r<   expressionsrJ   s      r>   r   Parser._parse_multi_select_listg  sj    ))+Jz*""$
2G$  	J$$[11rA   c                    / n U R                  S5      nU R                  SS/S9  US   nU R                  S5        U R                  S5      n[        R
                  " X4S9nUR                  U5        U R                  5       S:X  a  U R                  S5        O&U R                  5       S	:X  a  U R                  S	5        OM  [        R                  " US
9$ )Nr   r   r   )token_typesrZ   r   )key_namer   r   r   )nodes)	ra   _match_multiple_tokensr   r_   r   key_val_pairr   r`   multi_select_dict)r<   pairs	key_tokenr  rZ   r   s         r>   r   Parser._parse_multi_select_hashs  s    --a0I ''02GH ( J )HKK $$Q'E##XBDLL""$/G$$$&(2H%   $$511rA   c                    U R                   U R                  5          U R                  :  a  [        R                  " 5       nU$ U R                  5       S:X  a  U R                  U5      nU$ U R                  5       S:X  a  U R                  U5      nU$ U R                  5       S:X  a$  U R                  S5        U R                  U5      nU$ U R                  U R                  S5      S5        W$ )Nr2   r.   r/   r   r   )
rj   r`   _PROJECTION_STOPr   r   r_   r   r   r   ra   )r<   rX   r   s      r>   r   Parser._parse_projection_rhs  s    d1134t7L7LLLLNE    "j0$$]3E    "h.$$]3E    "e+KK''6E  --d.C.CA.F.<>rA   c                 T   U R                  5       nUS;   a  U R                  U5      $ US:X  a!  U R                  S5        U R                  5       $ US:X  a!  U R                  S5        U R	                  5       $ U R                  S5      n/ SQnSU< SUS   < 3nU R                  X55        g )	N)r   r   r-   r2   r1   r   )r   r   r2   r1   Expecting: , got: r[   )r`   r_   r   r   r   ra   r   )r<   rX   r=   rd   allowedmsgs         r>   r   Parser._parse_dot_rhs  s     '')	LL##M22*$KK
#0022("KK!0022%%a(A-G -4QvY?  --a5rA   c                 |    US   S:X  a!  [         R                  " US   US   US   5      eU R                  US5        g )Nr[   r   rY   rZ   invalid token)r   rR   r   ru   s     r>   ri   Parser._error_nud_token  sD    =E!66ggf? ?))%ArA   c                 (    U R                  US5        g )Nr  )r   ru   s     r>   rk   Parser._error_led_token  s    ))%ArA   Nc                     U R                  5       U:X  a  U R                  5         g U R                  XR                  S5      5        g r7   )r`   rg   _raise_parse_error_maybe_eofra   )r<   
token_types     r>   r   Parser._match  s8     J.MMO--11!46rA   c                     U R                  5       U;  a   U R                  XR                  S5      5        U R                  5         g r7   )r`   r  ra   rg   )r<   r  s     r>   r  Parser._match_multiple_tokens  s8     3--22157rA   c                 .    U =R                   S-  sl         g )Nr   )r;   r<   s    r>   rg   Parser._advance  s    qrA   c                 :    U R                   U R                     S   $ Nr[   r9   r;   r   s    r>   r`   Parser._current_token  s    ||DKK(00rA   c                 @    U R                   U R                  U-      S   $ r#  r$  r<   r   s     r>   r   Parser._lookahead  s    ||DKK&01&99rA   c                 :    U R                   U R                  U-      $ rC   r$  r'  s     r>   ra   Parser._lookahead_token  s    ||DKK&011rA   c                 N    US   nUS   nUS   n[         R                  " X4XR5      e)NrY   rZ   r[   )r   rT   )r<   rv   reasonlex_positionactual_valueactual_types         r>   r   #Parser._raise_parse_error_for_token  s5    W~W~Fm##L$/9 	9rA   c                     US   nUS   nUS   nUS:X  a  [         R                  " X4U5      eSU< SU< 3n[         R                  " X4XV5      e)NrY   rZ   r[   r   r  r  )r   rR   rT   )r<   expected_typerv   r-  r.  r/  messages          r>   r  #Parser._raise_parse_error_maybe_eof  si    W~W~Fm%66K9 9   /<.9;##> 	>rA   c                     [         R                  " [        U R                  R	                  5       5      [        U R                  S-  5      5       H  nU R                  R                  US 5        M!     g )Nr   )randomsampler^   rD   keysintrH   pop)r<   keys     r>   rI   Parser._free_cache_entries  sK    ==dkk&6&6&8!93t~~PQ?Q;RSCKKOOC& TrA   c                 8    U R                   R                  5         g)z'Clear the expression compilation cache.N)rD   clear)clss    r>   purgeParser.purge  s     	

rA   )r:   r;   r9   r8   )r   )r   rC   )=__name__
__module____qualname____firstlineno__rj   r  rD   rH   r?   rM   rF   rP   r_   rw   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   ri   rk   r   r  rg   r`   r   ra   r   r  rI   classmethodr@  __static_attributes__ rA   r>   r	   r	   %   s!   qq 	Q 	1	
 	A 	! 	 	! 	! 	1 	! 	 	 	a 	q  	a!" 	a#$ =MD  FI	0&+)	16/
+(3"!0"&5%./(=222323+/&7
22("68BB61:29
>'  rA   r	   c                   0    \ rS rSrS rSS jrS rS rSrg)	rb   i  c                     Xl         X l        g rC   rJ   rc   )r<   rJ   rc   s      r>   r?   ParsedResult.__init__  s    $rA   Nc                 j    [         R                  " U5      nUR                  U R                  U5      nU$ rC   )r   TreeInterpretervisitrc   )r<   rZ   optionsinterpreterresults        r>   searchParsedResult.search  s-    --g6""4;;6rA   c                 f    [         R                  " 5       nUR                  U R                  5      nU$ )a6  Render the parsed AST as a dot file.

Note that this is marked as an internal method because
the AST is an implementation detail and is subject
to change.  This method can be used to help troubleshoot
or for development purposes, but is not considered part
of the public supported API.  Use at your own risk.

)r   GraphvizVisitorrO  rc   )r<   renderercontentss      r>   _render_dot_fileParsedResult._render_dot_file   s)     **,>>$++.rA   c                 ,    [        U R                  5      $ rC   )reprrc   r   s    r>   __repr__ParsedResult.__repr__  s    DKK  rA   rK  rC   )	rB  rC  rD  rE  r?   rS  rY  r]  rG  rH  rA   r>   rb   rb     s    
!rA   rb   )__doc__r6  jmespathr   jmespath.compatr   r   r   r   objectr	   rb   rH  rA   r>   <module>rc     sH   6   ,   MV M` !6 ! !rA   