
    *                         d Z ddlmZ ddlmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZmZ ddlmZ  G d	 d
      Z ed      Z ed      Z G d d      Z G d de      Zd Zd Z G d de      Zy)zThis module builds a LALR(1) transition-table for lalr_parser.py

For now, shift/reduce conflicts are automatically resolved as shifts.
    )defaultdict   )classifyclassify_boolbfsfzset
Enumeratorlogger)GrammarError   )GrammarAnalyzerTerminal
LR0ItemSet)Rulec                       e Zd Zd Zd Zd Zy)Actionc                     || _         y Nname)selfr   s     -lib/third_party/lark/parsers/lalr_analysis.py__init__zAction.__init__   s	    	    c                     | j                   S r   r   r   s    r   __str__zAction.__str__   s    yyr   c                     t        |       S r   )strr   s    r   __repr__zAction.__repr__   s    4yr   N)__name__
__module____qualname__r   r   r     r   r   r   r      s    r   r   ShiftReducec                   (    e Zd Zd Zd Zed        Zy)
ParseTablec                 .    || _         || _        || _        y r   )statesstart_states
end_states)r   r*   r+   r,   s       r   r   zParseTable.__init__    s    ($r   c                    t               }| j                  j                         D ci c][  \  }}||j                         D ci c]7  \  }\  }}|j                  |      |t        u rd|j                  |      fnd|f9 c}}}] }}}}}}|j                         || j                  | j                  dS c c}}}w c c}}}}}w )Nr   r   )tokensr*   r+   r,   )	r	   r*   itemsgetr&   	serializereversedr+   r,   )	r   memor.   stateactionstokenactionargr*   s	            r   r1   zParseTable.serialize%   s    
 #'++"3"3"5
 #6w 07A0?,} JJu%FfDTCMM$,?(@[\^aZbb0?A A"5 	 
 oo' --//	
 	
A
s   C<B:C:Cc                 F   |d   }|d   j                         D ci c]Y  \  }}||j                         D ci c]5  \  }\  }}||   |dk(  rt        t        j                  ||      fnt        |f7 c}}}[ }	}}}}} | |	|d   |d         S c c}}}w c c}}}}}w )Nr.   r*   r   r+   r,   )r/   r&   r   deserializer%   )
clsdatar3   r.   r4   r5   r6   r7   r8   r*   s
             r   r:   zParseTable.deserialize5   s    h #'x."6"6"8
 #9w 07A0?,} 5MVUVYVT-=-=c4-H$I]bdg\hh0?A A"8 	 

 64/l1CDD	A
s   B:B6BBN)r!   r"   r#   r   r1   classmethodr:   r$   r   r   r(   r(      s"    %

  E Er   r(   c                       e Zd Zed        Zy)IntParseTablec           
      :   t        |j                        }t        |      D ci c]  \  }}||
 }}}i }|j                  j                         D ]H  \  }}|j                         D 	ci c]   \  }}	||	d   t        u r|	d   ||	d      fn|	" }}}	||||   <   J |j
                  j                         D 
ci c]  \  }
}|
||    }}
}|j                  j                         D 
ci c]  \  }
}|
||    }}
} | |||      S c c}}w c c}	}w c c}}
w c c}}
w )Nr   r   )listr*   	enumerater/   r%   r+   r,   )r;   parse_tableenumisstate_to_idx
int_stateslakvstartr+   r,   s                r   from_ParseTablezIntParseTable.from_ParseTableB   s8   K&&''07!!7
 ''--/EArXXZ)'ca !A$%-QqT<!-.QF'  ),.JQ) 0 ?J>V>V>\>\>^_>^(%l1o->^_<G<R<R<X<X<Z[<ZqeLO+<Z
[:|Z88 8)
 `[s   D)%D8D(DN)r!   r"   r#   r=   rM   r$   r   r   r?   r?   @   s    9 9r   r?   c           
      |    i }g }t         j                  | d      }| D ]  }||   dk(  st        |||| |||        |S Nr   )dictfromkeystraverse)XRGFSNxs          r   digraphrZ   [   sL    
A
AaAQ419Q1aAq)  Hr   c           
      v   |j                  |        t        |      }||| <   ||    || <   ||    D ]Y  }||   dk(  rt        |||||||       ||    }	|	dkD  sJ ||   }
|
dk7  sJ |
dkD  r
|
|	k  r|
|| <   ||    j                  ||          [ ||    |k(  r'||    }	 |j	                         }d||<   |||<   || k(  ry !y )Nr   )appendlenrR   updatepop)rY   rW   rX   rS   rT   rU   rV   dyn_xn_yf_xzs                r   rR   rR   l   s    HHQKAAAaDQ4AaDqTQ419Q1aAq)dQwwdaxx!G#)AaD	!AaD  	tqydAAaDAaDAv  r   c                   8    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	y)
LALR_Analyzerc                     t        j                  | |||       g | _        t        t              | _        t        t              | _        t        t              | _        t        t              | _        y r   )	r   r   nonterminal_transitionsr   setdirectly_readsreadsincludeslookback)r   parser_confdebugstricts       r   r   zLALR_Analyzer.__init__   sO      {E6B')$)#. %
#C(#C(r   c                      t                _        i  fd}t         j                  j	                         |      D ]  } y )Nc           	   3   J  K   t        | j                  d       \  }}t        |d       }|j                         D ]  \  }}t	        |D ch c]  }|j                  |       c}      }
j                  |d       }|pt        |      }	|D ]O  }|j                  r|j                  j                  r'|	j                  |j                  j                        z  }	Q t        ||	      }|
|<   || j                  |<   |  j                  j!                  |        y c c}w w)Nc                     | j                   S r   )is_satisfiedrps    r   <lambda>z@LALR_Analyzer.compute_lr0_states.<locals>.step.<locals>.<lambda>   s    rr   c                     | j                   S r   )nextrw   s    r   ry   z@LALR_Analyzer.compute_lr0_states.<locals>.step.<locals>.<lambda>   s    277r   )r   closurer   r/   r   advancer0   rk   rv   r{   is_termexpand_rulelr0_rules_by_originr   transitions
lr0_statesadd)r4   _unsatra   symrpsrx   kernel	new_stater|   cacher   s             r   stepz.LALR_Analyzer.compute_lr0_states.<locals>.step   s     $U]]4NOHAu 23AGGIS#>#B

3#>?!IIfd3	$!&kG$!rww#t'7'7AYAY'ZZG % !+67 ;I$-E&M)2!!#& & OO&  ?s   AD#
D
"7D#D#1A2D#)rk   r   r   lr0_start_statesvalues)r   r   r   r   s   `  @r   compute_lr0_statesz LALR_Analyzer.compute_lr0_states   s;    %	'( T**113T:A ;r   c                 \   | j                   j                         D ]l  }t        |j                        dk(  sJ |j                  D ]A  }|j                  dk(  sJ t        t        d      g      | j                  ||j                  f<   C n | j                  D ]  }t               }|j                  D ]  }|j                  r|j                  }|| j                  vr+||v r0|j                  |       ||f}| j                  j                  |       | j                  |   }| j                   |   }|j"                  |   }	|	j                  D ]\  }
|
j                  r|
j                  }|| j                  vr|j                  |       || j$                  v sJ|j                  |	|f       ^   y )Nr   r   z$END)r   r   r^   r   indexrk   r   rl   r{   r   r|   rv   r   r   rj   r]   rm   r   NULLABLE)r   rootrx   r4   seenrF   ntdrr
next_staterp2s2s               r   compute_reads_relationsz%LALR_Analyzer.compute_reads_relations   sx   ))002Dt{{#q()(kkxx1}%}7:Xf=M;O7P##T277O4 " 3 __E5Dmm??GGD4449QZ,,33B7((,JJrN"..q1
%--C'' B!9!99r
T]]*z2./ . $ %r   c           	         | j                   D ]  }|\  }}g }| j                  |   }|j                  D ]a  }|j                  j                  |k7  r|}t        |j                  t        |j                  j                              D ]  }|j                  j                  |   }	||	f}
|j                  |	   }|
| j                  vr>t        |dz   t        |j                  j                              D ])  }|j                  j                  |   | j                  vs)  |j                  |
        |j                  dk(  s|j                  D ]F  }|j                  |j                  k(  s|j                  s*|j                  ||j                  f       H d |D ]   }
| j                  |
   j                  |       "  y )Nr   r   )rj   ro   r|   ruleoriginranger   r^   	expansionr   rm   r   r]   rv   r   rn   )r   r   r4   nonterminalrn   ro   rx   state2rE   rF   nt2jr   s                r   compute_includes_lookbackz'LALR_Analyzer.compute_includes_lookback   sr   ..B!#E;H}}R(Hmm77>>[0rxxRWW->->)?@A))!,A!1+C#//2F$**, "1q5#bgg.?.?*@A77,,Q/t}}D! B !, A 88q=%~~HH/S5E5E$LL&#(();<  .% $*  c"&&r*  3 /r   c                 D   t        | j                  | j                  | j                        }t        | j                  | j                  |      }| j
                  j                         D ]7  \  }}|D ]-  \  }}||   D ]   }|j                  |   j                  |       " / 9 y r   )	rZ   rj   rm   rl   rn   ro   r/   
lookaheadsr   )r   	read_setsfollow_setsr   	lookbacksr4   r   rF   s           r   compute_lookaheadsz LALR_Analyzer.compute_lookaheads   s    D88$**dFYFYZ	d::DMM9U!]]002MB	(t$RA$$Q'++D1 )  ) 3r   c                 v   i }g }| j                   D ]  }|j                  j                         D ci c]  \  }}|t        |j                  f }}}|j
                  j                         D ]?  \  }}t        |      dkD  rl|D cg c]  }|j                  j                  xs d|f  }	}|	j                  d d       |	d d \  }
}|
d   |d   kD  r|
d   g}n|j                  |||f       |\  }||v r| j                  rt        d|j                   d      | j                  r7t        j                   d	|j                         t        j                   d
|       t        j                  d	|j                         t        j                  d
|       )t"        t%        |      d   f||<   B |j                         D ci c]  \  }}|j                  | c}}||<    |rg }|D ]  \  }}}d|ddj'                  |D cg c]  }dt)        |      z    c}      }| j                  r;|ddj'                  |j                  D cg c]  }dt)        |      z    c}      z  z  }|j                  |        t        dj'                  |            |j                         D ci c]  \  }}|j                  | }}}i }|D ]Y  }|D ]R  }| j*                  D ]A  }|j,                  j.                  j                  d|z   k(  s*|j0                  s7||vsJ |||<   C T [ t3        || j*                  j                         D ci c]  \  }}||j                   c}}|      }| j                  r|| _        y t6        j9                  |      | _        y c c}}w c c}w c c}}w c c}w c c}w c c}}w c c}}w )Nr   r   c                     | d   S rO   r$   )r   s    r   ry   z4LALR_Analyzer.compute_lalr1_states.<locals>.<lambda>   s    1r   T)keyreverser   z#Shift/Reduce conflict for terminal z. [strict-mode]
 z;Shift/Reduce conflict for terminal %s: (resolving as shift)z * %szReduce/Reduce collision in z between the following rules:  z
	- z+
    collision occurred in state: {%s
    }z
	z

z$root_)r   r   r/   r%   r|   r   r^   optionsprioritysortr]   rr   r   r   rq   r
   warningr&   rA   joinr   r   r   r   rv   r(   rC   r?   rM   )r   mreduce_reducer4   rI   r   r5   rulesr   pbestsecond_bestr   rJ   rK   msgsmsgrY   r*   r,   rx   rL   _parse_tables                          r   compute_lalr1_statesz"LALR_Analyzer.compute_lalr1_states   s   __EMRM^M^MdMdMfgMf>2zrE:#5#566MfGg"--335	Eu:>?DEu!!)),,115uAEFF~tF<()"1%D+AwQ/!%a	%,,eR-?@ ={{*-PQSQXQXPYYk+lmm'dfhfmfmnw5%bdfdkdklWd3#)4;q>":GBK/ 60 07}}@tq!@AeH5 %8 D$1 r5Y[]_]d]d  CH  fJ  CH}~goruvwrxgx  CH  fJ  ^K  L::JRWWoto|o|U}o|jkV\_bcd_eVeo|U}M~~~CC 	 %2
 v{{4011,-GGI7IDAq199a<I7 
E!22Eww~~**x%/?@R__$J676,1
5) 3   "&UYUjUjUpUpUr*tUr\UEE5==,@Ur*t  wA  B::+D,<<\JDi h F* A
 fJU} 8 +us)   N#NNN%N*(N/N5c                     | j                          | j                          | j                          | j                          | j	                          y r   )r   r   r   r   r   r   s    r   compute_lalrzLALR_Analyzer.compute_lalr.  s>    !$$&&&(!!!#r   N)FF)
r!   r"   r#   r   r   r   r   r   r   r   r$   r   r   rh   rh      s(    )8!0F+:28Kt$r   rh   N)__doc__collectionsr   utilsr   r   r   r   r	   r
   
exceptionsr   grammar_analysisr   r   r   grammarr   r   r%   r&   r(   r?   rZ   rR   rh   r$   r   r   <module>r      sq    $ K K % C C   	w		E EB9J 96"2n$O n$r   