U
    :qLe?                     @   s   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mZ d d
lmZ d dlmZ d dlmZmZmZ dZdZG dd deZG dd deZ G dd de!Z"dS )    )CommonTokenStream)InputStream)ParserRuleContext)Lexer)ListTokenSource)Token)BailErrorStrategy)RecognitionExceptionParseCancellationException)TagChunk	TextChunk)RuleTagToken)TokenTagToken)	ParseTreeTerminalNodeRuleNodeNc                       s"   e Zd Zed fddZ  ZS )CannotInvokeStartRule)ec                    s   t  | d S N)super__init__)selfr   	__class__ z/home/p21-0144/sympy/latex2sympy2solve-back-end/sympyEq/lib/python3.8/site-packages/antlr4/tree/ParseTreePatternMatcher.pyr   S   s    zCannotInvokeStartRule.__init__)__name__
__module____qualname__	Exceptionr   __classcell__r   r   r   r   r   Q   s   r   c                   @   s   e Zd ZdS )"StartRuleDoesNotConsumeFullPatternN)r   r   r   r   r   r   r   r!   V   s   r!   c                   @   s   e Zd ZeedddZeeedddZeee	ddd	Z
eed
ddZeee	dddZeed
ddZee	dddZeeedddZdd ZedddZedddZeddd Zd!S )"ParseTreePatternMatcher)lexerparserc                 C   s"   || _ || _d| _d| _d| _d S )N<>\)r#   r$   startstopescape)r   r#   r$   r   r   r   r   a   s
    z ParseTreePatternMatcher.__init__)r(   r)   
escapeLeftc                 C   sN   |d kst |dkrtd|d ks0t |dkr8td|| _|| _|| _d S )Nr   zstart cannot be null or emptyzstop cannot be null or empty)lenr   r(   r)   r*   )r   r(   r)   r+   r   r   r   setDelimitersr   s    z%ParseTreePatternMatcher.setDelimiters)treepatternpatternRuleIndexc                 C   s   |  ||}| ||S r   )compileTreePatternmatchesr   r.   r/   r0   pr   r   r   matchesRuleIndex|   s    z(ParseTreePatternMatcher.matchesRuleIndex)r.   r/   c                 C   s   |  ||jt }|d kS r   )	matchImplpatternTreedict)r   r.   r/   mismatchedNoder   r   r   matchesPattern   s    z&ParseTreePatternMatcher.matchesPatternc                 C   s   |  ||}| ||S r   )r1   matchPatternr3   r   r   r   matchRuleIndex   s    z&ParseTreePatternMatcher.matchRuleIndexc                 C   s0   t  }| ||j|}ddlm} |||||S )Nr   )ParseTreeMatch)r8   r6   r7   Zantlr4.tree.ParseTreeMatchr=   )r   r.   r/   labelsr9   r=   r   r   r   r;      s    z$ParseTreePatternMatcher.matchPattern)r/   r0   c              
   C   s  |  |}t|}t|}ddlm} || jj| jj| jj| j	 |}d }z|
t  ||}W nt tk
r }	 z
|	jW 5 d }	~	X Y nN tk
r }	 z|	W 5 d }	~	X Y n* tk
r }	 zt|	W 5 d }	~	X Y nX |dtjkrt ddlm}
 |
| |||S )Nr   )ParserInterpreter   )ParseTreePattern)tokenizer   r   Zantlr4.ParserInterpreterr?   r$   ZgrammarFileName
tokenNames	ruleNamesgetATNWithBypassAltsZsetErrorHandlerr   parser
   causer	   r   r   LAr   EOFr!   Zantlr4.tree.ParseTreePatternrA   )r   r/   r0   Z	tokenListZtokenSrctokensr?   ZparserInterpr.   r   rA   r   r   r   r1      s.    
  z*ParseTreePatternMatcher.compileTreePattern)r.   r7   r>   c                 C   s  |d krt d|d kr t dt|trt|trd }|jj|jjkrt|jtr|j}| ||j| |jd k	r| ||j| q|	 |	 krq|d kr|}n|d kr|}|S t|t
rt|t
rd }| |}|d k	r<d }|jj|jjkr*| ||j| |jd k	r8| ||j| n|d kr8|}|S | | kr`|d kr\|}|S | }td|D ]2}	| ||	||	|}
|
d k	rr|
  S qr|S |S )Nztree cannot be nullzpatternTree cannot be nullr   )r   
isinstancer   symboltyper   map	tokenNamelabelgetTextr   getRuleTagTokenZruleContext	ruleIndexruleNamegetChildCountranger6   getChild)r   r.   r7   r>   r9   ZtokenTagTokenZruleTagTokenmniZ
childMatchr   r   r   r6      sT    





z!ParseTreePatternMatcher.matchImplc                 C   s0   | |d }|d kr"t }|||< || d S r   )getlistappend)r   r>   rP   r.   vr   r   r   rN     s
    zParseTreePatternMatcher.map)r.   c                 C   sF   t |trB| dkrBt |dtrB|d}t |jtrB|jS d S )Nr@   r   )rK   r   rU   rW   r   rL   r   )r   r.   cr   r   r   rR   
  s    

z'ParseTreePatternMatcher.getRuleTagToken)r/   c           	      C   sD  |  |}t }|D ](}t|tr|jd  r|| j|j}|tj	krdt
dt|j d | |t|j||j n|jd  r| j|j}|dkrt
dt|j d | | j j| }|t|j||j nt
dt|j d | q| jt|j | j }|jtjkr|| | j }qq|S )Nr   zUnknown token z in pattern: zUnknown rule zinvalid tag: )splitr\   rK   r   tagisupperr$   getTokenTyper   INVALID_TYPEr   strr]   r   rP   islowergetRuleIndexrE   ruleToTokenTyper   r#   setInputStreamr   text	nextTokenrM   rI   )	r   r/   chunksrJ   chunkttyperS   ZruleImaginaryTokenTypetr   r   r   rB     s,    





z ParseTreePatternMatcher.tokenizec                 C   s  d}t |}t }t }t }||k r||| j| j |krX|t | jt | j 7 }q||| j| j |kr|t | jt | j 7 }q||| j|kr|| |t | j7 }q||| j|kr|| |t | j7 }q|d7 }qt |}|t |krtd| |t |k r(td| td|D ]$}|| || kr2td| q2|dkrp|t	| |dkr|d dkr|d|d  }	|
t	|	 td|D ]}||| t | j ||  }
|
}d }|
d}|dkr|
d| }|
|d t |
 }|t|| |d t |k r||| t | j ||d   }	|t	|	 q|dkr||d  t | j }||k r||| }	|t	|	 tdt |D ]J}|| }t|t	r|j| jd}t |t |jk rt	|||< q|S )Nr   r@   zunterminated tag in pattern: zmissing start tag in pattern: z(tag delimiters out of order in pattern: : )r,   r\   findr*   r(   r)   r]   r   rV   r   addr   rK   rk   replace)r   r/   r4   rY   rm   ZstartsZstopsntrZ   rk   rb   ZruleOrTokenrP   ZcolonZafterLastTagr_   Z	unescapedr   r   r   ra   1  sl    





"

zParseTreePatternMatcher.splitN)r   r   r   r   Parserr   rf   r-   r   intr5   rA   r:   r<   r;   r1   r8   r6   rN   rR   rB   ra   r   r   r   r   r"   [   s   
	

"@r"   )#antlr4.CommonTokenStreamr   antlr4.InputStreamr   antlr4.ParserRuleContextr   antlr4.Lexerr   Zantlr4.ListTokenSourcer   antlr4.Tokenr   antlr4.error.ErrorStrategyr   antlr4.error.Errorsr	   r
   Zantlr4.tree.Chunkr   r   Zantlr4.tree.RuleTagTokenr   Zantlr4.tree.TokenTagTokenr   antlr4.tree.Treer   r   r   rw   rA   r   r   r!   objectr"   r   r   r   r   <module>@   s    