
    Q                     v    S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SS	KJr  SS
KJrJr   " S S\5      rg)a  This module implements an experimental Earley parser with a dynamic lexer

The core Earley algorithm used here is based on Elizabeth Scott's implementation, here:
    https://www.sciencedirect.com/science/article/pii/S1571066108001497

That is probably the best reference for understanding the algorithm here.

The Earley parser outputs an SPPF-tree as per that document. The SPPF tree format
is better documented here:
    http://www.bramvandersanden.com/post/2014/06/shared-packed-parse-forest/

Instead of running a lexer beforehand, or using a costy char-by-char method, this parser
uses regular expressions by necessity, achieving high-performance while maintaining all of
Earley's power in parsing any CFG.
    )defaultdict   )Tree)UnexpectedCharacters)Token)Terminal   )Parser)
SymbolNode	TokenNodec                   0    \ rS rSrSSS\4S jrSS jrSrg)	r
      TFc           	          [         R                  " XX#XFU5        UR                   Vs/ s H  n[        U5      PM     snU l        XPl        g s  snf N)
BaseParser__init__ignorer   complete_lex)	self
lexer_confparser_confterm_matcherresolve_ambiguityr   debug
tree_classts	            'lib/third_party/lark/parsers/xearley.pyr   Parser.__init__   sE    DkIZcmn,6,=,=>,=qx{,=>( ?s   ANc           
      r  ^ ^^^^^	^
^^^ UUU	U UUU
UUU4
S jn[        [        5      mT R                  m	T R                  R                  m
0 /mSmSmSnT H6  nT R                  XcTT5        U" Xc5      nUS:X  a  TS-  mSmOTS-  mUS-  nM8     T R                  XcTT5        U[        T5      S-
  :X  d   eU$ )Nc                   >
 0 n[        U5       GH/  nT" UR                  TU 5      nU(       d  M!  [        UR                  R                  UR	                  S5      U TT5      nTUR                  5          R                  X0U45        TR                  (       d  M  UR	                  S5      n[        S[        U5      5       H{  nT" UR                  USU*  5      nU(       d  M#  [        UR                  R                  UR	                  S5      U TT5      nTXR                  5       -      R                  X0U45        M}     GM2     TR                   H  nT" UTU 5      nU(       d  M  TUR                  5          R                  U Vs/ s H  o3U S4PM	     sn5        TUR                  5          R                  TU     Vs/ s H+  o3R                  (       d  M  UR                  T:X  d  M'  X0S4PM-     sn5        M     [        5       n	[        5       n
TR                  U
5        TR                  0 5        TU S-       GH  u  p;nUb  TUl        TS-   Ul        U S-   Ul        UR#                  5       nUR                  UR$                  U 4n['        UTUR(                     5      nX;   a  X.   OUR+                  U[-        U6 5      Ul        UR.                  R1                  UR                  UR2                  UR$                  UR.                  U5        OUnUR                  TR4                  ;   a  U	R7                  U5        GM  U
R7                  U5        GM     TU S-   	 U
(       do  T(       dh  U	(       da  [9        [;        US S95      n[=        TU TTU Vs1 s H  o3R                  R                  iM     sn[        U5      [?        S U 5       5      US9eU	$ s  snf s  snf s  snf )a@  The core Earley Scanner.

This is a custom implementation of the scanner that uses the
Lark lexer to match tokens. The scan list is built by the
Earley predictor, based on the previously completed tokens.
This ensures that at each phase of the parse we have a custom
lexer context, allowing for more complex ambiguities.r   r	   Nc                 B    U R                   R                  R                  $ r   )ruleoriginnamekeys    r   <lambda>-Parser._parse.<locals>.scan.<locals>.<lambda>v   s    H\H\    r%   c              3   8   #    U  H  oR                   v   M     g 7fr   )s).0is     r   	<genexpr>.Parser._parse.<locals>.scan.<locals>.<genexpr>x   s     H^V]QRV]s   )stateconsidered_rules) setexpectr   r$   groupendappendr   rangelenr   extendis_completer+   end_line
end_columnend_posadvancestartr   type
setdefaultr   node
add_familyr"   	TERMINALSaddlistsortedr   	frozenset)r-   to_scan
node_cacheitemmr   r+   jxnext_to_scannext_setr?   tokennew_itemlabel
token_noder1   columnsdelayed_matchesmatchr   start_symbolstream	terminalstext_column	text_linetransitivess                    r   scanParser._parse.<locals>.scan#   sq    J G$++vq11dkk..
Ay+VA#AEEG,33dq\C(((GGAJ!&q#a&!1A %dkk1Sqb6 :A q$)$++*:*:AGGAJ9Va$b /%%'	 : A ADQ< Q	 "2 %. [[!VQ'1#AEEG,33QX4ZQXAt_QX4Z[ $AEEG,33QXYZQ[  5LQ[_o_o_txtztz  K  uK_dt_Q[  5L  M ! 5LuHNN8$r" '6ac&:"U$%.EN'2QE$$%EEM#||~H%ZZ;E!*5)EJJ2G!HJ9>9LJ$5R\RgRghmoy  |A  pB  SCHMMM,,XZZHNNTXT]T]_ij#H??dnn4 $$X. LL*' ';*  !$OL#'w<\(]#^ *61ilsNtlsdh{{O_O_lsNt+.w<yH^V]H^?^<L- -
  [ 5[ 5LJ Ous   O
=O
O
'O
Or	   r   
)r   rF   r   r   terminals_by_namepredict_and_completer8   )r   rY   rU   rI   rX   r^   r-   rQ   rV   rW   rZ   r[   r\   r]   s   ``` `   @@@@@@r   _parseParser._parse!   s    Y	  Y	 x &d+!!OO55	 d	 E%%a';G1&G}Q	q FA  	!!!g{C CLN"""r)   )r   r   r   )__name__
__module____qualname____firstlineno__r   r   rc   __static_attributes__ r)   r   r
   r
      s    PTejrw  EI )
~r)   r
   N)__doc__collectionsr   treer   
exceptionsr   lexerr   grammarr   earleyr
   r   earley_forestr   r   rj   r)   r   <module>rs      s/     $  -   ( 0DZ Dr)   