
    @                         S SK JrJr  SSKJrJrJr  SSKJr  SSK	J
r
JrJr   " S S5      r " S S	5      rS
 rS r " S S5      rg)    )Counterdefaultdict   )bfsfzsetclassify)GrammarError)RuleTerminalNonTerminalc                   V    \ rS rSrSrS rS r\S 5       rS r	\S 5       r
S rS	 rS
rg)RulePtr   ruleindexc                     [        U[        5      (       d   eU[        UR                  5      ::  d   eXl        X l        g N)
isinstancer
   len	expansionr   r   )selfr   r   s      0lib/third_party/lark/parsers/grammar_analysis.py__init__RulePtr.__init__   s6    $%%%%DNN++++	
    c                    U R                   R                  S U R                    Vs/ s H  oR                  PM     nnU R                   R                  U R                  S   Vs/ s H  oR                  PM     nnSU R                   R                  R                  < SSR                  U5      < SSR                  U5      < S3$ s  snf s  snf )N<z :  z * >)r   r   r   nameoriginjoin)r   xbeforeafters       r   __repr__RulePtr.__repr__   s    "&))"5"5ktzz"BC"BQ&&"BC!%!4!4TZZ[!AB!AA!AB#'99#3#3#8#8#((6:JCHHUZO\\ DBs   C"C	c                 H    U R                   R                  U R                     $ r   )r   r   r   r   s    r   nextRulePtr.next   s    yy""4::..r   c                 l    U R                   U:X  d   e[        U R                  U R                  S-   5      $ )N   )r+   r   r   r   )r   syms     r   advanceRulePtr.advance   s-    yyCtyy$**Q,//r   c                 Z    U R                   [        U R                  R                  5      :H  $ r   )r   r   r   r   r*   s    r   is_satisfiedRulePtr.is_satisfied   s     zzS!4!4555r   c                 t    U R                   UR                   :H  =(       a    U R                  UR                  :H  $ r   r   )r   others     r   __eq__RulePtr.__eq__"   s'    yyEJJ&D4::+DDr   c                 D    [        U R                  U R                  45      $ r   )hashr   r   r*   s    r   __hash__RulePtr.__hash__$   s    TYY

+,,r   )r   r   N)__name__
__module____qualname____firstlineno__	__slots__r   r'   propertyr+   r0   r3   r7   r;   __static_attributes__ r   r   r   r      sJ    !I]
 / /0 6 6E-r   r   c                   $    \ rS rSrSrS rS rSrg)
LR0ItemSet)   )kernelclosuretransitions
lookaheadsc                 z    [        U5      U l        [        U5      U l        0 U l        [	        [
        5      U l        g r   )r   rH   rI   rJ   r   setrK   )r   rH   rI   s      r   r   LR0ItemSet.__init__,   s,    FmW~%c*r   c                     SSR                  U R                   Vs/ s H  n[        U5      PM     sn5      < SSR                  U R                   Vs/ s H  n[        U5      PM     sn5      < S3$ s  snf s  snf )N{, z | })r#   rH   reprrI   )r   rs     r   r'   LR0ItemSet.__repr__2   s\    "ii$++(F+Qa+(FGeieqeqSreq`aTXYZT[eqSrIstt(FSrs   A2
A7)rI   rH   rK   rJ   N)r=   r>   r?   r@   rA   r   r'   rC   rD   r   r   rF   rF   )   s    BI+ur   rF   c                 B    U(       a  X:  a  g[        U 5      nX-  n X:g  $ )NF)rM   )set1set2copys      r   
update_setrZ   6   s$    4;t9DLD<r   c           	         U  VVs1 s H  oR                     H  o"iM     M     snnU  Vs1 s H  oR                  iM     sn-  n[        5       n0 n0 nU H/  nUR                  (       a  U1O	[        5       XR'   [        5       Xb'   M1     SnU(       a  SnU  H  n[        UR                   5      U::  a  [	        XAR                  15      (       a  Sn[        UR                   5       HG  u  p[        UR                   SU 5      U::  a%  [	        XQR                     XR   5      (       a  SnMD  MF    M     M     U(       a  M  SnU(       a  SnU  H  n[        UR                   5       H  u  pU[        UR                   5      S-
  :X  d  [        UR                   US-   S 5      U::  a!  [	        Xb   XaR                     5      (       a  Sn[        US-   [        UR                   5      5       HJ  n	[        UR                   US-   U	 5      U::  d  M$  [	        Xb   XQR                   U	      5      (       d  MH  SnML     M     M     U(       a  M  XVU4$ s  snnf s  snf )zdCalculate FOLLOW sets.

Adapted from: http://lara.epfl.ch/w/cc09:algorithm_for_first_and_follow_setsTFNr.   )r   r"   rM   is_termrZ   	enumerater   range)
rulesr   r/   symbolsNULLABLEFIRSTFOLLOWchangedijs
             r   calculate_setsrg   >   s     %?utssu?[`Ba[`SW;;[`BaaG uHEFKKC5SU
E 
 G
D4>>"h.h66"G#DNN3t~~bq)*h6!%"4ejAA"& B  4  '  G
D#DNN3c$..)!++s4>>!A#$3G/HH/T!&+vkk/BCC"&qsC$78A4>>!A#a01X=%fk59J3KLL&*G 9 4  ' (""o @Bas
   IIc                   (    \ rS rSrSS jrSS jrSrg)GrammarAnalyzer|   c                 H   X l         X0l        UR                   Vs0 s H0  nU[        [	        SU-   5      [	        U5      [        S5      /5      _M2     nnUR                  [        UR                  5       5      -   n[        US 5      U l
        [        U5      [        [        U5      5      :w  aY  [        U5      R                  5        VVs/ s H  u  pxUS:  d  M  UPM     n	nn[        SSR!                  S U	 5       5      -  5      eU HF  n
U
R"                   H3  nUR$                  (       a  M  XR                  ;   a  M'  [        SU-  5      e   MH     UR                  5        VVs0 s H   u  pLX@R'                  UR(                  5      _M"     snnU l        UR                  5        VVs0 s H/  u  pLU[-        [/        U[        UR"                  5      5      15      _M1     snnU l        UR                   Vs0 s H&  nU[        [	        SU-   5      [	        U5      /5      _M(     nnUR                  [        UR                  5       5      -   n[        U5      [        [        U5      5      :X  d   e[        US	 5      U l        UR                  5        VVs0 s HA  u  pLU[5        [/        US
5      /U R'                  UR(                  U R2                  5      5      _MC     snnU l        [9        U5      u  U l        U l        U l        g s  snf s  snnf s  snnf s  snnf s  snf s  snnf )Nz$root_z$ENDc                     U R                   $ r   r"   rT   s    r   <lambda>*GrammarAnalyzer.__init__.<locals>.<lambda>   s    r   r.   zRules defined twice: %srQ   c              3   8   #    U  H  n[        U5      v   M     g 7fr   )str).0re   s     r   	<genexpr>+GrammarAnalyzer.__init__.<locals>.<genexpr>   s     D`U_PQSVVU_s   zUsing an undefined rule: %sc                     U R                   $ r   rm   rn   s    r   ro   rp      s    r   r   ) debugstrictstartr
   r   r   r_   listvaluesr   rules_by_originr   rM   r   itemsr	   r#   r   r\   expand_ruler"   start_statesr   r   
end_stateslr0_rules_by_originrF   lr0_start_statesrg   rb   rc   ra   )r   parser_confrw   rx   ry   
root_rulesr_   itemcount
duplicatesrT   r/   	root_rulelr0_root_rules	lr0_ruless                  r   r   GrammarAnalyzer.__init__}   s   
 $/#4#46#4% T+h.>"?+eBTV^_eVfAghh#4 	 6 !!D):):)<$=='/ABu:SZ(29%.2F2F2HV2H;4ETUI$2HJV8499D`U_D`;``aaA{{s.B.B'B&'Ds'JKK #  6@5E5E5GI5G!1 #$4$4Y5E5E$FF5GI 4>3C3C3EG3E/u !%C	@S@S<T)U(V"WW3EG )..0.E  k(U2B&CkRWFXEY!ZZ. 	 0  %%^-B-B-D(EE	9~S^!4454#+I7I#J  )7(<(<(>!@(>$E "'
GIq4I3JDL\L\]f]m]mos  pH  pH  MI  )J  "J(>!@ 2@1F.
DKC6 WIG0!@s*   7L	LL%'L(6L5-LALNc                    ^^ Tc  U R                   m[        5       mUU4S jn[        U/U5       H  nM     [        T5      $ )z4Returns all init_ptrs accessible by rule (recursive)c              3      >#    U R                   (       a   U 5       eTU     HV  n[        US5      nTR                  U5        UR                  (       d  M3  UR                  nUR                   (       a  MR  Uv   MX     g 7f)Nr   )r\   r   addr   r+   )r   rT   init_ptrnew_r	init_ptrsr|   s       r   _expand_rule1GrammarAnalyzer.expand_rule.<locals>._expand_rule   s^     ||)T)#$T*"1a=h';;;$MME ===# +s   AA<A<3	A<)r|   rM   r   r   )r   source_ruler|   r   _r   s     `  @r   r~   GrammarAnalyzer.expand_rule   sG     ""22OE	
	$ k]L1A 2 Yr   )
rb   rc   ra   rw   r   r   r   r|   r   rx   )FFr   )r=   r>   r?   r@   r   r~   rC   rD   r   r   ri   ri   |   s    %GN r   ri   N)collectionsr   r   utilsr   r   r   
exceptionsr	   grammarr
   r   r   r   rF   rZ   rg   ri   rD   r   r   <module>r      sC    , ( ( % 1 1- -B
u 
u;#|>  > r   