U
    nuf                     @   sj   d dl mZmZmZmZ d dlmZ d dlmZ d dl	m
Z
 G dd dZG dd dZG d	d
 d
ZdS )    )OptionalIteratorTupleList)tokenize)parse_version_string)PythonTokenTypesc                   @   s(   e Zd Zdee dddZdd ZdS )NFAArcNFAState)next_nonterminal_or_stringc                 C   s   || _ || _d S N)nextr   selfr   r    r   >/tmp/pip-unpacked-wheel-bhkpgl14/parso/pgen2/grammar_parser.py__init__   s    zNFAArc.__init__c                 C   s   d| j j| jf S )Nz<%s: %s>)	__class____name__r   r   r   r   r   __repr__   s    zNFAArc.__repr__N)r   
__module____qualname__r   strr   r   r   r   r   r   r	      s   r	   c                   @   s,   e Zd ZedddZd	ddZdd ZdS )
r
   )	from_rulec                 C   s   || _ g | _d S r   )r   arcs)r   r   r   r   r   r      s    zNFAState.__init__Nc                 C   s:   |d kst |tstt |ts$t| jt|| d S r   )
isinstancer   AssertionErrorr
   r   appendr	   r   r   r   r   add_arc   s    zNFAState.add_arcc                 C   s   d| j j| jf S )Nz<%s: from %s>)r   r   r   r   r   r   r   r   !   s    zNFAState.__repr__)N)r   r   r   r   r   r    r   r   r   r   r   r
      s   
r
   c                   @   sr   e Zd ZdZedddZeeeef  dddZ	dd	 Z
d
d Zdd Zdd ZdddZdd Zdd ZdS )GrammarParserz.
    The parser for Python grammar files.
    )bnf_grammarc                 C   s$   || _ t|tdd| _|   d S )Nz3.9)version_info)_bnf_grammarr   r   	generator	_gettoken)r   r"   r   r   r   r   )   s    zGrammarParser.__init__)returnc                 c   sf   | j tjkrb| j tjkr"|   q| tj| _| tjd | 	 \}}| tj ||fV  q d S )N:)
typer   	ENDMARKERNEWLINEr&   _expectNAME_current_rule_nameOP
_parse_rhsr   azr   r   r   parse1   s    
zGrammarParser.parsec                 C   st   |   \}}| jdkr||fS t| j}t| j}|| || | jdkrRqh|   |   \}}q2||fS d S )N|)_parse_itemsvaluer
   r.   r    r&   )r   r2   r3   Zaazzr   r   r   r0   @   s    





zGrammarParser._parse_rhsc                 C   sL   |   \}}| jtjtjfks(| jdkrD|   \}}|| |}q||fS )N)([)_parse_itemr)   r   r-   STRINGr7   r    )r   r2   bcdr   r   r   r6   T   s    
zGrammarParser._parse_itemsc                 C   s   | j dkr>|   |  \}}| tjd || ||fS |  \}}| j }|dkr`||fS |   || |dkr||fS ||fS d S )Nr:   ])+*rA   )r7   r&   r0   r,   r   r/   r    _parse_atom)r   r2   r3   r7   r   r   r   r;   _   s    


zGrammarParser._parse_itemc                 C   s   | j dkr4|   |  \}}| tjd ||fS | jtjtjfkrxt	| j
}t	| j
}||| j  |   ||fS | d| j| j  d S )Nr9   )z+expected (...) or NAME or STRING, got %s/%s)r7   r&   r0   r,   r   r/   r)   r-   r<   r
   r.   r    _raise_errorr1   r   r   r   rC   x   s    


 zGrammarParser._parse_atomNc                 C   sR   | j |kr| d|| j | j |d k	r@| j|kr@| d|| j | j}|   |S )Nzexpected %s, got %s [%s]zexpected %s, got %s)r)   rE   r7   r&   )r   type_r7   r   r   r   r,      s    
  zGrammarParser._expectc                 C   s    t | j}|\| _| _| _}d S r   )r   r%   r)   r7   begin)r   tupprefixr   r   r   r&      s    
zGrammarParser._gettokenc              
   G   sr   |r8z|| }W n&   d |gttt| }Y nX | j | jd d  }t|d| jd | jd |fd S )N r      z	<grammar>)joinlistmapr   r$   
splitlinesrG   SyntaxError)r   msgargsliner   r   r   rE      s      zGrammarParser._raise_error)N)r   r   r   __doc__r   r   r   r   r
   r4   r0   r6   r;   rC   r,   r&   rE   r   r   r   r   r!   %   s   

r!   N)typingr   r   r   r   Zparso.python.tokenizer   Zparso.utilsr   Zparso.python.tokenr   r	   r
   r!   r   r   r   r   <module>   s   	