U
    :qLeWX                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dl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lmZm Z m!Z! G dd deZ"G dd deZ#dS )    N)TextIO)TokenStream)TokenFactory)DefaultErrorStrategy)InputStream)
Recognizer)RuleContext)ParserRuleContext)Token)Lexer)ATNDeserializer)ATNDeserializationOptions)UnsupportedOperationExceptionRecognitionException)ParseTreePatternMatcher)ParseTreeListenerTerminalNode	ErrorNodec                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TraceListenerc                 C   s
   || _ d S N)_parser)selfparser r   d/home/p21-0144/sympy/latex2sympy2solve-back-end/sympyEq/lib/python3.8/site-packages/antlr4/Parser.py__init__   s    zTraceListener.__init__c                 C   s8   t d| jj|   d | jjdj | jjd d S )Nzenter   , LT(1)=   fileprintr   	ruleNamesgetRuleIndex_inputLTtext_outputr   ctxr   r   r   enterEveryRule   s    zTraceListener.enterEveryRulec                 C   s6   t dt|j d | jj| jj   | jjd d S )Nzconsume z rule r   )r!   strsymbolr   r"   _ctxr#   r'   r   noder   r   r   visitTerminal   s    zTraceListener.visitTerminalc                 C   s   d S r   r   r.   r   r   r   visitErrorNode"   s    zTraceListener.visitErrorNodec                 C   s8   t d| jj|   d | jjdj | jjd d S )Nzexit    r   r   r   r    r(   r   r   r   exitEveryRule&   s    zTraceListener.exitEveryRuleN)__name__
__module____qualname__r   r*   r0   r1   r2   r   r   r   r   r      s
   r   c                       s  e Zd Ze Zejfeed fddZ	dd Z
edddZd	d
 Zdd ZedddZedddZdd Zdd Zdd Zdd Zdd ZedddZdd  Zdheeed"d#d$Zd%d& Zed'd(d)Zd*d+ Z ed'd,d-Z!d.d/ Z"diee#e$d0d1d2Z%d3d4 Z&d5d6 Z'e(eed7d8d9Z)d:d; Z*e(ed<d=d>Z+d?d@ Z,e(eeedAdBdCZ-e(eed7dDdEZ.e(dFdGdHZ/edIdJdKZ0e1edLdMdNZ2edOdPdQZ3edRdSdTZ4dUdV Z5dWdX Z6edYdZd[Z7dje1d\d]d^Z8d_d` Z9dadb Z:dcdd Z;e<dedfdgZ=  Z>S )kParser)inputoutputc                    s^   t    d | _|| _t | _t | _| jd d | _	d| _
d | _d | _d| _| | d S )Nr   T)superr   r$   r'   r   _errHandlerlist_precedenceStackappendr-   buildParseTrees_tracer_parseListeners_syntaxErrorssetInputStream)r   r7   r8   	__class__r   r   r   4   s    
zParser.__init__c                 C   sd   | j d k	r| j d | j|  d | _d| _| d t | _| j	d | j
d k	r`| j
  d S )Nr   F)r$   seekr:   resetr-   rA   setTracer;   r<   r=   _interpr   r   r   r   rF   S   s    


zParser.reset)ttypec                 C   sT   |   }|j|kr(| j|  |   n(| j| }| jrP|jdkrP| j	| |S N
getCurrentTokentyper:   ZreportMatchconsumeZrecoverInliner>   
tokenIndexr-   addErrorNode)r   rJ   tr   r   r   matchp   s    

zParser.matchc                 C   sT   |   }|jdkr(| j|  |   n(| j| }| jrP|jdkrP| j	| |S Nr   rL   rM   )r   rS   r   r   r   matchWildcard   s    

zParser.matchWildcardc                 C   s   | j d krt S | j S r   )r@   r;   rI   r   r   r   getParseListeners   s    zParser.getParseListeners)listenerc                 C   s0   |d krt d| jd kr g | _| j| d S )NrX   )ReferenceErrorr@   r=   r   rX   r   r   r   addParseListener   s
    
zParser.addParseListenerc                 C   s.   | j d k	r*| j | t| j dkr*d | _ d S Nr   )r@   removelenrZ   r   r   r   removeParseListener   s    
zParser.removeParseListenerc                 C   s
   d | _ d S r   )r@   rI   r   r   r   removeParseListeners   s    zParser.removeParseListenersc                 C   s2   | j d k	r.| j D ]}|| j | j| qd S r   )r@   r*   r-   	enterRulerZ   r   r   r   triggerEnterRuleEvent   s    

zParser.triggerEnterRuleEventc                 C   s6   | j d k	r2t| j D ]}| j| || j qd S r   )r@   reversedr-   exitRuler2   rZ   r   r   r   triggerExitRuleEvent   s    
zParser.triggerExitRuleEventc                 C   s   | j S r   )rA   rI   r   r   r   getNumberOfSyntaxErrors   s    zParser.getNumberOfSyntaxErrorsc                 C   s
   | j jjS r   r$   tokenSource_factoryrI   r   r   r   getTokenFactory   s    zParser.getTokenFactory)factoryc                 C   s   || j j_d S r   rg   )r   rk   r   r   r   setTokenFactory   s    zParser.setTokenFactoryc                 C   sV   |   }|d krtd| j|d }|d krRt }d|_t||}|| j|< |S )NzDThe current parser does not support an ATN with bypass alternatives.T)ZgetSerializedATNr   bypassAltsAtnCachegetr   ZgenerateRuleBypassTransitionsr   Zdeserialize)r   ZserializedAtnresultZdeserializationOptionsr   r   r   getATNWithBypassAlts   s    
zParser.getATNWithBypassAltsN)patternpatternRuleIndexlexerc                 C   sR   |d kr,|   d k	r,|   j}t|tr,|}|d kr<tdt|| }|||S )Nz$Parser can't discover a lexer to use)getTokenStreamrh   
isinstancer   r   r   compile)r   rq   rr   rs   rh   mr   r   r   compileParseTreePattern  s    


zParser.compileParseTreePatternc                 C   s   |   S r   )rt   rI   r   r   r   getInputStream  s    zParser.getInputStream)r7   c                 C   s   |  | d S r   )setTokenStreamr   r7   r   r   r   rB   !  s    zParser.setInputStreamc                 C   s   | j S r   )r$   rI   r   r   r   rt   $  s    zParser.getTokenStreamc                 C   s   d | _ |   || _ d S r   )r$   rF   r{   r   r   r   rz   (  s    zParser.setTokenStreamc                 C   s   | j dS Nr   )r$   r%   rI   r   r   r   rN   0  s    zParser.getCurrentToken)msgoffendingTokenec                 C   sJ   |d kr|   }|  jd7  _|j}|j}|  }|| ||||| d S r|   )rN   rA   linecolumngetErrorListenerDispatchsyntaxError)r   r}   r~   r   r   r   rX   r   r   r   notifyErrorListeners3  s    zParser.notifyErrorListenersc                 C   s   |   }|jtjkr |    | jd k	o6t| jdk}| jsB|r| j	
| r\| j|}n| j|}|r| jD ].}t|tr|| qrt|trr|| qr|S r\   )rN   rO   r
   EOFry   rP   r@   r^   r>   r:   ZinErrorRecoveryModer-   rR   addTokenNoderu   r   r1   r   r0   )r   oZhasListenerr/   rX   r   r   r   rP   Q  s    



zParser.consumec                 C   s    | j jd k	r| j j| j  d S r   )r-   	parentCtxaddChildrI   r   r   r   addContextToParseTreec  s    zParser.addContextToParseTree)localctxstate	ruleIndexc                 C   s@   || _ || _| jd| j_| jr*|   | jd k	r<|   d S r|   )	r   r-   r$   r%   startr>   r   r@   rb   )r   r   r   r   r   r   r   ra   k  s    
zParser.enterRulec                 C   s:   | j d| j_| jd k	r"|   | jj| _| jj| _d S rK   )	r$   r%   r-   stopr@   re   invokingStater   r   rI   r   r   r   rd   t  s
    

zParser.exitRule)r   altNumc                 C   sJ   | | | jr@| j|kr@| jjd k	r@| jj  | jj| || _d S r   )setAltNumberr>   r-   r   removeLastChildr   )r   r   r   r   r   r   enterOuterAlt|  s    
zParser.enterOuterAltc                 C   s    t | jdkrdS | jd S d S rU   )r^   r<   rI   r   r   r   getPrecedence  s    zParser.getPrecedence)r   r   r   
precedencec                 C   s>   || _ | j| || _| jd| j_| jd k	r:|   d S r|   )	r   r<   r=   r-   r$   r%   r   r@   rb   )r   r   r   r   r   r   r   r   enterRecursionRule  s    
zParser.enterRecursionRulec                 C   sX   | j }||_||_| jd|_|| _ |j| j _| jrB| j | | j	d k	rT| 
  d S rK   )r-   r   r   r$   r%   r   r   r>   r   r@   rb   )r   r   r   r   previousr   r   r   pushNewRecursionContext  s    

zParser.pushNewRecursionContext)r   c                 C   sr   | j   | jd| j_| j}| jd k	rJ| j|k	rP|   | jj| _q*n|| _||_| j	rn|d k	rn|
| d S rK   )r<   popr$   r%   r-   r   r@   re   r   r>   r   )r   r   ZretCtxr   r   r   unrollRecursionContexts  s    


zParser.unrollRecursionContexts)r   c                 C   s(   | j }|d k	r$|j|kr|S |j}qd S r   )r-   r   r   )r   r   r)   r   r   r   getInvokingContext  s    
zParser.getInvokingContext)r   r   c                 C   s   || j d kS rK   )r<   )r   r   r   r   r   r   precpred  s    zParser.precpred)contextc                 C   s   dS )NFr   )r   r   r   r   r   	inContext  s    zParser.inContext)r,   c                 C   s   | j j}| j}|j| j }||}||kr0dS tj|kr>dS |d k	r|jdkrtj|kr|j|j }|j	d }||j
}||krdS |j}q>tj|kr|tjkrdS dS d S )NTFr   )rH   atnr-   statesr   
nextTokensr
   EPSILONr   transitionsfollowStater   r   )r   r,   r   r)   s	followingr   rtr   r   r   isExpectedToken  s$    


zParser.isExpectedTokenc                 C   s   | j j| j| jS r   )rH   r   getExpectedTokensr   r-   rI   r   r   r   r     s    zParser.getExpectedTokensc                 C   s   | j j}|j| j }||S r   )rH   r   r   r   r   )r   r   r   r   r   r   "getExpectedTokensWithinCurrentRule  s    z)Parser.getExpectedTokensWithinCurrentRule)ruleNamec                 C   s$   |   |d }|d k	r|S dS d S rK   )getRuleIndexMaprn   )r   r   r   r   r   r   r#     s    zParser.getRuleIndex)pc                 C   sT   |d kr| j }t }|d k	rP| }|dk r8|d n|| j|  |j}q|S )Nr   zn/a)r-   r;   r#   r=   r"   r   )r   r   stackr   r   r   r   getRuleInvocationStack  s    zParser.getRuleInvocationStackc                 C   s   dd | j jD S )Nc                 S   s   g | ]}t |qS r   )r+   ).0dfar   r   r   
<listcomp>  s     z(Parser.getDFAStrings.<locals>.<listcomp>)rH   decisionToDFArI   r   r   r   getDFAStrings  s    zParser.getDFAStringsc                 C   s   d}t dt| jjD ]j}| jj| }t|jdkr|rDt| jd tdt|j d | jd t|	| j
| jd| jd d}qd S )	NFr   r   z	Decision : )endr   T)ranger^   rH   r   r   r!   r'   r+   decisiontoStringliteralNamessymbolicNames)r   ZseenOneir   r   r   r   dumpDFA"  s    zParser.dumpDFAc                 C   s   | j jS r   )r$   
sourceNamerI   r   r   r   getSourceName.  s    zParser.getSourceName)tracec                 C   sH   |s|  | j d | _n,| jd k	r.|  | j t| | _| | j d S r   )r_   r?   r   r[   )r   r   r   r   r   rG   4  s    

zParser.setTrace)N)NN)N)?r3   r4   r5   dictrm   sysstdoutr   r   r   rF   intrT   rV   rW   r   r[   r_   r`   rb   re   rf   rj   r   rl   rp   r+   r   rx   ry   r   rB   rt   rz   rN   r
   r   r   rP   r   r	   ra   rd   r   r   r   r   r   r   r   r   r   r   r   r   r#   r   r   r   r   boolrG   __classcell__r   r   rC   r   r6   +   sV   			r6   )$r   Z	typing.ior   antlr4.BufferedTokenStreamr   antlr4.CommonTokenFactoryr   antlr4.error.ErrorStrategyr   antlr4.InputStreamr   antlr4.Recognizerr   antlr4.RuleContextr   antlr4.ParserRuleContextr	   antlr4.Tokenr
   antlr4.Lexerr   antlr4.atn.ATNDeserializerr   Z$antlr4.atn.ATNDeserializationOptionsr   antlr4.error.Errorsr   r   Z#antlr4.tree.ParseTreePatternMatcherr   antlr4.tree.Treer   r   r   r   r6   r   r   r   r   <module>   s"   