
    @                         d dl mZmZ ddlmZmZmZ ddlmZ ddl	m
Z
mZmZ  G d d      Z G d d	      Zd
 Zd Z G d d      Zy)    )Counterdefaultdict   )bfsfzsetclassify)GrammarError)RuleTerminalNonTerminalc                   N    e Zd ZdZd Zd Zed        Zd Zed        Z	d Z
d Zy	)
RulePtrruleindexc                 x    t        |t              sJ |t        |j                        k  sJ || _        || _        y N)
isinstancer
   len	expansionr   r   )selfr   r   s      0lib/third_party/lark/parsers/grammar_analysis.py__init__zRulePtr.__init__   s7    $%%%DNN++++	
    c                    | j                   j                  d | j                   D cg c]  }|j                   }}| j                   j                  | j                  d  D cg c]  }|j                   }}d| j                   j                  j                  ddj                  |      ddj                  |      dS c c}w c c}w )N<z :  z * >)r   r   r   nameoriginjoin)r   xbeforeafters       r   __repr__z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   B= Cc                 H    | j                   j                  | j                     S r   )r   r   r   r   s    r   nextzRulePtr.next   s    yy""4::..r   c                 j    | j                   |k(  sJ t        | j                  | j                  dz         S )N   )r(   r   r   r   )r   syms     r   advancezRulePtr.advance   s-    yyCtyy$**Q,//r   c                 Z    | j                   t        | j                  j                        k(  S r   )r   r   r   r   r'   s    r   is_satisfiedzRulePtr.is_satisfied   s     zzS!4!4555r   c                 j    | j                   |j                   k(  xr | j                  |j                  k(  S r   r   )r   others     r   __eq__zRulePtr.__eq__"   s'    yyEJJ&D4::+DDr   c                 D    t        | j                  | j                  f      S r   )hashr   r   r'   s    r   __hash__zRulePtr.__hash__$   s    TYY

+,,r   N)__name__
__module____qualname__	__slots__r   r%   propertyr(   r,   r.   r1   r4    r   r   r   r      sJ    !I]
 / /0 6 6E-r   r   c                       e Zd ZdZd Zd Zy)
LR0ItemSet)kernelclosuretransitions
lookaheadsc                 z    t        |      | _        t        |      | _        i | _        t	        t
              | _        y r   )r   r=   r>   r?   r   setr@   )r   r=   r>   s      r   r   zLR0ItemSet.__init__,   s,    FmW~%c*r   c                     ddj                  | j                  D cg c]  }t        |       c}      ddj                  | j                  D cg c]  }t        |       c}      dS c c}w c c}w )N{, z | })r!   r=   reprr>   )r   rs     r   r%   zLR0ItemSet.__repr__2   s\    "ii$++(F+Qa+(FGeieqeqSreq`aTXYZT[eqSrIstt(FSrs   A*
A/N)r5   r6   r7   r8   r   r%   r:   r   r   r<   r<   )   s    BI+ur   r<   c                 <    |r| |kD  ryt        |       }| |z  } | |k7  S )NF)rB   )set1set2copys      r   
update_setrM   6   s*    4$;t9DDLD4<r   c           	      &   | D ch c]  }|j                   D ]  }|  c}}| D ch c]  }|j                   c}z  }t               }i }i }|D ]+  }|j                  r|hn	t               ||<   t               ||<   - d}|rd}| D ]  }t        |j                         |k  rt	        ||j                  h      rd}t        |j                         D ]A  \  }}t        |j                   d|       |k  r t	        ||j                     ||         s>d}A   |rd}|rd}| D ]  }t        |j                         D ]  \  }}|t        |j                         dz
  k(  st        |j                   |dz   d       |k  rt	        ||   ||j                           rd}t        |dz   t        |j                               D ]C  }	t        |j                   |dz   |	       |k  s"t	        ||   ||j                   |	            sBd}E   |r|||fS c c}}w c c}w )zhCalculate FOLLOW sets.

    Adapted from: http://lara.epfl.ch/w/cc09:algorithm_for_first_and_follow_setsTFNr*   )r   r    rB   is_termrM   	enumerater   range)
rulesr   r+   symbolsNULLABLEFIRSTFOLLOWchangedijs
             r   calculate_setsrZ   >   s     %?utssu?[`Ba[`SW4;;[`BaaG uHEFKKC5SUc
Es 
 G
D4>>"h.h6"G#DNN33t~~bq)*h6!%"4eCjA"& 4    G
D#DNN33c$..)!++s4>>!A#$3G/HH/T!&+vdkk/BC"&qsC$78A4>>!A#a01X=%fSk59J3KL&*G 9 4   &(""o @Bas
   HHc                       e Zd ZddZddZy)GrammarAnalyzerc                    || _         || _        |j                  D ci c]/  }|t        t	        d|z         t	        |      t        d      g      1 }}|j                  t        |j                               z   }t        |d       | _
        t        |      t        t        |            k7  rUt        |      j                         D cg c]  \  }}|dkD  s| }	}}t        ddj!                  d |	D              z        |D ]<  }
|
j"                  D ]+  }|j$                  r|| j                  v rt        d|z         > |j                         D ci c]!  \  }}|| j'                  |j(                        # c}}| _        |j                         D ci c]/  \  }}|t-        t/        |t        |j"                              h      1 c}}| _        |j                  D ci c]%  }|t        t	        d|z         t	        |      g      ' }}|j                  t        |j                               z   }t        |      t        t        |            k(  sJ t        |d	       | _        |j                         D ci c]A  \  }}|t5        t/        |d
      g| j'                  |j(                  | j2                              C c}}| _        t9        |      \  | _        | _        | _        y c c}w c c}}w c c}}w c c}}w c c}w c c}}w )Nz$root_z$ENDc                     | j                   S r   r    rH   s    r   <lambda>z*GrammarAnalyzer.__init__.<locals>.<lambda>   s    r   r*   zRules defined twice: %srE   c              3   2   K   | ]  }t        |        y wr   )str).0rX   s     r   	<genexpr>z+GrammarAnalyzer.__init__.<locals>.<genexpr>   s     D`U_PQSVU_s   zUsing an undefined rule: %sc                     | j                   S r   r_   r`   s    r   ra   z*GrammarAnalyzer.__init__.<locals>.<lambda>   s    r   r   ) debugstrictstartr
   r   r   rR   listvaluesr   rules_by_originr   rB   r   itemsr	   r!   r   rO   expand_ruler    start_statesr   r   
end_stateslr0_rules_by_originr<   lr0_start_statesrZ   rU   rV   rT   )r   parser_confrg   rh   ri   
root_rulesrR   itemcount
duplicatesrH   r+   	root_rulelr0_root_rules	lr0_ruless                  r   r   zGrammarAnalyzer.__init__}   s   
 $/#4#46#4% T+h.>"?+eBTV^_eVfAghh#4 	 6 !!D):):)<$=='/ABu:SZ(29%.2F2F2HV2H;4ETUI$2HJV8499D`U_D`;``aaA{{sd.B.B'B&'Ds'JKK #  6@5E5E5GI5G!1	 #D$4$4Y5E5E$FF5GI 4>3C3C3EG3E/ui !%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(<(<(>!@(>$E9 "'
GIq4I3JDL\L\]f]m]mos  pH  pH  MI  )J  "J(>!@ 2@1F.
DKC6 WIG0!@s*   4K(K-K-&K34K9!*K?:ALNc                 |    | j                   t               fd}t        |g|      D ]  } t              S )z4Returns all init_ptrs accessible by rule (recursive)c              3      K   | j                   rJ |        |    D ]I  }t        |d      }j                  |       |j                  s-|j                  }|j                   rF| K y w)Nr   )rO   r   addr   r(   )r   rH   init_ptrnew_r	init_ptrsrl   s       r   _expand_rulez1GrammarAnalyzer.expand_rule.<locals>._expand_rule   s[     ||)T)#$T*"1a=h';;$MME ==# +s   AA)	A)"A))rl   rB   r   r   )r   source_rulerl   r   _r   s     `  @r   rn   zGrammarAnalyzer.expand_rule   sG     ""22OE	
	$ k]L1A 2 Yr   )FFr   )r5   r6   r7   r   rn   r:   r   r   r\   r\   |   s    %GN r   r\   N)collectionsr   r   utilsr   r   r   
exceptionsr	   grammarr
   r   r   r   r<   rM   rZ   r\   r:   r   r   <module>r      sC    , ( ( % 1 1- -B
u 
u;#|>  > r   