B
    t\                 @   sV   d dl mZ d dlmZ d dlmZ G dd dZG dd deZG dd	 d	eZ	d
S )    )tokenize)parse_version_string)PythonTokenTypesc               @   sZ   e Zd ZdZdd Z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.
    c             C   s$   || _ t|tdd| _|   d S )Nz3.6)version_info)_bnf_grammarr   r   	generator	_gettoken)selfZbnf_grammar r   9lib/python3.7/site-packages/parso/pgen2/grammar_parser.py__init__   s
    zGrammarParser.__init__c             c   sn   xh| j tjkrhx| j tjkr&|   qW | tj| _| tjd | 	 \}}| tj ||fV  qW d S )N:)
typer   	ENDMARKERNEWLINEr	   _expectNAME_current_rule_nameOP
_parse_rhs)r
   azr   r   r   parse   s    zGrammarParser.parsec             C   sx   |   \}}| jdkr||fS t| j}t| j}x8|| || | jdkrTP |   |   \}}q4W ||fS d S )N|)_parse_itemsvalueNFAStater   add_arcr	   )r
   r   r   ZaaZzzr   r   r   r   (   s    





zGrammarParser._parse_rhsc             C   sP   |   \}}x:| jtjtjfks*| jdkrF|   \}}|| |}qW ||fS )N)([)_parse_itemr   r   r   STRINGr   r   )r
   r   bcdr   r   r   r   <   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    ])+*r'   )r   r	   r   r   r   r   r   _parse_atom)r
   r   r   r   r   r   r   r!   G   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 )Nr   )z+expected (...) or NAME or STRING, got %s/%s)r   r	   r   r   r   r   r   r   r"   r   r   r   _raise_error)r
   r   r   r   r   r   r)   `   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   r+   r   r	   )r
   Ztype_r   r   r   r   r   r   s    
zGrammarParser._expectc             C   s    t | j}|\| _| _| _}d S )N)nextr   r   r   begin)r
   tupprefixr   r   r   r	   |   s    
zGrammarParser._gettokenc          
   G   sr   |r8y|| }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mapstrr   
splitlinesr-   SyntaxError)r
   msgargsliner   r   r   r+      s     zGrammarParser._raise_error)N)__name__
__module____qualname____doc__r   r   r   r   r!   r)   r   r	   r+   r   r   r   r   r      s   

r   c               @   s   e Zd Zdd ZdS )NFAArcc             C   s   || _ || _d S )N)r,   nonterminal_or_string)r
   next_r@   r   r   r   r      s    zNFAArc.__init__N)r;   r<   r=   r   r   r   r   r   r?      s   r?   c               @   s&   e Zd Zdd ZdddZdd ZdS )	r   c             C   s   || _ g | _d S )N)	from_rulearcs)r
   rB   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 )N)
isinstancer5   AssertionErrorr   rC   appendr?   )r
   rA   r@   r   r   r   r      s    zNFAState.add_arcc             C   s   d| j j| jf S )Nz<%s: from %s>)	__class__r;   rB   )r
   r   r   r   __repr__   s    zNFAState.__repr__)N)r;   r<   r=   r   r   rH   r   r   r   r   r      s   
r   N)
Zparso.python.tokenizer   Zparso.utilsr   Zparso.python.tokenr   r   objectr?   r   r   r   r   r   <module>   s
   ~