
    daf%                        d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
mZmZmZmZmZ  ej                   d        ej"                  d      5  d dlmZ d dlmZmZmZ d dlmZmZmZ d d	lmZ d d
lm Z  d dl!m"Z"m#Z# d dl$m%Z% ddd        G d dejL                        Z' G d d      Z( G d dejL                        Z)y# 1 sw Y   >xY w)    N)
test_tools)DictAny)	TokenInfoNAMENEWLINENUMBEROPpeg_generator)GeneratedParser)parse_stringgenerate_parsermake_parser)GrammarVisitorGrammarErrorGrammar)ASTGrammarPrinter)Parser)compute_nullablescompute_left_recursives)PythonParserGeneratorc                   L   e Z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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)+	TestPegenNc                 t   d}d}t        |t              }|j                  }| j                  t	        |      t        j                  |      j                                | j                  t	        |d         d       | j                  t	        |d         d       d}| j                  t        |d         |       y )	Nzl
        start: sum NEWLINE
        sum: t1=term '+' t2=term { action } | term
        term: NUMBER
        [
        start: sum NEWLINE
        sum: term '+' term | term
        term: NUMBER
        startstart: sum NEWLINEsumsum: term '+' term | termzERule('term', None, Rhs([Alt([NamedItem(None, NameLeaf('NUMBER'))])]))term)	r   GrammarParserrulesassertEqualstrtextwrapdedentstriprepr)selfgrammar_sourceexpectedgrammarr"   expected_reprs         =/root/Python-3.12.4/Lib/test/test_peg_generator/test_pegen.pytest_parse_grammarzTestPegen.test_parse_grammar   s    

 (FWxx'@'F'F'HIU7^,.BCU5\*,GHS 	 	eFm,m<    c                 ~    d}| j                  t        d      5  t        |t               d d d        y # 1 sw Y   y xY w)Nze
        start: the_rule NEWLINE
        the_rule: 'b' NEWLINE
        the_rule: 'a' NEWLINE
        zRepeated rule 'the_rule')assertRaisesRegexr   r   r!   )r)   r*   s     r.   test_repeated_ruleszTestPegen.test_repeated_rules-   s;    
 ##L2LM 	87	8 	8 	8s   3<c                     d}d}t        |t              }| j                  t        |j                  d         t        j                  |      j                                y )Nzt
        start: zero | one | one zero | one one | one zero zero | one zero one | one one zero | one one one
        z
        start:
            | zero
            | one
            | one zero
            | one one
            | one zero zero
            | one zero one
            | one one zero
            | one one one
        r   )r   r!   r#   r$   r"   r%   r&   r'   )r)   r*   r+   r,   s       r.   test_long_rule_strzTestPegen.test_long_rule_str6   sN    
 (FW]]734hooh6O6U6U6WXr0   c                     d}t        |t              j                  }| j                  t	        |d         d       | j                  t	        |d         d       | j                  t        |d         d       y )Nz{
        start[int]: sum NEWLINE
        sum[int]: t1=term '+' t2=term { action } | term
        term[int]: NUMBER
        r   r   r   r   r    zFRule('term', 'int', Rhs([Alt([NamedItem(None, NameLeaf('NUMBER'))])])))r   r!   r"   r#   r$   r(   )r)   r,   r"   s      r.   test_typed_ruleszTestPegen.test_typed_rulesH   sn    
 Wm4::U7^,.BCU5\*,GHvT	
r0   c                    d}t        |t              j                  }| j                  t	        |d         d       | j                  t        |d         j                  d             | j                  t	        |d         d       t        |      }t        d|      }t        d|      }| j                  |t        t        d	d
dd      t        t        dddd      gt        t        dddd      g       y )NA
        start: ','.thing+ NEWLINE
        thing: NUMBER
        r   zstart: ','.thing+ NEWLINEzXRule('start', None, Rhs([Alt([NamedItem(None, Gather(StringLeaf("','"), NameLeaf('thing'thingzthing: NUMBER42
z1, 2
1   r   r>   r>   stringr   endline2r>      r>      
r>      )r   r!   r"   r#   r$   
assertTruer(   
startswithr   r   r	   r   )r)   r,   r"   parser_classnodes        r.   test_gatherzTestPegen.test_gatherW   s     Wm4::U7^,.IJw ++l	

 	U7^,o>"7+FL1Hl3 s&f8 s&f8	 DF	
r0   c                     d}t        |      }t        d|      }| j                  |t        t        dddd      t        t
        dddd      g       y )	Nr   r;   42r=   r>      r@   rI   rE   r   r   r#   r   r	   r   r)   r,   rN   rO   s       r.   test_expr_grammarzTestPegen.test_expr_grammarx   sW    
 #7+FL1&VfU'$f&vV	
r0   c                    d}t        |      }t        d|      }| j                  |t        t        dddd      t        t
        ddd	d      t        t        d
ddd      ggt        t        dddd      g       t        d|      }| j                  |t        t        dddd      d gt        t        dddd      g       y )NzW
        start: sum NEWLINE
        sum: term ('+' term)?
        term: NUMBER
        1 + 2
r<   r=   r?   r@   +rS   rE   rD   rG   rJ   rI   r>      1
r   r   r#   r   r	   r
   r   rV   s       r.   test_optional_operatorz TestPegen.test_optional_operator       
 #7+I|4 s&f9 "s&f9 ""3f&y		 DF	
* E<0 fSFQVW '$f&uU		
r0   c                 Z   d}t        |      }t        d|      }| j                  |t        t        dddd      t        t
        dddd      gt        t        d	dd
d      g       t        d|      }| j                  |t        t        dddd      d gt        t        d	ddd      g       y )NzQ
        start: sum NEWLINE
        sum: term '+' ?
        term: NUMBER
        z1+
r<   r=   r?   r@   rZ   rS   rI   rE   r]   r^   rV   s       r.   test_optional_literalzTestPegen.test_optional_literal   s    
 #7+FL1 s&f6 bFVT	 '$f&vV	
 E<0 fSFQVW '$f&uU		
r0   c                    d}t        |      }t        d|      }| j                  |t        t        dddd      t        t
        ddd	d      t        t        d
ddd      ggt        t        dddd      g       t        d|      }| j                  |t        t        dddd      d gt        t        dddd      g       y )NzV
        start: sum NEWLINE
        sum: term ['+' term]
        term: NUMBER
        rY   r<   r=   r?   r@   rZ   rS   rE   rD   rG   rJ   rI   r[   r]   r^   rV   s       r.   test_alt_optional_operatorz$TestPegen.test_alt_optional_operator   r`   r0   c                 ~   d}t        |      }t        d|      }| j                  |t        t        dddd      t        t        ddd	d      t        t        d
ddd      gt        t
        dddd      g       t        d|      }| j                  |t        t        dddd      g t        t
        dddd      g       y )NzC
        start: thing thing* NEWLINE
        thing: NUMBER
        1 2 3
r<   r=   r?   r@   rD   rS   rE   3rG   rJ   rI   r[   r]   rU   rV   s       r.   test_repeat_0_simplezTestPegen.test_repeat_0_simple   s     #7+I|4&FYWs&f9 s&f9	 DF	
" E<0&FUS'$f&uU	
r0   c                 D   d}t        |      }t        d|      }| j                  |t        t        dddd      t        t
        ddd	d      t        t        d
ddd      gt        t
        dddd      t        t        dddd      ggt        t        dddd      g       y )NzF
        start: term ('+' term)* NEWLINE
        term: NUMBER
        
1 + 2 + 3
r<   r=   r?   r@   rZ   rS   rE   rD   rG   rJ   r[   r>      rg   r>      r>   	   rI   r>   
   r^   rV   s       r.   test_repeat_0_complexzTestPegen.test_repeat_0_complex  s     #7+M<83f&}
 "s&f= ""#&"( &!.	 "s&f= ""#&"( &!.	4 DG-=!$	
r0   c                 `   d}t        |      }t        d|      }| j                  |t        t        dddd      t        t        ddd	d      t        t        d
ddd      gt        t
        dddd      g       | j                  t              5  t        d|       d d d        y # 1 sw Y   y xY w)NzC
        start: thing thing+ NEWLINE
        thing: NUMBER
        rf   r<   r=   r?   r@   rD   rS   rE   rg   rG   rJ   rI   r[   r]   )r   r   r#   r   r	   r   assertRaisesSyntaxErrorrV   s       r.   test_repeat_1_simplezTestPegen.test_repeat_1_simpleI  s     #7+I|4&FYWs&f9 s&f9	 DF	
" {+ 	.-	. 	. 	.s   B$$B-c                    d}t        |      }t        d|      }| j                  |t        t        dddd      t        t
        ddd	d      t        t        d
ddd      gt        t
        dddd      t        t        dddd      ggt        t        dddd      g       | j                  t              5  t        d|       d d d        y # 1 sw Y   y xY w)NzF
        start: term ('+' term)+ NEWLINE
        term: NUMBER
        rj   r<   r=   r?   r@   rZ   rS   rE   rD   rG   rJ   r[   rk   rg   rm   ro   rI   rq   r]   )	r   r   r#   r   r	   r
   r   ru   rv   rV   s       r.   test_repeat_1_complexzTestPegen.test_repeat_1_complexd  s     #7+M<83f&}
 "s&f= ""#&"( &!.	 "s&f= ""#&"( &!.	4 DG-=!$	
J {+ 	.-	. 	. 	.s   6CCc                     d}t        |      }t        d|      }| j                  |t        t        dddd      t        t        ddd	d      t        t        d
ddd      gt        t
        dddd      g       y )Nr9   z1, 2, 3
r<   r=   r?   r@   rD   rE   rG   rg   r[   rk   rI   rm   rU   rV   s       r.   test_repeat_with_sep_simplez%TestPegen.test_repeat_with_sep_simple  s     #7+K6 s&f; s&f; s&f;
 DF	
r0   c                    d}t        |t              }t        |      }|j                  }| j	                  |d   j
                         | j                  |d   j
                         | j	                  |d   j
                         | j	                  |d   j
                         | j	                  |d   j
                         | j	                  |d   j
                         t        d|      }| j                  |t        t        d	d
dd      t        t        dddd      t        t        dddd      gt        t        dddd      t        t        dddd      gt        t        dddd      g       y )Nz
        start: expr NEWLINE
        expr: ('-' term | expr '+' term | term)
        term: NUMBER
        foo: NAME+
        bar: NAME*
        baz: NAME?
        r   exprr    foobarbazrj   r<   r=   r?   r@   rZ   rS   rE   rD   rG   rJ   r[   rk   rg   rm   ro   rI   rq   )r   r!   r   r"   assertFalseleft_recursiverL   r#   r   r	   r
   r   )r)   r*   r,   rN   r"   rO   s         r.   test_left_recursivezTestPegen.test_left_recursive  sj    (F&w/w667f445v556u445u445u445M<8 ""#&"( &!. "s&f= ""#&"( &!.& 3f&} s&f=/6 DG-9"	
r0   c                     d}t        |      }t        d|      }t        |dd      }t        |      }| j	                  |d       y )Na  
        start: expr NEWLINE? $ { ast.Expression(expr, lineno=1, col_offset=0) }
        expr: ( expr '+' term { ast.BinOp(expr, ast.Add(), term, lineno=expr.lineno, col_offset=expr.col_offset, end_lineno=term.end_lineno, end_col_offset=term.end_col_offset) }
            | expr '-' term { ast.BinOp(expr, ast.Sub(), term, lineno=expr.lineno, col_offset=expr.col_offset, end_lineno=term.end_lineno, end_col_offset=term.end_col_offset) }
            | term { term }
            )
        term: ( l=term '*' r=factor { ast.BinOp(l, ast.Mult(), r, lineno=l.lineno, col_offset=l.col_offset, end_lineno=r.end_lineno, end_col_offset=r.end_col_offset) }
            | l=term '/' r=factor { ast.BinOp(l, ast.Div(), r, lineno=l.lineno, col_offset=l.col_offset, end_lineno=r.end_lineno, end_col_offset=r.end_col_offset) }
            | factor { factor }
            )
        factor: ( '(' expr ')' { expr }
                | atom { atom }
                )
        atom: ( n=NAME { ast.Name(id=n.string, ctx=ast.Load(), lineno=n.start[0], col_offset=n.start[1], end_lineno=n.end[0], end_col_offset=n.end[1]) }
            | n=NUMBER { ast.Constant(value=ast.literal_eval(n.string), lineno=n.start[0], col_offset=n.start[1], end_lineno=n.end[0], end_col_offset=n.end[1]) }
            )
        z(1 + 2*3 + 5)/(6 - 2)
 evalg      @)r   r   compiler   r#   )r)   r,   rN   rO   codevals         r.   test_python_exprzTestPegen.test_python_expr  sI    " #7+5|DtR(4jc"r0   c                     d}t        |t              }|j                  }t        |      }| j	                  |d   |       | j                  |d   |       y )Nz>
        start: sign NUMBER
        sign: ['-' | '+']
        r   sign)r   r!   r"   r   assertNotInassertInr)   r*   r,   r"   	nullabless        r.   test_nullablezTestPegen.test_nullable  sP     (F%e,	w3eFmY/r0   c                 8   d}t        |t              }|j                  }t        |      }t	        |       | j                  |d   |       | j                  |d   |       | j                  |d   j                         | j                  |d   j                         y )Nz@
        start: NUMBER | sign start
        sign: ['-']
        r   r   )
r   r!   r"   r   r   r   r   rL   r   r   r   s        r.   test_advanced_left_recursivez&TestPegen.test_advanced_left_recursive  s     (F%e,	&w3eFmY/g556v556r0   c                 p   d}t        |t              }t        j                         }t	        ||      }|j
                  }| j                  |d   j                         | j                  |d   j                         | j                  |d   j                         |j                  d       i }t        |j                         |       |d   }t        d|      }| j                  |t        t        dd	d
d      t        t        dddd      gt        t        dddd      gt        t        dddd      gt        t        dddd      g       t        d|      }| j                  |t        t        dd	d
d      t        t        dddd      gt        t        dddd      gt        t        dddd      g       y )NzV
        start: foo 'E'
        foo: bar 'A' | 'B'
        bar: foo 'C' | 'D'
        r   r~   r   <string>r   z	D A C A EDr=   r?   )typerA   r   rB   rC   ArS   rE   CrG   rJ   r[   rk   Erm   ro   zB C A EB)r   r!   ioStringIOr   r"   r   r   rL   generateexecgetvaluer#   r   r   )	r)   r*   r,   outgenrr"   nsrN   rO   s	            r.   test_mutually_left_recursivez&TestPegen.test_mutually_left_recursive  s   
 (Fkkm$Wc2w667e334e334j!S\\^R %'(9%:K6
 &%)'*&,$*%0 &%)'*&,$*%0  "!%#&"( &!,#2 !"$"(5!D cV+G&)	
T I|4 "!%#&"( &!* "!%#&"( &!*  !#Vi#* cV)-	
r0   c                 8   d}t        |t              }t        j                         }t	        ||      }|j                  d       i }t        |j                         |       |d   }| j                  t              5  t        d|       d d d        y # 1 sw Y   y xY w)Nzf
        start: target '='
        target: maybe '+' | NAME
        maybe: maybe '-' | target
        r   r   zx - + =)
r   r!   r   r   r   r   r   r   ru   rv   )r)   r*   r,   r   r   r   rN   s          r.   "test_nasty_mutually_left_recursivez,TestPegen.test_nasty_mutually_left_recursiver  s    
 (Fkkm$Wc2j!S\\^R +,{+ 	2L1	2 	2 	2s   :BBc                    d}t        |      }t        d|      }| j                  |t        t        dddd      t        t
        ddd	d      t        t        d
ddd      t        t
        dddd      t        t        d
ddd      gggg       y )Nz
        start: (expr_stmt | assign_stmt) &'.'
        expr_stmt: !(target '=') expr
        assign_stmt: target '=' expr
        expr: term ('+' term)*
        target: NAME
        term: NUMBER
        zfoo = 12 + 12 .r~   r=   rE   r@   =rG   rJ   12r[   rm   rZ   ro   rq   )r>      )r>      )r   r   r#   r   r   r
   r	   rV   s       r.   test_lookaheadzTestPegen.test_lookahead  s     #7+-|<f&GX s&fCT #$". & "'*&,$+%6 & &'+&-$+%6"%	
r0   c                 r    d}| j                  t              5  t        |       d d d        y # 1 sw Y   y xY w)Nz&
        start: foo=!'x' NAME
        )ru   rv   r   r)   r,   s     r.   test_named_lookahead_errorz$TestPegen.test_named_lookahead_error  s6     {+ 	! 	! 	! 	!   -6c                     d}t        |       y )NzA
        start: attr | NAME
        attr: start '.' NAME
        r   r   s     r.   test_start_leaderzTestPegen.test_start_leader  s    
 	Gr0   c                     d}t        |       y )Nz 
        start: [NAME*]
        r   r   s     r.   test_opt_sequencezTestPegen.test_opt_sequence  s    
 	Gr0   c                     d}| j                  t              5 }t        |       | j                  dt	        |j
                  j                        v        d d d        y # 1 sw Y   y xY w)Nz
        start: foo
        foo: bar '+' | baz '+' | '+'
        bar: baz '-' | foo '-' | '-'
        baz: foo '*' | bar '*' | '*'
        z	no leader)ru   
ValueErrorr   rL   r$   	exceptionvalue)r)   r,   errinfos      r.   test_left_recursion_too_complexz)TestPegen.test_left_recursion_too_complex  s^     z* 	Ig OOK3w/@/@/F/F+GGH	I 	I 	Is   <AA&c                     d}t        |      }t        d|      }| j                  |t        t        dddd      t        t
        dddd      t        t        d	dd
d      g       y )Nz<
        start: '(' ~ expr ')'
        expr: NUMBER
        z(1)(r=   r?   r@   r<   rS   )rE   )r   r   r#   r   r
   r	   rV   s       r.   test_cutzTestPegen.test_cut  sg     #7+E<0"SFO&FUS"SFO	
r0   c                 r    d}| j                  t              5  t        |      }d d d        y # 1 sw Y   y xY w)Nz<
        start: foo ENDMARKER
        foo: bar NAME
        ru   r   r   r)   r,   rN   s      r.   test_dangling_referencez!TestPegen.test_dangling_reference  8     |, 	0&w/L	0 	0 	0r   c                 r    d}| j                  t              5  t        |      }d d d        y # 1 sw Y   y xY w)Nz/
        start: foo
        foo: NAMEE
        r   r   s      r.   test_bad_token_referencez"TestPegen.test_bad_token_reference  r   r   c                 r    d}| j                  t              5  t        |      }d d d        y # 1 sw Y   y xY w)Nz
        foo: NAME
        r   r   s      r.   test_missing_startzTestPegen.test_missing_start  s8     |, 	0&w/L	0 	0 	0r   c                 t    d}| j                  t        d      5  t        |      }d d d        y # 1 sw Y   y xY w)Nz<
        start: _a b
        _a: 'a'
        b: 'b'
        z"cannot start with underscore: '_a'r2   r   r   r   s      r.   test_invalid_rule_namez TestPegen.test_invalid_rule_name  ;    
 ##L2VW 	0&w/L	0 	0 	0   .7c                 t    d}| j                  t        d      5  t        |      }d d d        y # 1 sw Y   y xY w)Nz=
        start: a b
        a: _x='a'
        b: 'b'
        "cannot start with underscore: '_x'r   r   s      r.   test_invalid_variable_namez$TestPegen.test_invalid_variable_name  r   r   c                 t    d}| j                  t        d      5  t        |      }d d d        y # 1 sw Y   y xY w)NzK
        start: a b
        a: (_x='a' | 'b') | 'c'
        b: 'b'
        r   r   r   s      r.   +test_invalid_variable_name_in_temporal_rulez5TestPegen.test_invalid_variable_name_in_temporal_rule  r   r   c                 T   d}t        |      }| j                  t        d|      d       | j                  t        d|      d       | j                  t        d|      d       t        d|      d	k(  sJ | j                  t              5  t        d
|       d d d        y # 1 sw Y   y xY w)Nz
        start:
            | "number" n=NUMBER { eval(n.string) }
            | "string" n=STRING { n.string }
            | SOFT_KEYWORD l=NAME n=(NUMBER | NAME | STRING) { l.string + " = " + n.string }
        znumber 1r>   z
string 'b'z'b'znumber test 1ztest = 1zstring test 'b'z
test = 'b'ztest 1)r   r#   r   ru   rv   r   s      r.   test_soft_keywordzTestPegen.test_soft_keyword!  s     #7+j,?ClLA5I,7	
 *L9\I	
I{+ 	1<0	1 	1 	1s   BB'c                 
   d}t        |      }| j                  t        d|             | j                  t              5 }t        d|       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nz*
        start: NAME &&':' | NAME
        number :azexpected ':')r   rL   r   ru   rv   r   r$   r   r)   r,   rN   es       r.   test_forcedzTestPegen.test_forced4  sp     #7+Z>?{+ 	,ql+	, 	nc!++&67	, 	,s   A99Bc                 H   d}t        |      }| j                  t        d|             | j                  t        d|             | j                  t              5 }t        d|       d d d        | j                  dj                  j                  d          y # 1 sw Y   3xY w)Nz2
        start: NAME &&(':' | ';') | NAME
        r   znumber ;r   zexpected (':' | ';')r   )r   rL   r   ru   rv   r   r   argsr   s       r.   test_forced_with_groupz TestPegen.test_forced_with_group?  s     #7+Z>?Z>?{+ 	,ql+	,,akk.>.>q.AB	, 	,s   BB!c                     d}t        |t              }t        j                         }t	        ||d      }|j                  d       | j                  d|j                                y )Nz-
        start: NAME { UNREACHABLE }
        This is a testunreachable_formattingr   r   r!   r   r   r   r   r   r   r)   sourcer,   r   r   s        r.   test_unreachable_explicitz#TestPegen.test_unreachable_explicitJ  sW     v}5kkm$S1A
 	j!&7r0   c                     d}t        |t              }t        j                         }t	        ||d      }|j                  d       | j                  d|j                                y )NzT
        start: NAME | invalid_input
        invalid_input: NUMBER { None }
        r   r   r   r   r   s        r.   test_unreachable_implicit1z$TestPegen.test_unreachable_implicit1V  W     v}5kkm$S1A
 	j!&7r0   c                     d}t        |t              }t        j                         }t	        ||d      }|j                  d       | j                  d|j                                y )Nz\
        start: NAME | '(' invalid_input ')'
        invalid_input: NUMBER { None }
        r   r   r   r   r   s        r.   test_unreachable_implicit2z$TestPegen.test_unreachable_implicit2c  r   r0   c                     d}t        |t              }t        j                         }t	        ||d      }|j                  d       | j                  d|j                                y )NzT
        start: NAME | invalid_input { None }
        invalid_input: NUMBER
        r   r   r   )r   r!   r   r   r   r   r   r   r   s        r.   test_unreachable_implicit3z$TestPegen.test_unreachable_implicit3p  sY     v}5kkm$S1A
 	j!)3<<>:r0   c                    d}t        |      }d}t        j                  t        ||      j                  d      }t        j                  t        j
                  |      j                  d   j                  d      j                  dd      }dj                  t        j                  |j                  d      |j                  d      d	d
            }| j                  |       y )Na  
        start: t=term NEWLINE? $ { ast.Expression(t, LOCATIONS) }
        term:
            | l=term '*' r=factor { ast.BinOp(l, ast.Mult(), r, LOCATIONS) }
            | l=term '/' r=factor { ast.BinOp(l, ast.Div(), r, LOCATIONS) }
            | factor
        factor:
            | (
                n=NAME { ast.Name(id=n.string, ctx=ast.Load(), LOCATIONS) } |
                n=NUMBER { ast.Constant(value=ast.literal_eval(n.string), LOCATIONS) }
            )
        z2*3
T)include_attributesr   z kind=None,r   rI   cpythonzpython-pegen)r   astdumpr   bodyparser   replacejoindifflibunified_diffsplitr   )r)   r,   rN   r   opdiffs          r.   &test_locations_in_alt_action_and_groupz0TestPegen.test_locations_in_alt_action_and_group}  s     #7+HH\&,7<<QUVHHSYYv&++A.44NVV2
 yy  qwwt}i

 	r0   returnN)+__name__
__module____qualname__r/   r3   r5   r7   rP   rW   r_   rb   rd   rh   rs   rw   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r0   r.   r   r      s    =,8Y$

B
 '
R
@'
R 
D+
Z.6-.^
65
n#0	07Z
x220
d!	I
 0000001&	8	C
888;r0   r   c                   J    e Zd Z G d de      Zd	dZd	dZd	dZd	dZd	dZ	y)
TestGrammarVisitorc                   8     e Zd ZddZdedededdf fdZ xZS )	TestGrammarVisitor.Visitorr   Nc                     d| _         y )Nr   )n_nodes)r)   s    r.   __init__z#TestGrammarVisitor.Visitor.__init__  s	    DLr0   rO   r   kwargsc                 V    | xj                   dz  c_         t        |   |g|i | y )Nr>   )r  supervisit)r)   rO   r   r
  	__class__s       r.   r  z TestGrammarVisitor.Visitor.visit  s'    LLALGM$000r0   r   )r   r   r  r	  r   r  __classcell__)r  s   @r.   Visitorr    s.    		1c 	1# 	1 	1 	1 	1r0   r  Nc                     d}t        |t              }| j                         }|j                  |       | j	                  |j
                  d       y )Nz
        start: 'a'
        r\   r   r!   r  r  r#   r  r)   r,   r"   visitors       r.   test_parse_trivial_grammarz-TestGrammarVisitor.test_parse_trivial_grammar  sB     Wm4,,.e!,r0   c                     d}t        |t              }| j                         }|j                  |       | j	                  |j
                  d       y )Nz5
        start: rule
        rule: 'a' | 'b'
           r  r  s       r.   test_parse_or_grammarz(TestGrammarVisitor.test_parse_or_grammar  sD     Wm4,,.e 	"-r0   c                     d}t        |t              }| j                         }|j                  |       | j	                  |j
                  d       y )Nz
        start: 'a'+
        rl   r  r  s       r.   test_parse_repeat1_grammarz-TestGrammarVisitor.test_parse_repeat1_grammar  sD     Wm4,,.e 	!,r0   c                     d}t        |t              }| j                         }|j                  |       | j	                  |j
                  d       y )Nz
        start: 'a'*
        rl   r  r  s       r.   test_parse_repeat0_grammarz-TestGrammarVisitor.test_parse_repeat0_grammar  sD     Wm4,,.e 	!,r0   c                     d}t        |t              }| j                         }|j                  |       | j	                  |j
                  d       y )Nz"
        start: 'a' ['b']
           r  r  s       r.   test_parse_optional_grammarz.TestGrammarVisitor.test_parse_optional_grammar  sD     Wm4,,.e
 	"-r0   r   )
r   r   r  r   r  r  r  r  r  r  r  r0   r.   r  r    s'    1. 1	-."
--.r0   r  c                   $    e Zd ZddZddZddZy)TestGrammarVisualizerNc                     d}t        |t              }t               }g }|j                  ||j                         dj                  |      }t        j                  d      }| j                  ||       y )Nz 
        start: 'a' 'b'
        printerrI   u           └──Rule
           └──Rhs
              └──Alt
                 ├──NamedItem
                 │  └──StringLeaf("'a'")
                 └──NamedItem
                    └──StringLeaf("'b'")
        	r   r!   r   print_grammar_astappendr   r%   r&   r#   r)   r,   r"   r$  linesoutputexpected_outputs          r.   test_simple_rulez&TestGrammarVisualizer.test_simple_rule  sn     Wm4#%!!%!>5!"//

 	1r0   c                     d}t        |t              }t               }g }|j                  ||j                         dj                  |      }t        j                  d      }| j                  ||       y )Nz:
        start: a b
        a: 'a'
        b: 'b'
        r#  rI   u;          └──Rule
           └──Rhs
              └──Alt
                 ├──NamedItem
                 │  └──NameLeaf('a')
                 └──NamedItem
                    └──NameLeaf('b')

        └──Rule
           └──Rhs
              └──Alt
                 └──NamedItem
                    └──StringLeaf("'a'")

        └──Rule
           └──Rhs
              └──Alt
                 └──NamedItem
                    └──StringLeaf("'b'")
                        r%  r(  s          r.   test_multiple_rulesz)TestGrammarVisualizer.test_multiple_rules  sn    
 Wm4#%!!%!>5!"//
0 	1r0   c                     d}t        |t              }t               }g }|j                  ||j                         dj                  |      }t        j                  d      }| j                  ||       y )Nz,
        start: 'a' ['b'['c'['d']]]
        r#  rI   u          └──Rule
           └──Rhs
              └──Alt
                 ├──NamedItem
                 │  └──StringLeaf("'a'")
                 └──NamedItem
                    └──Opt
                       └──Rhs
                          └──Alt
                             ├──NamedItem
                             │  └──StringLeaf("'b'")
                             └──NamedItem
                                └──Opt
                                   └──Rhs
                                      └──Alt
                                         ├──NamedItem
                                         │  └──StringLeaf("'c'")
                                         └──NamedItem
                                            └──Opt
                                               └──Rhs
                                                  └──Alt
                                                     └──NamedItem
                                                        └──StringLeaf("'d'")
                                r%  r(  s          r.   test_deep_nested_rulez+TestGrammarVisualizer.test_deep_nested_rule&  sn     Wm4#%!!%!>5!"//$
8 	1r0   r   )r   r   r  r,  r.  r0  r  r0   r.   r!  r!    s    22%2N'2r0   r!  )*r   r   r   r%   unittesttestr   typingr   r   tokenizer   r   r   r	   r
   skip_if_missingimports_under_toolpegen.grammar_parserr   r!   pegen.testutilr   r   r   pegen.grammarr   r   r   pegen.grammar_visualizerr   pegen.parserr   pegen.parser_generatorr   r   pegen.python_generatorr   TestCaser   r  r!  r  r0   r.   <module>r?     s    
  	     9 9 
  ? +"Z""?3 =EIICC:#Q<=!! DJ. J.Zh2H-- h2s= =s   5CC