
    daf#                         d dl Z d dlmZ d dlmZmZ  ej                  d        ej                  d      5  d dlm	Z
 d dlmZ d dlmZ d dlmZ ddd        G d	 d
e j"                        Zy# 1 sw Y   xY w)    N)
test_tools)DictSetpeg_generator)GeneratedParser)parse_string)FirstSetCalculator)Grammarc                       e Zd Zdedeeee   f   fdZddZddZddZ	ddZ
dd	Zdd
ZddZddZddZddZddZddZddZddZddZddZddZddZddZddZddZy)TestFirstSetsgrammar_sourcereturnc                 h    t        |t              }t        |j                        j	                         S )N)r   GrammarParserr	   rules	calculate)selfr   grammars      B/root/Python-3.12.4/Lib/test/test_peg_generator/test_first_sets.pycalculate_first_setsz"TestFirstSets.calculate_first_sets   s&    'F!'--0::<<    Nc                 d    d}| j                  | j                  |      ddhddhh dh dd       y )Nz~
            start: expr NEWLINE? ENDMARKER
            expr: A | B
            A: 'a' | '-'
            B: 'b' | '+'
        'a''-''+''b'>   r   r   r   r   )ABexprstartassertEqualr   r   r   s     r   test_alternativeszTestFirstSets.test_alternatives   s@     	%%g.U^U^45		
r   c                 X    d}| j                  | j                  |      h dh dd       y )NzK
            start: expr NEWLINE
            expr: ['a'] ['b'] 'c'
           r   r   'c')r   r    r!   r#   s     r   test_optionalszTestFirstSets.test_optionals$   s2     	%%g.-.	
r   c                 T    d}| j                  | j                  |      dhdhd       y NzA
        start: ','.thing+ NEWLINE
        thing: NUMBER
        NUMBERthingr    r!   r#   s     r   test_repeat_with_separatorz(TestFirstSets.test_repeat_with_separator1   3     	%%g.jH:6	
r   c                 \    d}| j                  | j                  |      dhddhddhd       y )NzR
        start: sum NEWLINE
        sum: (term)? 'b'
        term: NUMBER
        r+   r   termsumr    r!   r#   s     r   test_optional_operatorz$TestFirstSets.test_optional_operator;   sA    
 	%%g.!
 %(*	
r   c                 \    d}| j                  | j                  |      dhddhddhd       y )NzQ
        start: sum NEWLINE
        sum: '+' ? term
        term: NUMBER
        r+   r   r1   r!   r#   s     r   test_optional_literalz#TestFirstSets.test_optional_literalJ   sA    
 	%%g.!
x(*	
r   c                 T    d}| j                  | j                  |      dhdhd       y )Nz@
        start: term NEWLINE
        term: NUMBER ['+']
        r+   r2   r    r!   r#   s     r   test_optional_afterz!TestFirstSets.test_optional_afterY   s3     	%%g.Z8*5	
r   c                 X    d}| j                  | j                  |      ddhddhd       y )Nz@
        start: term NEWLINE
        term: ['+'] NUMBER
        r+   r   r8   r!   r#   s     r   test_optional_beforez"TestFirstSets.test_optional_beforec   s9     	%%g.&(E1BC	
r   c                 V    d}| j                  | j                  |      dhddhd       y )NzA
        start: thing* "+" NEWLINE
        thing: NUMBER
        r+   z"+"r,   r!   r#   s     r   test_repeat_0zTestFirstSets.test_repeat_0m   s6     	%%g.jE8+<=	
r   c                 V    d}| j                  | j                  |      dhddhd       y )NzE
        start: ('+' '-')* term NEWLINE
        term: NUMBER
        r+   r   r8   r!   r#   s     r   test_repeat_0_with_groupz&TestFirstSets.test_repeat_0_with_groupw   s6     	%%g.Z5(*;<	
r   c                 T    d}| j                  | j                  |      dhdhd       y )NzA
        start: thing+ '-' NEWLINE
        thing: NUMBER
        r+   r,   r!   r#   s     r   test_repeat_1zTestFirstSets.test_repeat_1   r/   r   c                 T    d}| j                  | j                  |      dhdhd       y )NzF
        start: ('+' term)+ term NEWLINE
        term: NUMBER
        r+   r   r8   r!   r#   s     r   test_repeat_1_with_groupz&TestFirstSets.test_repeat_1_with_group   s2     	%%g.(ug0V	
r   c                 T    d}| j                  | j                  |      dhdhd       y r*   r!   r#   s     r   test_gatherzTestFirstSets.test_gather   r/   r   c                 Z    d}| j                  | j                  |      dhdhh dd       y )NzY
        start: expr NEWLINE
        expr: &'a' opt
        opt: 'a' | 'b' | 'c'
        r   r&   )r   r    optr!   r#   s     r   test_positive_lookaheadz%TestFirstSets.test_positive_lookahead   s9    
 	%%g.,	
r   c                 ^    d}| j                  | j                  |      h dddhddhd       y )NzY
        start: expr NEWLINE
        expr: !'a' opt
        opt: 'a' | 'b' | 'c'
        r&   r   r'   )rG   r   r    r!   r#   s     r   test_negative_lookaheadz%TestFirstSets.test_negative_lookahead   s=    
 	%%g.,	
r   c           
      h    d}| j                  | j                  |      ddhdhddhdhdhdhd       y )Nz
        start: expr NEWLINE
        expr: ('-' term | expr '+' term | term)
        term: NUMBER
        foo: 'foo'
        bar: 'bar'
        baz: 'baz'
        r+   r   z'foo'z'bar'z'baz')r   r2   r    foobarbazr!   r#   s     r   test_left_recursionz!TestFirstSets.test_left_recursion   sP     	%%g.!5)!
"E*yyy
	
r   c                 X    d}| j                  | j                  |      ddhddhd       y )Nz@
        start: NUMBER | sign start
        sign: ['-']
        r    r+   )signr    r!   r#   s     r   test_advance_left_recursionz)TestFirstSets.test_advance_left_recursion   s8     	%%g.R[E8+<=	
r   c                 \    d}| j                  | j                  |      ddhdhddhd       y )NzV
        start: foo 'E'
        foo: bar 'A' | 'B'
        bar: foo 'C' | 'D'
        z'D'z'B')rL   rM   r    r!   r#   s     r   test_mutual_left_recursionz(TestFirstSets.test_mutual_left_recursion   s?    
 	%%g.u~w	
r   c                 f    d}| j                  | j                  |      t               dhdhd       y )Nzf
        start: target '='
        target: maybe '+' | NAME
        maybe: maybe '-' | target
        NAME)maybetargetr    )r"   r   setr#   s     r   test_nasty_left_recursionz'TestFirstSets.test_nasty_left_recursion   s7    
 	%%g.ex6(C	
r   c                 \    d}| j                  | j                  |      ddhdhddhd       y )NzO
        start: sign thing $
        sign: ['-']
        thing: NUMBER
        rQ   r   r+   )rR   r-   r    r!   r#   s     r   test_nullable_rulez TestFirstSets.test_nullable_rule   s@    
 	%%g.U""E*	
r   c                 R    d}| j                  | j                  |      dddhi       y )Nz 
        start: ['-'] $
        r    	ENDMARKERr   r!   r#   s     r   %test_epsilon_production_in_start_rulez3TestFirstSets.test_epsilon_production_in_start_rule  s3     	%%g.;:N0O	
r   c           	      f    d}| j                  | j                  |      ddhddhh ddhdhd       y )	Nz
        start: sign thing other another $
        sign: ['-']
        thing: ['+']
        other: '*'
        another: '/'
        rQ   r   r   >   '*'r   r   rb   z'/')rR   r-   r    otheranotherr!   r#   s     r   test_multiple_nullable_rulesz*TestFirstSets.test_multiple_nullable_rules  sG     	%%g.U.!7		
r   )r   N)__name__
__module____qualname__strr   r   r   r$   r(   r.   r4   r6   r9   r;   r=   r?   rA   rC   rE   rH   rJ   rO   rS   rU   r[   r]   r`   re    r   r   r   r      s    =3 =4SX;N =
"













*






r   r   )unittesttestr   typingr   r   skip_if_missingimports_under_toolpegen.grammar_parserr   r   pegen.testutilr   pegen.first_setsr	   pegen.grammarr
   TestCaser   rj   r   r   <module>ru      sc       
  ? +"Z""?3 &E+3%	&P
H%% P
& &s   A..A7