U
    ’F[¶$  ã                   @   s8   d dl mZ d dlmZ d dlmZ G dd„ deƒZdS )é    )ÚStringIO)ÚToken)ÚCommonTokenStreamc                       s  e Zd ZdZdZdZ‡ fdd„Zdd„ Zdd	„ Zefd
d„Z	efdd„Z
efdd„Zdd„ Zefdd„Zdd„ Zdd„ Zdd„ Zdd„ Zefdd„Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zefd&d'„Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ ZG d0d1„ d1eƒZG d2d3„ d3eƒZG d4d5„ d5eƒZ‡  Z S )6ÚTokenStreamRewriterÚdefaultéd   r   c                    s*   t t| ƒ ¡  || _| jg i| _i | _dS )zw
        :type  tokens: antlr4.BufferedTokenStream.BufferedTokenStream
        :param tokens:
        :return:
        N)Úsuperr   Ú__init__ÚtokensÚDEFAULT_PROGRAM_NAMEÚprogramsÚlastRewriteTokenIndexes)Úselfr
   ©Ú	__class__© úq/home/p21-0144/sympy/latex2sympy2solve-back-end/sympyEq/lib/python3.8/site-packages/antlr4/TokenStreamRewriter.pyr	      s    zTokenStreamRewriter.__init__c                 C   s   | j S ©N)r
   ©r   r   r   r   ÚgetTokenStream   s    z"TokenStreamRewriter.getTokenStreamc                 C   s*   | j  |d ¡}|r&|| j|… | j |< d S r   )r   ÚgetÚMIN_TOKEN_INDEX)r   Zinstruction_indexÚprogram_nameZinsr   r   r   Úrollback    s    zTokenStreamRewriter.rollbackc                 C   s   |   | j|¡ d S r   )r   r   ©r   r   r   r   r   ÚdeleteProgram%   s    z!TokenStreamRewriter.deleteProgramc                 C   s   |   |j||¡ d S r   )ÚinsertAfterÚ
tokenIndex©r   ÚtokenÚtextr   r   r   r   ÚinsertAfterToken(   s    z$TokenStreamRewriter.insertAfterTokenc                 C   s   |   ||d |¡ d S ©Né   )ÚinsertBefore)r   Úindexr    r   r   r   r   r   +   s    zTokenStreamRewriter.insertAfterc                 C   s   |   | j||¡ d S r   )r$   r   ©r   r%   r    r   r   r   ÚinsertBeforeIndex.   s    z%TokenStreamRewriter.insertBeforeIndexc                 C   s   |   ||j|¡ d S r   )r$   r   r   r   r   r   ÚinsertBeforeToken1   s    z%TokenStreamRewriter.insertBeforeTokenc                 C   s2   |   | j||¡}|  |¡}t|ƒ|_| |¡ d S r   )ÚInsertBeforeOpr
   Ú
getProgramÚlenÚinstructionIndexÚappend)r   r   r%   r    ÚopÚrewritesr   r   r   r$   4   s    

z TokenStreamRewriter.insertBeforec                 C   s   |   | j|||¡ d S r   ©Úreplacer   r&   r   r   r   ÚreplaceIndex:   s    z TokenStreamRewriter.replaceIndexc                 C   s   |   | j|||¡ d S r   r0   )r   Úfrom_idxÚto_idxr    r   r   r   ÚreplaceRange=   s    z TokenStreamRewriter.replaceRangec                 C   s   |   | j|j|j|¡ d S r   )r1   r   r   )r   r   r    r   r   r   ÚreplaceSingleToken@   s    z&TokenStreamRewriter.replaceSingleTokenc                 C   s   |   ||j|j|¡ d S r   )r1   r   )r   Z
from_tokenZto_tokenr    r   r   r   r   ÚreplaceRangeTokensC   s    z&TokenStreamRewriter.replaceRangeTokensc                 C   sv   t ||k|dk |dk |t| jjƒkfƒrBtd ||t| jjƒ¡ƒ‚|  ||| j|¡}|  |¡}t|ƒ|_| |¡ d S )Nr   z'replace: range invalid: {}..{}(size={}))	Úanyr+   r
   Ú
ValueErrorÚformatÚ	ReplaceOpr*   r,   r-   )r   r   r3   r4   r    r.   r/   r   r   r   r1   F   s    (ÿ

zTokenStreamRewriter.replacec                 C   s   |   | j||¡ d S r   ©Údeleter   )r   r   r   r   r   ÚdeleteTokenO   s    zTokenStreamRewriter.deleteTokenc                 C   s   |   | j||¡ d S r   r<   )r   r%   r   r   r   ÚdeleteIndexR   s    zTokenStreamRewriter.deleteIndexc                 C   s2   t |tƒr|  ||j|jd ¡ |  |||d ¡ d S r   )Ú
isinstancer   r1   r   )r   r   r3   r4   r   r   r   r=   U   s    
zTokenStreamRewriter.deletec                 C   s   | j  |d¡S )Néÿÿÿÿ)r   r   r   r   r   r   ÚlastRewriteTokenIndexZ   s    z)TokenStreamRewriter.lastRewriteTokenIndexc                 C   s   || j |< d S r   )r   )r   r   Úir   r   r   ÚsetLastRewriteTokenIndex]   s    z,TokenStreamRewriter.setLastRewriteTokenIndexc                 C   s   | j  |g ¡S r   )r   Ú
setdefaultr   r   r   r   r*   `   s    zTokenStreamRewriter.getProgramc                 C   s"  | j  |¡}|j}|j}|t| jjƒd kr<t| jjƒd }|dk rHd}|sX| j |¡S tƒ }|  |¡}|}t	||k|t| jjƒk fƒrÔ| |¡}	| j |¡}
|	dkrÈ|
j
tjkr¾| |
j¡ |d7 }ql|	 |¡}ql|t| jjƒd kr| ¡ D ]&}	|	jt| jjƒd krò| |	j¡ qò| ¡ S )zz
        :type interval: Interval.Interval
        :param program_name:
        :param interval:
        :return:
        r#   r   N)r   r   ÚstartÚstopr+   r
   ÚgetTextr   Ú _reduceToSingleOperationPerIndexÚallÚtyper   ÚEOFÚwriter    ÚexecuteÚvaluesr%   Úgetvalue)r   r   Úintervalr/   rF   rG   ÚbufZ	indexToOprC   r.   r   r   r   r   rH   c   s2       

 
 zTokenStreamRewriter.getTextc                    sÞ  t |ƒD ]Š\}‰tˆd ktˆtjƒ fƒr.q‡fdd„|d |… D ƒ}|D ]T‰ ˆ jˆjkrzd |ˆ j< d ˆ jˆj¡ˆ_qLt	ˆ jˆjkˆ jˆj
kfƒrLd |ˆ j< qLdd„ |d |… D ƒ}|D ]Ö}t	|jˆjk|j
ˆj
kfƒrèd ||j< q¼t|j
ˆjk |jˆkfƒ}t	|jˆjk|j
ˆj
kfƒ}t	|jd kˆjd k| fƒrvd ||j< t|jˆjƒˆ_t|j
ˆj
ƒˆ_
td ˆ¡ƒ q¼t	||fƒs¼td ˆ|¡ƒ‚q¼qt |ƒD ]8\}‰ tˆ d ktˆ tjƒ fƒrÈqž‡ fdd„|d |… D ƒ}|D ],}	|	jˆ jkræˆ  j|	j7  _d ||< qædd„ |d |… D ƒ}|D ]\‰ˆ jˆjkrZˆ jˆj ˆ_d ||< q.t	ˆ jˆjkˆ jˆjkfƒr.td	 ˆ ˆ¡ƒ‚q.i }
t |ƒD ]8\}}|d kr®q˜|
 |j¡rÄtd
ƒ‚||
|j< q˜|
  S d S )Nc                    s   g | ]}t ˆ tjƒr|‘qS r   ©r@   r   r)   ©Ú.0r.   )Úropr   r   Ú
<listcomp>Œ   s      zHTokenStreamRewriter._reduceToSingleOperationPerIndex.<locals>.<listcomp>z{}{}c                 S   s   g | ]}t |tjƒr|‘qS r   ©r@   r   r;   rT   r   r   r   rW   •   s      z
New rop {}z4replace op boundaries of {} overlap with previous {}c                    s   g | ]}t ˆ tjƒr|‘qS r   rS   rT   )Úiopr   r   rW   ¨   s      c                 S   s   g | ]}t |tjƒr|‘qS r   rX   rT   r   r   r   rW   ®   s      z-insert op {} within boundaries of previous {}zshould be only one op per index)Ú	enumerater8   r@   r   r;   r%   r,   r:   r    rJ   Ú
last_indexZinstructioIndexÚminÚprintr9   r)   r   )r   r/   rC   ZinsertsZprevReplacesZprevRopZ
isDisjointZisSameZprevInsertsZprevIopÚreducedr.   r   )rY   rV   r   rI   †   s`    



  z4TokenStreamRewriter._reduceToSingleOperationPerIndexc                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
z$TokenStreamRewriter.RewriteOperationÚ c                 C   s   || _ || _|| _d| _dS )zœ
            :type tokens: CommonTokenStream
            :param tokens:
            :param index:
            :param text:
            :return:
            r   N)r
   r%   r    r,   ©r   r
   r%   r    r   r   r   r	   Á   s    z-TokenStreamRewriter.RewriteOperation.__init__c                 C   s   | j S )zc
            :type buf: StringIO.StringIO
            :param buf:
            :return:
            )r%   ©r   rR   r   r   r   rN   Î   s    z,TokenStreamRewriter.RewriteOperation.executec                 C   s   d S r   r   r   r   r   r   Ú__str__Ö   s    z,TokenStreamRewriter.RewriteOperation.__str__N)r_   )Ú__name__Ú
__module__Ú__qualname__r	   rN   rb   r   r   r   r   ÚRewriteOperation¿   s   
rf   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )z"TokenStreamRewriter.InsertBeforeOpr_   c                    s   t tj| ƒ |||¡ d S r   )r   r   r)   r	   r`   r   r   r   r	   Û   s    z+TokenStreamRewriter.InsertBeforeOp.__init__c                 C   sB   |  | j¡ | j | j¡jtjkr8|  | j | j¡j¡ | jd S r"   )rM   r    r
   r   r%   rK   r   rL   ra   r   r   r   rN   Þ   s    z*TokenStreamRewriter.InsertBeforeOp.execute)r_   ©rc   rd   re   r	   rN   Ú__classcell__r   r   r   r   r)   Ù   s   r)   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )zTokenStreamRewriter.ReplaceOpc                    s    t tj| ƒ |||¡ || _d S r   )r   r   r;   r	   r[   )r   r3   r4   r
   r    r   r   r   r	   æ   s    z&TokenStreamRewriter.ReplaceOp.__init__c                 C   s   | j r| | j ¡ | jd S r"   )r    rM   r[   ra   r   r   r   rN   ê   s    z%TokenStreamRewriter.ReplaceOp.executerg   r   r   r   r   r;   ä   s   r;   )!rc   rd   re   r   ZPROGRAM_INIT_SIZEr   r	   r   r   r   r!   r   r'   r(   r$   r2   r5   r6   r7   r1   r>   r?   r=   rB   rD   r*   rH   rI   Úobjectrf   r)   r;   rh   r   r   r   r   r      s8   	#9r   N)Úior   Zantlr4.Tokenr   Zantlr4.CommonTokenStreamr   ri   r   r   r   r   r   Ú<module>   s   