
    daf                        d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ  e j4                  dd      Zej9                  d	d
        G d de      ZddZedk(  r e        yy)    N)DictSet)build_parser)AltCutGatherGrammarVisitorGroup	Lookahead	NamedItemNameLeafNegativeLookaheadOptRepeat0Repeat1RhsRule
StringLeaf)compute_nullablescalculate_first_setsz%Calculate the first sets of a grammar)progdescriptiongrammar_filezThe grammar file)helpc                   v   e Zd Zdeeef   ddfdZdeeee   f   fdZde	dee   fdZ
dedee   fdZdedee   fd	Zdedee   fd
Zdedee   fdZdedee   fdZdedee   fdZdedee   fdZdedee   fdZdedee   fdZdedee   fdZdedee   fdZ de!dee   fdZ"dedee   fdZ#y)FirstSetCalculatorrulesreturnNc                 n    || _         t        |      | _        t               | _        t               | _        y N)r   r   	nullablesdict
first_setsset
in_process)selfr   s     ;/root/Python-3.12.4/Tools/peg_generator/pegen/first_sets.py__init__zFirstSetCalculator.__init__$   s'    
*51/3v$'E    c                     | j                   j                         D ]  \  }}| j                  |        | j                  S r    )r   itemsvisitr#   )r&   namerules      r'   	calculatezFirstSetCalculator.calculate*   s8    ****, 	JD$JJt	r)   itemc                 B   t               }t               }|j                  D ]j  }| j                  |      }t        |j                  t
              r||z  }||z  }|r||z  }d|v rDt        |j                  t        t
        t        f      rj n |j                  d       |S N )	r$   r+   r,   
isinstancer0   r   r   r   discard)r&   r0   result	to_removeothernew_terminalss         r'   	visit_AltzFirstSetCalculator.visit_Alt/   s    5!e	ZZ 	E JJu-M%**&78]*	m#F)# ]"ejj30A7*KL#	( 	rr)   c                     t               S r    )r$   r&   r0   s     r'   	visit_CutzFirstSetCalculator.visit_CutJ   s	    ur)   c                 8    | j                  |j                        S r    )r,   rhsr<   s     r'   visit_GroupzFirstSetCalculator.visit_GroupM   s    zz$((##r)   c                 8    | j                  |j                        S r    r,   noder<   s     r'   visit_PositiveLookaheadz*FirstSetCalculator.visit_PositiveLookaheadP       zz$))$$r)   c                 8    | j                  |j                        S r    rB   r<   s     r'   visit_NegativeLookaheadz*FirstSetCalculator.visit_NegativeLookaheadS   rE   r)   c                 8    | j                  |j                        S r    )r,   r0   r<   s     r'   visit_NamedItemz"FirstSetCalculator.visit_NamedItemV   rE   r)   c                 8    | j                  |j                        S r    rB   r<   s     r'   	visit_OptzFirstSetCalculator.visit_OptY   rE   r)   c                 8    | j                  |j                        S r    rB   r<   s     r'   visit_GatherzFirstSetCalculator.visit_Gather\   rE   r)   c                 8    | j                  |j                        S r    rB   r<   s     r'   visit_Repeat0z FirstSetCalculator.visit_Repeat0_   rE   r)   c                 8    | j                  |j                        S r    rB   r<   s     r'   visit_Repeat1z FirstSetCalculator.visit_Repeat1b   rE   r)   c                    |j                   | j                  vr|j                   hS |j                   | j                  vrX| j                  | j                  |j                            | j                  |j                   <   | j                  |j                      S |j                   | j                  v r
t               S | j                  |j                      S r    )valuer   r#   r,   r%   r$   r<   s     r'   visit_NameLeafz!FirstSetCalculator.visit_NameLeafe   s    ::TZZ'JJ<::T__,*.**TZZ

5K*LDOODJJ'??4::..ZZ4??*5Ltzz**r)   c                     |j                   hS r    )rS   r<   s     r'   visit_StringLeafz#FirstSetCalculator.visit_StringLeafq   s    

|r)   c                 d    t               }|j                  D ]  }|| j                  |      z  } |S r    )r$   altsr,   )r&   r0   r6   alts       r'   	visit_RhszFirstSetCalculator.visit_Rhst   s3    599 	&Cdjjo%F	&r)   c                    |j                   | j                  v r
t               S |j                   | j                  vr| j                  j	                  |j                          | j                  |j                        }|| j                  v r|j	                  d       || j                  |j                   <   | j                  j                  |j                          | j                  |j                      S r2   )	r-   r%   r$   r#   addr,   r?   r!   remove)r&   r0   	terminalss      r'   
visit_RulezFirstSetCalculator.visit_Rulez   s    99'5LYYdoo-OO		*

488,It~~%b!)2DOODII&OO""499-tyy))r)   )$__name__
__module____qualname__r   strr   r(   r   r/   r   r:   r   r=   r
   r@   r   rD   r   rG   r   rI   r   rK   r   rM   r   rO   r   rQ   r   rT   r   rV   r   rZ   r_    r)   r'   r   r   #   sy   *d39o *$ *4SX. 
c c#h 6c c#h $ $#c( $%I %#c( %%,= %#c( %%I %#c( %%c %c#h %% %CH %%' %c#h %%' %c#h %
+8 
+C 
+Z CH c c#h 
*t 
*C 
*r)   r   c                  \   t         j                         } 	 t        | j                        \  }}}t        j                        j                         }t        j                  |       y # t        $ r:}t        dt        j                         t        j                  d       Y d }~wd }~ww xY w)Nz#ERROR: Failed to parse grammar file)file   )	argparser
parse_argsr   r   	Exceptionprintsysstderrexitr   r   r/   pprint)argsgrammarparser	tokenizererr	firs_setss         r'   mainrv      s    !D%1$2C2C%D"
 #7==1;;=I
MM)  3#**Es   A( (	B+10B&&B+__main__)r   N) argparsero   rl   typingr   r   pegen.buildr   pegen.grammarr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   pegen.parser_generatorr   ArgumentParserrh   add_argumentr   rv   r`   rd   r)   r'   <module>r      s      
  $    " 5#H##	7	 
  ~,>  ?a* a*H
 zF r)   