a
    d41                     @   s4  d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZmZ ze W n eyn   eZY n0 d	d
 ZG dd dZG dd dZG dd dZG dd dZd/ddZdd ZG dd dZG dd deZdd Zdd Zdd  Zd!d" Zd#d$ Z d%d& Z!d'd( Z"d)d* Z#d+d, Z$d-d. Z%dS )0z$This module implements a CYK parser.    )defaultdictN   )
ParseError)Token)Tree)TerminalNonTerminalSymbolc                 C   s   t | tsJ | j|jkS N)
isinstanceTnametype)ts r   Y/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lark/parsers/cyk.pymatch   s    r   c                       sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )RulezContext-free grammar rule.c                    sV   t t|   t|ts J |tdd |D s:J ||| _|| _|| _|| _	d S )Nc                 s   s"   | ]}t |tpt |tV  qd S r
   )r   NTr   .0xr   r   r   	<genexpr>        z Rule.__init__.<locals>.<genexpr>)
superr   __init__r   r   alllhsrhsweightalias)selfr   r   r    r!   	__class__r   r   r      s    zRule.__init__c                 C   s$   dt | jddd | jD f S )Nz%s -> %s c                 s   s   | ]}t |V  qd S r
   strr   r   r   r   r   '   r   zRule.__str__.<locals>.<genexpr>)r'   r   joinr   r"   r   r   r   __str__&   s    zRule.__str__c                 C   s   t | S r
   r&   r)   r   r   r   __repr__)   s    zRule.__repr__c                 C   s   t | jt| jfS r
   )hashr   tupler   r)   r   r   r   __hash__,   s    zRule.__hash__c                 C   s   | j |j ko| j|jkS r
   r   r   r"   otherr   r   r   __eq__/   s    zRule.__eq__c                 C   s
   | |k S r
   r   r0   r   r   r   __ne__2   s    zRule.__ne__)__name__
__module____qualname____doc__r   r*   r+   r.   r2   r3   __classcell__r   r   r#   r   r      s   	r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )GrammarzContext-free grammar.c                 C   s   t || _d S r
   )	frozensetrulesr"   r;   r   r   r   r   9   s    zGrammar.__init__c                 C   s   | j |j kS r
   )r;   r0   r   r   r   r2   <   s    zGrammar.__eq__c                 C   s"   dd tdd | jD  d S )N
c                 s   s   | ]}t |V  qd S r
   )reprr   r   r   r   r   @   r   z"Grammar.__str__.<locals>.<genexpr>)r(   sortedr;   r)   r   r   r   r*   ?   s    zGrammar.__str__c                 C   s   t | S r
   r&   r)   r   r   r   r+   B   s    zGrammar.__repr__N)r4   r5   r6   r7   r   r2   r*   r+   r   r   r   r   r9   6   s
   r9   c                   @   s"   e Zd ZdZdddZdd ZdS )	RuleNodez@A node in the parse tree, which also contains the full rhs rule.r   c                 C   s   || _ || _|| _d S r
   )rulechildrenr    )r"   rA   rB   r    r   r   r   r   J   s    zRuleNode.__init__c                 C   s&   dt | jjddd | jD f S )NzRuleNode(%s, [%s])z, c                 s   s   | ]}t |V  qd S r
   r&   r   r   r   r   r   P   r   z$RuleNode.__repr__.<locals>.<genexpr>)r>   rA   r   r(   rB   r)   r   r   r   r+   O   s    zRuleNode.__repr__N)r   )r4   r5   r6   r7   r   r+   r   r   r   r   r@   G   s   
r@   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
ParserzParser wrapper.c                    sB   t t   dd |D  _ fdd|D }tt| _d S )Nc                 S   s   i | ]
}||qS r   r   r   rA   r   r   r   
<dictcomp>Y   r   z#Parser.__init__.<locals>.<dictcomp>c                    s   g | ]}  |qS r   )_to_rulerD   r)   r   r   
<listcomp>Z   r   z#Parser.__init__.<locals>.<listcomp>)r   rC   r   
orig_rulesto_cnfr9   grammarr<   r#   r)   r   r   W   s    zParser.__init__c                 C   sL   t |jtsJ tdd |jD s(J t|j|j|jjrB|jjnd|dS )z?Converts a lark rule, (lhs, rhs, callback, options), to a Rule.c                 s   s   | ]}t |tV  qd S r
   )r   r	   r   r   r   r   r   `   r   z"Parser._to_rule.<locals>.<genexpr>r   r    r!   )r   originr   r   Z	expansionr   optionspriority)r"   Z	lark_ruler   r   r   rF   ]   s    zParser._to_rulec                    st    sJ t   t|| j\}}t fdd|dt|d f D rNtd|dt|d f   }| t|S )z(Parses input, which is a list of tokens.c                 3   s   | ]}|j  kV  qd S r
   )r   )r   rstartr   r   r   m   r   zParser.parse.<locals>.<genexpr>r      zParsing failed.)r   _parserJ   r   lenr   _to_tree
revert_cnf)r"   Z	tokenizedrQ   tabletreesparser   rP   r   rY   f   s    &zParser.parsec                 C   sl   | j |jj }g }|jD ]<}t|tr8|| | qt|jt	sHJ ||j qt
|j|}||_|S )z.Converts a RuleNode parse tree to a lark Tree.)rH   rA   r!   rB   r   r@   appendrU   r   r   r   rL   )r"   Z	rule_nodeZ	orig_rulerB   childr   r   r   r   rU   r   s    

zParser._to_tree)	r4   r5   r6   r7   r   rF   rY   rU   r8   r   r   r#   r   rC   T   s
   	rC   c                 C   s`   t | trBtd|d  t| jj  | jD ]}t||d  q,ntd|d  t| j  d S )Nr%   r   rR   )	r   r@   printr'   rA   r   rB   print_parser   )nodeindentr[   r   r   r   r]      s
    

r]   c              
   C   s  t t}t t}t| D ]\}}|j D ]~\}}t||r*|D ]f}|||f | |j|||f vs|j	|||f |j j	k r@t
|t|g|j	d|||f |j< q@q*qtdt| d D ]B}	tt| |	 d D ]&}t|d ||	 D ]}
||
d f}|
||	 d f}t|| || D ]\}}|j|j|jfg D ]}||||	 d f | || |j }|| |j }|j	|j	 |j	 }|j||||	 d f vs|||||	 d f |j j	k rDt
|||g|d||||	 d f |j< qDq&qqq||fS )z*Parses sentence 's' using CNF grammar 'g'.r    r   rR   )r   setdict	enumerateterminal_rulesitemsr   addr   r    r@   r   xrangerT   	itertoolsproductnonterminal_rulesget)r   grW   rX   iwZterminalr;   rA   lpZspan1Zspan2Zr1Zr2Zr1_treeZr2_treeZrule_total_weightr   r   r   rS      s6    
*6rS   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )
CnfWrapperzkCNF wrapper for grammar.

  Validates that the input grammar is CNF and provides helper data structures.
  c                    s   t t|   || _|j| _tt| _tt| _| jD ]}t	|j
tsNJ |t|jdvrdtdt|jdkrt	|jd tr| j|jd  | q6t|jdkrtdd |jD r| jt|j | q6ds6J |q6d S )	N)rR   r   zCYK doesn't support empty rulesrR   r   r   c                 s   s   | ]}t |tV  qd S r
   )r   r   r   r   r   r   r      r   z&CnfWrapper.__init__.<locals>.<genexpr>F)r   rq   r   rJ   r;   r   listrd   rj   r   r   r   rT   r   r   r   rZ   r   r-   )r"   rJ   rO   r#   r   r   r      s    


"zCnfWrapper.__init__c                 C   s   | j |j kS r
   )rJ   r0   r   r   r   r2      s    zCnfWrapper.__eq__c                 C   s
   t | jS r
   )r>   rJ   r)   r   r   r   r+      s    zCnfWrapper.__repr__)r4   r5   r6   r7   r   r2   r+   r8   r   r   r#   r   rq      s   rq   c                       s.   e Zd ZdZ fddZdd ZejZ  ZS )UnitSkipRulez@A rule that records NTs that were skipped during transformation.c                    s    t t| |||| || _d S r
   )r   rs   r   skipped_rules)r"   r   r   rt   r    r!   r#   r   r   r      s    zUnitSkipRule.__init__c                 C   s   t |t| o| j|jkS r
   )r   r   rt   r0   r   r   r   r2      s    zUnitSkipRule.__eq__)	r4   r5   r6   r7   r   r2   r   r.   r8   r   r   r#   r   rs      s   rs   c                 C   sV   g }t | tr|| j7 }|| t |tr6||j7 }t| j|j|| j|j | jdS )NrK   )r   rs   rt   rZ   r   r   r    r!   )Z	unit_ruleZtarget_rulert   r   r   r   build_unit_skiprule   s    




ru   c                 C   s6   | j D ]*}t|jdkrt|jd tr|  S qdS )zDReturns a non-terminal unit rule from 'g', or None if there is none.rR   r   N)r;   rT   r   r   r   )rl   rA   r   r   r   get_any_nt_unit_rule   s    

rv   c                    sF    fdd| j D } fdd| j D }| fdd|D 7 }t|S )zGRemoves 'rule' from 'g' without changing the langugage produced by 'g'.c                    s   g | ]}| kr|qS r   r   r   rA   r   r   rG      r   z%_remove_unit_rule.<locals>.<listcomp>c                    s    g | ]}|j  jd  kr|qS )r   r/   r   rw   r   r   rG      r   c                    s   g | ]}t  |qS r   )ru   )r   refrw   r   r   rG      r   )r;   r9   )rl   rA   	new_rulesrefsr   rw   r   _remove_unit_rule   s    r{   c                 c   s   t | jd ddd | jD  }d| d }t| j| jd t|d g| j| jd	V  tdt	| jd
 D ]4}tt|| | j| t||d  gddd	V  qntt|t	| jd
  | jdd ddd	V  dS )z4Splits a rule whose len(rhs) > 2 into shorter rules.___c                 s   s   | ]}t |V  qd S r
   r&   r   r   r   r   r     r   z_split.<locals>.<genexpr>z__SP_%sz_%dr   rR   rK   r   ZSplitN)
r'   r   r(   r   r   r   r    r!   rg   rT   )rA   Zrule_strZ	rule_namerm   r   r   r   _split  s    $*2r   c              	      s   dd | j D }dd |D g }| j D ]~ t jdkrtdd  jD rfdd	 jD }|t j| j jd
 |	 fdd
 D  q(|  q(t|S )z/Applies the TERM rule on 'g' (see top comment).c                 S   s&   h | ]}|j D ]}t|tr|qqS r   )r   r   r   )r   rA   r   r   r   r   	<setcomp>  r   z_term.<locals>.<setcomp>c              	   S   s,   i | ]$}|t td t| |gdddqS )z__T_%sr   ZTermrK   )r   r   r'   )r   r   r   r   r   rE     r   z_term.<locals>.<dictcomp>rR   c                 s   s   | ]}t |tV  qd S r
   )r   r   r   r   r   r   r     r   z_term.<locals>.<genexpr>c                    s$   g | ]}t |tr | jn|qS r   )r   r   r   r   )t_rulesr   r   rG     r   z_term.<locals>.<listcomp>rK   c                 3   s    | ]\}}| j v r|V  qd S r
   )r   )r   kvrw   r   r   r     r   )r;   rT   r   anyrZ   r   r   r    r!   extendre   r9   )rl   Zall_try   Znew_rhsr   )rA   r   r   _term  s    
"r   c                 C   s>   g }| j D ]*}t|jdkr*|t|7 }q
|| q
t|S )z.Applies the BIN rule to 'g' (see top comment).r   )r;   rT   r   r   rZ   r9   )rl   ry   rA   r   r   r   _bin  s    
r   c                 C   s$   t | }|r t| |} t | }q| S )z/Applies the UNIT rule to 'g' (see top comment).)rv   r{   )rl   Znt_unit_ruler   r   r   _unit(  s
    

r   c                 C   s   t tt| } t| S )z>Creates a CNF grammar from a general context-free grammar 'g'.)r   r   r   rq   )rl   r   r   r   rI   1  s    rI   c              
   C   s|   |st t| |||d||dS ||d j }t t| |d jg||dt|d j||dd  ||d j|d jg|dS d S )NrK   r`   r   rR   )r@   r   r    r   unroll_unit_skipruler!   )r   Zorig_rhsrt   rB   r    r!   r   r   r   r   7  s    r   c                 C   s   t | tr| S | jjjdr(| jd S g }tt| jD ]4}t |t	rb|jjjdrb||j7 }q8|
| q8t | jtrt| jj| jj| jj|| jj| jjS t	| j|S dS )zDReverts a parse tree (RuleNode) to its original non-CNF form (Node).Z__T_r   Z__SP_N)r   r   rA   r   r   
startswithrB   maprV   r@   rZ   rs   r   r   rt   r    r!   )r^   rB   r[   r   r   r   rV   D  s    

rV   )r   )&r7   collectionsr   rh   
exceptionsr   lexerr   treer   rJ   r   r   r   r   r	   rg   	NameErrorranger   r   r9   r@   rC   r]   rS   rq   rs   ru   rv   r{   r   r   r   r   rI   r   rV   r   r   r   r   <module>   s:   
-
	3
	