
    dafp/                        d dl Z d dlZd dl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 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#m$Z$m%Z%m&Z&  G d de      Z' G d d	e      Z( G d
 de      Z) G d d      Z* G d de      Z+de	e,e%f   dee   fdZ- G d de      Z.de	e,e%f   dee	e,ee,   f   eee,      f   fdZ/de	e,e%f   de	e,ee,   f   fdZ0y)    N)abstractmethod)IOAbstractSetAnyDictIterableIteratorListOptionalSetTextTupleUnion)sccutils)AltCutForcedGatherGrammarGrammarErrorGrammarVisitorGroup	Lookahead	NamedItemNameLeafOptPlainRepeat0Repeat1RhsRule
StringLeafc                   N    e Zd ZdZdeeef   deddfdZdeddfdZ	d	e
ddfd
Zy)RuleCollectorVisitorzPVisitor that invokes a provieded callmaker visitor with just the NamedItem nodesrulescallmakervisitorreturnNc                      || _         || _        y N)rulses	callmaker)selfr%   r&   s      A/root/Python-3.12.4/Tools/peg_generator/pegen/parser_generator.py__init__zRuleCollectorVisitor.__init__.   s    )    rulec                 B    | j                  |j                                y r)   )visitflattenr,   r0   s     r-   
visit_RulezRuleCollectorVisitor.visit_Rule2   s    

4<<>"r/   itemc                 :    | j                   j                  |       y r)   )r+   r2   r,   r6   s     r-   visit_NamedItemz$RuleCollectorVisitor.visit_NamedItem5   s    T"r/   )__name__
__module____qualname____doc__r   strr!   r   r.   r5   r   r9    r/   r-   r$   r$   +   sN    Z*d39o * *TX *#t # ##I #$ #r/   r$   c                   D    e Zd ZdZdddeeef   dee   fdZde	dd	fd
Z
y	)KeywordCollectorVisitorzFVisitor that collects all the keywods and soft keywords in the GrammargenParserGeneratorkeywordssoft_keywordsc                 .    || _         || _        || _        y r)   )	generatorrD   rE   )r,   rB   rD   rE   s       r-   r.   z KeywordCollectorVisitor.__init__<   s     *r/   noder'   Nc                    t        j                  |j                        }t        j                  d|      r|j                  j                  d      r@|j                  | j                  vr(| j                  j                         | j                  |<   y | j                  j                  |j                  j                  dd            S y )Nz[a-zA-Z_]\w*\Z'" )astliteral_evalvaluerematchendswithrD   rG   keyword_typerE   addreplace)r,   rH   vals      r-   visit_StringLeafz(KeywordCollectorVisitor.visit_StringLeafA   s    tzz*88%s+zz""3'DJJdmm,K%)^^%@%@%Bc"))--djj.@.@b.IJJ	 ,r/   )r:   r;   r<   r=   r   r>   intr   r.   r"   rW   r?   r/   r-   rA   rA   9   sE    P+- +c3h +X[\_X` +
KZ KD Kr/   rA   c                   L    e Zd Zdeeef   dee   fdZdeddfdZ	de
ddfdZy)	RuleCheckingVisitorr%   tokensc                      || _         || _        y r)   )r%   r[   )r,   r%   r[   s      r-   r.   zRuleCheckingVisitor.__init__K   s    
r/   rH   r'   Nc                     |j                   | j                  vr1|j                   | j                  vrt        d|j                         y y )NzDangling reference to rule )rO   r%   r[   r   r,   rH   s     r-   visit_NameLeafz"RuleCheckingVisitor.visit_NameLeafO   sA    ::TZZ'DJJdkk,I!<TZZNKLL -J'r/   c                     |j                   r4|j                   j                  d      rt        d|j                    d      | j                  |j                         y )N_z.Variable names cannot start with underscore: 'rJ   )name
startswithr   r2   r6   r^   s     r-   r9   z#RuleCheckingVisitor.visit_NamedItemS   sG    99--c2!OPTPYPY{Z[\]]

499r/   )r:   r;   r<   r   r>   r!   r   r.   r   r_   r   r9   r?   r/   r-   rZ   rZ   J   sJ    d39o s3x M8 M MI $ r/   rZ   c                   T   e Zd ZU eed<   dedee   dee	e
      fdZddZej                  ded   fd	       Zedee   fd
       Zededdfd       Zej                  ded   fd       ZdeddfdZdeddfdZddZdefdZdedefdZdede defdZ!de"defdZ#dedefdZ$y)rC   r&   grammarr[   filec                 D   || _         || _        i | _        t               | _        |j
                  | _        | j                          d|j                  vrd| j
                  vrt        d      t        | j
                  | j                        }| j
                  j                         D ]  }|j                  |        || _        d| _        t        | j
                        \  | _        | _        d| _        d| _        | j
                  j'                         | _        g | _        y )Ntrailerstartz2Grammar without a trailer must have a 'start' ruler   i  )re   r[   rD   setrE   r%   validate_rule_namesmetasr   rZ   valuesr2   rf   levelcompute_left_recursivesfirst_graph
first_sccscounterkeyword_countercopy	all_rules_local_variable_stack)r,   re   r[   rf   checkerr0   s         r-   r.   zParserGenerator.__init__]   s    (*'*u]]
  "GMM)gTZZ.GSTT%djj$++>JJ%%' 	 DMM$	 	
,CDJJ,O)$/"*.**//*;68"r/   r'   Nc                 f    | j                   D ]"  }|j                  d      st        d| d       y )Nra   z*Rule names cannot start with underscore: 'rJ   )r%   rc   r   r4   s     r-   rk   z#ParserGenerator.validate_rule_namesq   s:    JJ 	YDs#"%OPTvUV#WXX	Yr/   c              #   ~   K   | j                   j                  g        d  | j                   j                          y wr)   )rv   appendpopr,   s    r-   local_variable_contextz&ParserGenerator.local_variable_contextv   s/     ""))"-""&&(s   ;=c                      | j                   d   S )N)rv   r|   s    r-   local_variable_namesz$ParserGenerator.local_variable_names|   s    ))"--r/   filenamec                     t         r)   )NotImplementedError)r,   r   s     r-   generatezParserGenerator.generate   s    !!r/   c              #      K   | xj                   dz  c_         	 d  | xj                   dz  c_         y # | xj                   dz  c_         w xY wwN   )rn   r|   s    r-   indentzParserGenerator.indent   s5     

a
	JJ!OJDJJ!OJs   A3 AA

Aargsc                     |st        | j                         y t        d| j                  z  d| j                         t        |d| j                  i y )N)rf   z    rL   )endrf   rf   )printrf   rn   )r,   r   s     r-   r   zParserGenerator.print   s;    tyy!&4::%2DII>4(dii(r/   linesc                 P    |j                         D ]  }| j                  |        y r)   )
splitlinesr   )r,   r   lines      r-   
printblockzParserGenerator.printblock   s&    $$& 	DJJt	r/   c                    t        | | j                  | j                        }| j                  j	                         D ]  }|j                  |        t        | j                  | j                        }t               }	 t        | j                        }|D cg c]	  }||vs| }}|sy t        | j                        }|D ]   }|j                  | j                  |          " gc c}w r)   )rA   rD   rE   ru   rm   r2   r$   r%   r&   rj   list)	r,   keyword_collectorr0   rule_collectordonecomputed_rulesitodorulenames	            r-   collect_ruleszParserGenerator.collect_rules   s    3D$--I[I[\NN))+ 	*D##D)	* .djj$:O:OP!$..1N-?!$A?D?t~~&D  ?$$T^^H%=>? ?s   	C$ C$c                 D    | xj                   dz  c_         | j                   S r   )rs   r|   s    r-   rS   zParserGenerator.keyword_type   s    !###r/   rhsc                     | xj                   dz  c_         d| j                    }t        |d |      | j                  |<   |S )Nr   _tmp_)rr   r!   ru   )r,   r   rb   s      r-   artifical_rule_from_rhsz'ParserGenerator.artifical_rule_from_rhs   s<    t||n%#D$4tr/   rH   
is_repeat1c                     | xj                   dz  c_         |rd}nd}| | j                    }t        |d t        t        t	        d |      g      g            | j
                  |<   |S )Nr   _loop1__loop0_)rr   r!   r    r   r   ru   )r,   rH   r   prefixrb   s        r-   artificial_rule_from_repeatz+ParserGenerator.artificial_rule_from_repeat   sb    FF$,,(#D$S)D$:O9P5Q4R0STtr/   c           	         | xj                   dz  c_         d| j                    }| xj                   dz  c_         d| j                    }t        t        d |j                        t        d|j                        gd      }t        |d t        |g            | j                  |<   t        t        d|j                        t        dt        |            g      }t        |d t        |g            | j                  |<   |S )Nr   _gather_r   elem)actionseq)	rr   r   r   	separatorrH   r!   r    ru   r   )r,   rH   rb   extra_function_nameextra_function_altalts         r-   artifical_rule_from_gatherz*ParserGenerator.artifical_rule_from_gather   s    $,,( '~6 tT^^,i		.JK
 /3#$%/
*+
 vtyy)9UHEX<Y+Z[
  $J 
t
 r/   rb   c                     |}d}|| j                   v r|dz  }| d| }|| j                   v r| j                   j                  |       |S )Nr   r   ra   )r   rz   )r,   rb   orignamerr   s       r-   dedupezParserGenerator.dedupe   s^    d///qLGZq	*D d/// 	!!((.r/   )r'   N)%r:   r;   r<   r   __annotations__r   r   r>   r   r   r   r.   rk   
contextlibcontextmanagerr	   r}   propertyr
   r   r   r   r   objectr   r   r   rX   rS   r    r   r   boolr   r   r   r   r?   r/   r-   rC   rC   Y   sJ   $$9 9S 9"T(AS 9(Y
 ) ) )
 .d3i . . " " " "   )6 )d )  ? $c $3 3  4 C v # 03 3 r/   rC   c                      e Zd Zdeeef   ddfdZdedefdZde	defdZ
d	edefd
ZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZ de!defdZ"y)NullableVisitorr%   r'   Nc                 N    || _         t               | _        t               | _        y r)   )r%   rj   visited	nullablesr,   r%   s     r-   r.   zNullableVisitor.__init__   s    
!$69er/   r0   c                     || j                   v ry| j                   j                  |       | j                  |j                        r| j                  j                  |       || j                  v S NF)r   rT   r2   r   r   r4   s     r-   r5   zNullableVisitor.visit_Rule   sT    4<<::dhhNNt$t~~%%r/   r   c                 L    |j                   D ]  }| j                  |      s y y)NTF)altsr2   )r,   r   r   s      r-   	visit_RhszNullableVisitor.visit_Rhs   s(    88 	Czz#	 r/   r   c                 L    |j                   D ]  }| j                  |      r y y)NFT)itemsr2   )r,   r   r6   s      r-   	visit_AltzNullableVisitor.visit_Alt   s)    II 	D::d#	 r/   forcec                      yNTr?   r,   r   s     r-   visit_ForcedzNullableVisitor.visit_Forced       r/   	lookaheadc                      yr   r?   r,   r   s     r-   visit_LookAheadzNullableVisitor.visit_LookAhead   r   r/   optc                      yr   r?   )r,   r   s     r-   	visit_OptzNullableVisitor.visit_Opt   r   r/   repeatc                      yr   r?   r,   r   s     r-   visit_Repeat0zNullableVisitor.visit_Repeat0   r   r/   c                      yr   r?   r   s     r-   visit_Repeat1zNullableVisitor.visit_Repeat1      r/   gatherc                      yr   r?   )r,   r   s     r-   visit_GatherzNullableVisitor.visit_Gather  r   r/   cutc                      yr   r?   r,   r   s     r-   	visit_CutzNullableVisitor.visit_Cut	  r   r/   groupc                 8    | j                  |j                        S r)   )r2   r   )r,   r   s     r-   visit_GroupzNullableVisitor.visit_Group  s    zz%))$$r/   r6   c                     | j                  |j                        r| j                  j                  |       || j                  v S r)   )r2   r6   r   rT   r8   s     r-   r9   zNullableVisitor.visit_NamedItem  s3    ::dii NNt$t~~%%r/   rH   c                     |j                   | j                  v r(| j                  | j                  |j                            S yr   )rO   r%   r2   r^   s     r-   r_   zNullableVisitor.visit_NameLeaf  s1    ::#::djj455r/   c                     |j                    S r)   rO   r^   s     r-   rW   z NullableVisitor.visit_StringLeaf  s    ::~r/   )#r:   r;   r<   r   r>   r!   r.   r   r5   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   r   r_   r"   rW   r?   r/   r-   r   r      s'   <d39o <$ <
&t & &S T S T & T  t S T G  G  6 d S T % %4 %&I &$ &
8  Z D r/   r   r%   r'   c                 |    t        |       }| j                         D ]  }|j                  |        |j                  S )zlCompute which rules in a grammar are nullable.

    Thanks to TatSu (tatsu/leftrec.py) for inspiration.
    )r   rm   r2   r   )r%   nullable_visitorr0   s      r-   compute_nullablesr     s>    
 'u- %t$%%%%r/   c            	           e Zd Zdeeef   ddfdZdee   de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)InitialNamesVisitorr%   r'   Nc                 2    || _         t        |      | _        y r)   )r%   r   r   r   s     r-   r.   zInitialNamesVisitor.__init__+  s    
*51r/   rH   r   kwargsc                     t               }|D ]L  }t        |t              r!|D ]  }| | j                  |g|i |z  } 4| | j                  |g|i |z  }N |S r)   )rj   
isinstancer   r2   )r,   rH   r   r   namesrO   r6   s          r-   generic_visitz!InitialNamesVisitor.generic_visit/  sx    % 	<E%&! ?DZTZZ>t>v>>E? E;D;F;;	< r/   r   c                     t               }|j                  D ]'  }|| j                  |      z  }|| j                  vs& |S  |S r)   )rj   r   r2   r   )r,   r   r   r6   s       r-   r   zInitialNamesVisitor.visit_Alt9  sJ    %II 	DTZZ%%E4>>)		 r/   r   c                     t               S r)   rj   r   s     r-   r   z InitialNamesVisitor.visit_ForcedA  	    ur/   r   c                     t               S r)   r   r   s     r-   r   z#InitialNamesVisitor.visit_LookAheadD  r   r/   r   c                     t               S r)   r   r   s     r-   r   zInitialNamesVisitor.visit_CutG  r   r/   c                     |j                   hS r)   r   r^   s     r-   r_   z"InitialNamesVisitor.visit_NameLeafJ  s    

|r/   c                     t               S r)   r   r^   s     r-   rW   z$InitialNamesVisitor.visit_StringLeafM  r   r/   )r:   r;   r<   r   r>   r!   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   r_   r"   rW   r?   r/   r-   r   r   *  s    2d39o 2$ 2(3-  s sSVx S SX & SX  s3x S SX 8 C Z CH r/   r   c                    t        |       }t        t        j                  |j	                         |            }|D ]  }t        |      dkD  rw|D ]  }d| |   _         t        |      }|D ]@  }t        j                  |||      D ]$  }||t        |      z
  z  }|rt        d| d       B t        |      }d| |   _        t        |      }|||   v sd| |   _        d| |   _         ||fS )Nr   TzSCC zC has no leadership candidate (no element is included in all cycles))make_first_graphr   r   strongly_connected_componentskeyslenleft_recursiverj   find_cycles_in_scc
ValueErrorminleader)	r%   graphsccssccrb   leadersri   cycler  s	            r-   ro   ro   Q  s    U#E66uzz|UKLD *s8a< 2-1d*2 #hG %88UK EsSZ//G"("3%'jk 	 \F#'E&M s8DuT{"-1d*%)d"+*, $;r/   c                     t        |       }i }t               }| j                         D ]   \  }}|j                  |      x||<   }||z  }" |D ]  }|j	                  |t                       |S )zCompute the graph of left-invocations.

    There's an edge from A to B if A may invoke B at its initial
    position.

    Note that this requires the nullable flags to have been computed.
    )r   rj   r   r2   
setdefault)r%   initial_name_visitorr  verticesr   r   r   vertexs           r-   r   r   o  s     /u5EH #"6"<"<S"AAh%E  ('(Lr/   )1rM   r   rP   abcr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   pegenr   pegen.grammarr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r$   rA   rZ   rC   r   r>   r   r   ro   r   r?   r/   r-   <module>r     s   
  	         ,#> #Kn K". A AH?n ?D&T#t)_ &S &$. $NT	?
4[%%&[-=(>>?<DdO S+c:J5J0K r/   