3 \�5�@sdddlmZmZmZGdd�dej�ZGdd�de�ZGdd�de�ZGdd �d e�Z dd d �Z d S)�)�grammar�token�tokenizec@s eZdZdS)� PgenGrammarN)�__name__� __module__� __qualname__�r r �*/usr/lib64/python3.6/lib2to3/pgen2/pgen.pyrsrc@s�eZdZd&dd�Zdd�Zdd�Zdd �Zd d �Zd d �Zdd�Z dd�Z dd�Z dd�Z dd�Z dd�Zdd�Zdd�Zdd�Zd'd d!�Zd"d#�Zd$d%�ZdS)(�ParserGeneratorNcCsld}|dkrt|�}|j}||_||_tj|j�|_|j�|j �\|_ |_ |dk rZ|�i|_ |j �dS)N)�open�close�filename�streamr�generate_tokens�readline� generator�gettoken�parse�dfas� startsymbol�first� addfirstsets)�selfrrZ close_streamr r r �__init__ szParserGenerator.__init__c Cs*t�}t|jj��}|j�|j|j�|jd|j�x.|D]&}dt|j �}||j |<||j |<qtj|}||j k�r@|j |S|jj|df�||j |<|SdS)Nr�"�')r8r9)r"Zlabels�isalphar#Z symbol2labelr'�getattrr� isinstance�int�AssertionError�tok_name�tokens�eval�keywords�NAMErZopmap)rr.r4r7Zitoken�valuer r r r(=s<                 zParserGenerator.make_labelcCs<t|jj��}|j�x |D]}||jkr|j|�qWdS)N)rrrrr� calcfirst)rr/r0r r r rks   zParserGenerator.addfirstsetsc Cs |j|}d|j|<|d}i}i}x�|jj�D]x\}}||jkr�||jkrl|j|}|dkr�td|��n|j|�|j|}|j|�|||<q0d||<|di||<q0Wi} xJ|j�D]>\}} x4| D],} | | kr�td|| || | f��|| | <q�Wq�W||j|<dS)Nrzrecursion for rule %rrzArule %s is ambiguous; %s is in the first sets of %s as well as %s)rrr%r&� ValueErrorrE�update) rr0r2r3ZtotalsetZ overlapcheckr4r5�fsetZinverseZitsfirstZsymbolr r r rEss2          zParserGenerator.calcfirstc Cs�i}d}x�|jtjkr�x|jtjkr.|j�qW|jtj�}|jtjd�|j�\}}|jtj�|j ||�}t |�}|j |�t |�}|||<|dkr |}q W||fS)N�:) �typer� ENDMARKER�NEWLINEr�expectrC�OP� parse_rhs�make_dfar"� simplify_dfa) rrrr0�a�zr2ZoldlenZnewlenr r r r�s"      zParserGenerator.parsec s�t|t�st�t|t�st��fdd�}�fdd��t||�|�g}x�|D]�}i}x<|jD]2}x,|jD]"\}} |dk rf�| |j|i��qfWqZWxRt|j��D]B\}} x,|D]} | j| kr�Pq�Wt| |�} |j | �|j | |�q�WqJW|S)Ncsi}�||�|S)Nr )r3�base)� addclosurer r �closure�s z)ParserGenerator.make_dfa..closurecsLt|t�st�||krdSd||<x$|jD]\}}|dkr*�||�q*WdS)Nr)r<�NFAStater>r%)r3rTr4r5)rUr r rU�sz,ParserGenerator.make_dfa..addclosure) r<rWr>�DFAState�nfasetr%� setdefaultr$r&r'�addarc) rr-�finishrVr+r3r%Znfastater4r5rY�str )rUr rP�s&        zParserGenerator.make_dfac Cs�td|�|g}x�t|�D]�\}}td|||kr4dp6d�x^|jD]T\}}||kr^|j|�} nt|�} |j|�|dkr�td| �qBtd|| f�qBWqWdS)NzDump of NFA forz Statez(final)�z -> %dz %s -> %d)�print� enumerater%r)r"r') rr0r-r\Ztodor1r3r4r5�jr r r �dump_nfa�s   zParserGenerator.dump_nfacCsltd|�x\t|�D]P\}}td||jr,dp.d�x0t|jj��D]\}}td||j|�f�qBWqWdS)NzDump of DFA forz Statez(final)r^z %s -> %d)r_r`r*r$r%r&r))rr0r2r1r3r4r5r r r �dump_dfa�s  zParserGenerator.dump_dfacCs~d}xt|rxd}xft|�D]Z\}}xPt|dt|��D]:}||}||kr4||=x|D]}|j||�qTWd}Pq4WqWqWdS)NTFr)r`�ranger"� unifystate)rr2Zchangesr1Zstate_iraZstate_jr3r r r rQ�s zParserGenerator.simplify_dfacCs�|j�\}}|jdkr||fSt�}t�}|j|�|j|�x6|jdkrt|j�|j�\}}|j|�|j|�q@W||fSdS)N�|)� parse_altrDrWr[r)rrRrSZaaZzzr r r rO�s       zParserGenerator.parse_rhscCsP|j�\}}x:|jdks*|jtjtjfkrF|j�\}}|j|�|}qW||fS)N�(�[)rhri)� parse_itemrDrJrrC�STRINGr[)rrR�br.�dr r r rg s    zParserGenerator.parse_altcCs�|jdkr>|j�|j�\}}|jtjd�|j|�||fS|j�\}}|j}|dkr`||fS|j�|j|�|dkr�||fS||fSdS)Nri�]�+�*)rorp)rDrrOrMrrNr[� parse_atom)rrRrSrDr r r rjs     zParserGenerator.parse_itemcCs�|jdkr4|j�|j�\}}|jtjd�||fS|jtjtjfkrpt �}t �}|j ||j�|j�||fS|j d|j|j�dS)Nrh�)z+expected (...) or NAME or STRING, got %s/%s) rDrrOrMrrNrJrCrkrWr[� raise_error)rrRrSr r r rq(s  zParserGenerator.parse_atomcCsD|j|ks|dk r2|j|kr2|jd|||j|j�|j}|j�|S)Nzexpected %s/%s, got %s/%s)rJrDrsr)rrJrDr r r rM9s zParserGenerator.expectcCsJt|j�}x"|dtjtjfkr,t|j�}q W|\|_|_|_|_|_ dS)Nr) r5rr�COMMENT�NLrJrDZbegin�end�line)r�tupr r r rAs zParserGenerator.gettokenc Gs^|r8y ||}Wn&dj|gttt|���}YnXt||j|jd|jd|jf��dS)N� rr)�joinr�map�str� SyntaxErrorrrvrw)r�msg�argsr r r rsHs  zParserGenerator.raise_error)N)N)rrrrr6r,r(rrErrPrbrcrQrOrgrjrqrMrrsr r r r r s$  .$  r c@seZdZdd�Zddd�ZdS)rWcCs g|_dS)N)r%)rr r r rSszNFAState.__init__NcCs8|dkst|t�st�t|t�s$t�|jj||f�dS)N)r<r|r>rWr%r')rr5r4r r r r[VszNFAState.addarc)N)rrrrr[r r r r rWQsrWc@s0eZdZdd�Zdd�Zdd�Zdd�Zd Zd S) rXcCsLt|t�st�ttt|��t�s$t�t|t�s2t�||_||k|_i|_dS)N) r<�dictr>r5�iterrWrYr*r%)rrY�finalr r r r]s  zDFAState.__init__cCs8t|t�st�||jkst�t|t�s*t�||j|<dS)N)r<r|r>r%rX)rr5r4r r r r[eszDFAState.addarccCs.x(|jj�D]\}}||kr ||j|<q WdS)N)r%r&)r�old�newr4r5r r r rekszDFAState.unifystatecCsft|t�st�|j|jkrdSt|j�t|j�kr6dSx*|jj�D]\}}||jj|�k rBdSqBWdS)NFT)r<rXr>r*r"r%r&�get)r�otherr4r5r r r �__eq__ps zDFAState.__eq__N)rrrrr[rer��__hash__r r r r rX[s rX� Grammar.txtcCst|�}|j�S)N)r r6)r�pr r r �generate_grammar�sr�N)r�) r^rrrZGrammarr�objectr rWrXr�r r r r �sI %