
    Iiu2                        S r SSKrSSKJr  SSKJrJrJrJr  SSK	r
SSK
JrJrJr  SSKJrJrJrJr   " S S\5      r " S	 S
5      r " S S\
R,                  R.                  5      rS\S\4S jr\S:X  av  \" 5       rSr\R=                  \5      r\ " \5        \" 5       r!\!RE                  \5        \ " \!RF                  5        Sr$\R=                  \$5      r%\ " \%RM                  5       5        gg)a~  
CEL Parser.

See  https://github.com/google/cel-spec/blob/master/doc/langdef.md

https://github.com/google/cel-cpp/blob/master/parser/Cel.g4

https://github.com/google/cel-go/blob/master/parser/gen/CEL.g4

Builds a parser from the supplied cel.lark grammar.

..  todo:: Consider embedding the ``cel.lark`` file as a triple-quoted literal.

    This means fixing a LOT of \'s. But it also eliminates a data file from the installation.

Example::

    >>> from celpy.celparser import CELParser
    >>> p = CELParser()
    >>> text2 = 'type(null)'
    >>> ast2 = p.parse(text2)
    >>> print(ast2.pretty().replace("   ","   "))  # doctest: +NORMALIZE_WHITESPACE
    expr
      conditionalor
        conditionaland
          relation
            addition
              multiplication
                unary
                  member
                    primary
                      ident_arg
                        type
                        exprlist
                          expr
                            conditionalor
                              conditionaland
                                relation
                                  addition
                                    multiplication
                                      unary
                                        member
                                          primary
                                            literal    null


    N)Path)AnyListOptionalcast)LarkTokenTree)LexError
ParseErrorUnexpectedCharactersUnexpectedTokenc            	       R   ^  \ rS rSrSSS.S\S\\   S\\   SS4U 4S jjjrS	rU =r	$ )
CELParseErrorI   Nlinecolumnargsr   r   returnc                8   > [         TU ]  " U6   Xl        X l        g N)super__init__r   r   )selfr   r   r   	__class__s       5/venv/lib/python3.13/site-packages/celpy/celparser.pyr   CELParseError.__init__J   s    
 	$	    )r   r   )
__name__
__module____qualname____firstlineno__r   r   intr   __static_attributes____classcell__)r   s   @r   r   r   I   sC     #'$(	 3- SM	 .2	 r   r   c            	           \ rS rSr% SrSr\\   \S'   SS jr	\
S\S\4S j5       rS	\S\4S
 jr  SS\S\\   S\\   S\4S jjrSrg)	CELParserT   z9Wrapper for the CEL parser and the syntax error messages.N
CEL_PARSERr   c           
          [         R                  c]  [        [        5      R                  S-  R                  5       n[        USSS[        R                  SU R                  0SS9[         l        g g )Nzcel.larklalrexprTIDENT)parserstartdebugg_regex_flagslexer_callbackspropagate_positions)
r(   r*   r   __file__parent	read_textr   reMambiguous_literals)r   CEL_grammars     r   r   CELParser.__init__X   sa    '>00:=HHJK#' dd!($*A*A B$($I  (r   tc                     U R                   S:X  a  [        SU R                   5      $ U R                   S:X  a  [        SU R                   5      $ U $ )z<Resolve a grammar ambiguity between identifiers and literalstrueBOOL_LITfalse)valuer	   )r=   s    r   r:   CELParser.ambiguous_literalse   sC     77fQWW--WWQWW--r   textc                    [         R                  c  [        S5      eXl         [         R                  R	                  U R                  5      $ ! [
        [        4 aD  nUR                  U5      n[        U/UR                  Q7UR                  UR                  S.6eS nAf[        [        4 a;  nUR                  S   R                  5       S   n[        U/UR                  Q76 eS nAff = f)NzNo grammar loadedr   r   )r(   r*   	TypeErrorrD   parser   r   get_contextr   r   r   r   r   r   
splitlines)r   rD   exmessages       r   rG   CELParser.parsen   s    '/00		3''--dii88!56 	SnnT*GR"''R		RR*% 	3ggaj++-a0G2"''22	3s#   (A C*?BC*/6C%%C*rK   r   r   c                     U(       a   U R                   R                  5       US-
     OU R                   nSU=(       d    S SU=(       d    S SU SU SU(       a  US-
  S-  OS S	3nU$ )
N   zERROR: <input>:?: z
    | . z^
)rD   rI   )r   rK   r   r   sources        r   
error_textCELParser.error_text{   sx    
 6:%%'q1tyydkc]!FMc?!G9 EH +1fqjC'r:#? 	
 r   )rD   r   N)NN)r    r!   r"   r#   __doc__r*   r   r   __annotations__r   staticmethodr	   r:   strr
   rG   r$   rU   r%    r   r   r(   r(   T   s    C!%J% e   3# 3$ 3  #'$(	 3- SM	 .1	 r   r(   c                      \ rS rSrSr\S\R                  S\4S j5       r	S.S jr
S\R                  SS4S	 jrS\R                  SS4S
 jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jrS\R                  SS4S jr S\R                  SS4S jr!S\R                  SS4S  jr"S\R                  SS4S! jr#S\R                  SS4S" jr$S\R                  SS4S# jr%S\R                  SS4S$ jr&S\R                  SS4S% jr'S\R                  SS4S& jr(S\R                  SS4S' jr)S\R                  SS4S( jr*S\R                  SS4S) jr+S\R                  SS4S* jr,S\R                  SS4S+ jr-S\R                  SS4S, jr.S-r/g)/DumpAST   zEDump a CEL AST creating a close approximation to the original source.astr   c                 P    U " 5       nUR                  U5        UR                  S   $ Nr   )visitstack)cls_r`   ds      r   displayDumpAST.display   s"    F	wwqzr   Nc                     / U l         g r   rd   )r   s    r   r   DumpAST.__init__   s	     "
r   treec                    [        UR                  5      S:X  a  g U R                  R                  5       nU R                  R                  5       nU R                  R                  5       nU R                  R	                  U SU SU 35        g )NrN   z ? z : lenchildrenrd   popappend)r   rl   rightleftconds        r   r-   DumpAST.expr   sl    t}}"JJNN$E::>>#D::>>#DJJ&D6UG,r   c                     [        UR                  5      S:X  a  g U R                  R                  5       nU R                  R                  5       nU R                  R	                  U SU 35        g )NrN   z || rn   r   rl   rs   rt   s       r   conditionalorDumpAST.conditionalor   V    t}}"JJNN$E::>>#DJJ&UG$r   c                     [        UR                  5      S:X  a  g U R                  R                  5       nU R                  R                  5       nU R                  R	                  U SU 35        g )NrN   z && rn   rx   s       r   conditionalandDumpAST.conditionaland   r{   r   c                     [        UR                  5      S:X  a  g U R                  R                  5       nU R                  R                  5       nU R                  R	                  U SU 35        g NrN   rQ   rn   rx   s       r   relationDumpAST.relation   V    t}}"JJNN$E::>>#DJJ&%!r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz < rd   rq   rr   r   rl   rt   s      r   relation_ltDumpAST.relation_lt   *    zz~~

TF#,'r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz <= r   r   s      r   relation_leDumpAST.relation_le   *    zz~~

TF$-(r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz > r   r   s      r   relation_gtDumpAST.relation_gt   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz >= r   r   s      r   relation_geDumpAST.relation_ge   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz == r   r   s      r   relation_eqDumpAST.relation_eq   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz != r   r   s      r   relation_neDumpAST.relation_ne   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz in r   r   s      r   relation_inDumpAST.relation_in   r   r   c                     [        UR                  5      S:X  a  g U R                  R                  5       nU R                  R                  5       nU R                  R	                  U SU 35        g r   rn   rx   s       r   additionDumpAST.addition   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz + r   r   s      r   addition_addDumpAST.addition_add   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz - r   r   s      r   addition_subDumpAST.addition_sub   r   r   c                     [        UR                  5      S:X  a  g U R                  R                  5       nU R                  R                  5       nU R                  R	                  U SU 35        g r   rn   rx   s       r   multiplicationDumpAST.multiplication   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz * r   r   s      r   multiplication_mulDumpAST.multiplication_mul   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz / r   r   s      r   multiplication_divDumpAST.multiplication_div   r   r   c                 t    U R                   R                  5       nU R                   R                  U S35        g )Nz % r   r   s      r   multiplication_modDumpAST.multiplication_mod   r   r   c                     [        UR                  5      S:X  a  g U R                  R                  5       nU R                  R                  5       nU R                  R	                  U SU 35        g r   rn   rx   s       r   unaryDumpAST.unary  r   r   c                 :    U R                   R                  S5        g )N!rd   rr   r   rl   s     r   	unary_notDumpAST.unary_not      

#r   c                 :    U R                   R                  S5        g )N-r   r   s     r   	unary_negDumpAST.unary_neg  r   r   c                     [        [        R                  UR                  S   5      R                  nU R
                  (       a;  U R
                  R                  5       nU R
                  R                  U SU 35        g g )NrN   rR   )r   larkr	   rp   rB   rd   rq   rr   rx   s       r   
member_dotDumpAST.member_dot  sZ    TZZq!1288::::>>#DJJaw/0 r   c                    [        UR                  5      S:X  a  U R                  R                  5       nOSn[	        [
        R                  UR                  S   5      R                  nU R                  (       a?  U R                  R                  5       nU R                  R                  U SU SU S35        g U R                  R                  SU SU S35        g )N   rS   rN   rR   ()	ro   rp   rd   rq   r   r   r	   rB   rr   )r   rl   exprlistrs   rt   s        r   member_dot_argDumpAST.member_dot_arg  s    t}}"zz~~'HHTZZq!1288::::>>#DJJawaz;<JJ%(156r   c                     U R                   R                  5       nU R                   R                  5       nU R                   R                  U SU S35        g N[]r   rx   s       r   member_indexDumpAST.member_index$  sA    

 zz~~

TF!E7!,-r   c                     [        UR                  5      S:X  a  U R                  R                  5       nOSnU R                  R                  5       nU R                  R	                  U SU S35        g )N   rS   {}rn   )r   rl   
fieldinitsrt   s       r   member_objectDumpAST.member_object)  sW    t}}")JJzz~~

TF"ZL34r   c                    [        UR                  5      S:X  a  U R                  R                  5       nOSn[	        [
        R                  UR                  S   5      R                  nU R                  R                  SU SU S35        g )Nr   rS   r   rR   r   r   r   r   rl   r   rt   s       r   dot_ident_argDumpAST.dot_ident_arg1  sh    t}}"zz~~'HHDJJa 0177

AdV1XJa01r   c                     [        [        R                  UR                  S   5      R                  nU R
                  R                  SU 35        g )Nr   rR   )r   r   r	   rp   rB   rd   rr   r   s      r   	dot_identDumpAST.dot_ident9  s9    DJJa 0177

AdV*%r   c                    [        UR                  5      S:X  a  U R                  R                  5       nOSn[	        [
        R                  UR                  S   5      R                  nU R                  R                  U SU S35        g )Nr   rS   r   r   r   r   r   s       r   	ident_argDumpAST.ident_arg=  sf    t}}"zz~~'HHDJJa 0177

TF!H:Q/0r   c                     U R                   R                  [        [        R                  UR
                  S   5      R                  5        g rb   )rd   rr   r   r   r	   rp   rB   r   s     r   identDumpAST.identF  s.    

$tzz4==+;<BBCr   c                     U R                   (       a:  U R                   R                  5       nU R                   R                  SU S35        g g )Nr   r   r   r   s      r   
paren_exprDumpAST.paren_exprI  8    ::::>>#DJJ$qk* r   c                     U R                   (       a:  U R                   R                  5       nU R                   R                  SU S35        g g r   r   r   s      r   list_litDumpAST.list_litN  r   r   c                     U R                   (       a:  U R                   R                  5       nU R                   R                  SU S35        g U R                   R                  S5        g )Nr   r   z{}r   r   s      r   map_litDumpAST.map_litS  sE    ::::>>#DJJ4&m,JJd#r   c                    ^  SR                  [        [        U 4S jUR                   5       5      5      5      nT R                  R                  U5        g )N, c              3   X   >#    U  H  nTR                   R                  5       v   M!     g 7fr   rd   rq   ).0_r   s     r   	<genexpr>#DumpAST.exprlist.<locals>.<genexpr>[  s     'P-Q

(8(8-s   '*)joinreversedlistrp   rd   rr   )r   rl   itemss   `  r   r   DumpAST.exprlistZ  s7    		(4'P$--'P#PQR

% r   c           	        ^  [        [        [        R                     UR                  S S S2   5      n[        [        [        R                     UR                  SS S2   5      n[        U5      [        U5      :X  d   e[        [        U 4S j[        X#5       5       5      5      nSR                  S U 5       5      nT R                  R                  U5        g )Nr   rN   c              3   t   >#    U  H-  u  pUR                   TR                  R                  5       4v   M/     g 7fr   )rB   rd   rq   )r   nvr   s      r   r   %DumpAST.fieldinits.<locals>.<genexpr>b  s)     YFXdaqww

(89FXs   58r   c              3   4   #    U  H  u  pU S U 3v   M     g7f): Nr\   )r   r   r   s      r   r   r  c  s     8%$!QCr!+%s   )r   r   r   r	   rp   ro   r   r   zipr   rd   rr   )r   rl   namesvaluespairsr   s   `     r   r   DumpAST.fieldinits^  s    T$**%t}}SqS'9:d4::&add(;<5zS[(((Yc%FXYYZ		8%88

% r   c           	      6  ^  UR                   SSS2   nUR                   SSS2   n[        U5      [        U5      :X  d   e[        [        U 4S j[	        X#5       5       5      5      nSR                  S U 5       5      nT R                  R                  U5        g)z,Note reversed pop order for values and keys.Nr   rN   c              3      >#    U  H<  u  pTR                   R                  5       TR                   R                  5       S .v   M>     g7f))rB   keyNr   )r   kr   r   s      r   r   #DumpAST.mapinits.<locals>.<genexpr>k  s5      
) jjnn&tzz~~/?@)s   AAr   c              3   :   #    U  H  oS     SUS    3v   M     g7f)r  r  rB   Nr\   )r   k_vs     r   r   r  o  s!     KUcZL3w<.9Us   )rp   ro   r   r   r  r   rd   rr   )r   rl   keysr  r  r   s   `     r   mapinitsDumpAST.mapinitsf  s    }}SqS!qt!t$4yCK''' 
D)
 
  		KUKK

% r   c                     UR                   (       aK  U R                  R                  [        [        R
                  UR                   S   5      R                  5        g g rb   )rp   rd   rr   r   r   r	   rB   r   s     r   literalDumpAST.literalr  s:    ==JJd4::t}}Q/?@FFG r   rj   rW   )0r    r!   r"   r#   rX   classmethodr   r
   r[   rg   r   r-   ry   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^   r^      sp   O499   
#	 	t 	$))  499  TYY 4 (		 (d ()		 )d )(		 (d ()		 )d ))		 )d ))		 )d ))		 )d )TYY 4 ( (t (( (t (499  (tyy (T ((tyy (T ((tyy (T ($))  dii D dii D 1tyy 1T 1
7499 
7 
7. .t .
5$)) 5 52$)) 2 2&dii &D &1dii 1D 1D$)) D D+tyy +T +
+TYY +4 +
$DII $$ $!TYY !4 !!tyy !T !
!TYY 
!4 
!HDII H$ Hr   r^   r`   r   c                 V    [        5       nUR                  U 5        UR                  S   $ )z0Dumps the AST to approximate the original sourcer   )r^   rc   rd   )r`   rf   s     r   	tree_dumpr  w  s"    	AGGCL771:r   __main__z
    account.balance >= transaction.withdrawal
    || (account.overdraftProtection
    && account.overdraftLimit >= transaction.withdrawal  - account.balance)
    z
type(null))'rX   r8   pathlibr   typingr   r   r   r   lark.visitorsr   r   r	   r
   lark.exceptionsr   r   r   r   	Exceptionr   r(   visitorsVisitor_Recursiver^   r[   r  r    prD   rG   r`   printrf   rc   rd   text2ast2prettyr\   r   r   <module>r&     s    .^ 
  , ,  " ". .I 2 2jkHdmm-- kH\4 C  z 	AD
 ''$-C	#J	AGGCL	!''NE775>D	$++-) r   