
    E                         d 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d	lmZ dd
lmZmZmZ  G d de	      Z G d d      Z G d d      Z G d d      Zy)z(This module implements a LALR(1) Parser
    )deepcopycopy)DictAny   )Token)	Serialize   )LALR_AnalyzerShiftIntParseTable)InteractiveParser)UnexpectedCharactersUnexpectedInputUnexpectedTokenc                   P    e Zd Zd	dZed
d       Zddedeeef   fdZ	d Z
ddZy)LALR_Parserc                     t        |||      }|j                          |j                  }|j                  | _        || _        t        |j                  ||      | _        y )N)debugstrict)r   compute_lalr	callbacksparse_table_parse_tableparser_conf_Parserparser)selfr   r   r   analysisr   s         +lib/third_party/lark/parsers/lalr_parser.py__init__zLALR_Parser.__init__   sS     E&I))	$00&h22IuE    c                     | j                  |       }t        j                  ||      |_        t	        |j                  ||      |_        |S N)__new__r   deserializer   r   r   )clsdatamemor   r   insts         r    r&   zLALR_Parser.deserialize   s@    {{3)55dDAd//EBr"   Nr)   returnc                 8    | j                   j                  |      S r$   )r   	serialize)r   r)   s     r    r-   zLALR_Parser.serialize!   s      **400r"   c                 >    | j                   j                  ||d      S )NT)start_interactive)r   parse)r   lexerstarts      r    parse_interactivezLALR_Parser.parse_interactive$   s    {{   FFr"   c                    	 | j                   j                  ||      S # t        $ r[}| 	 t        |t              r6|j
                  j                  j                  }|j                  j                  } ||      s|t        |t              rDj                  j                  k(  r+|j                  j                  |j                  ||dz           	 |j
                  j                         cY d }~S # t        $ rm}t        |t              rQ|j                  j                  |j                  j                  cxk(  rdk(  rn n|j
                  |j
                  k(  r||}Y d }~nd }~wt        $ r}|}Y d }~nd }~ww xY wRd }~ww xY w)Nr
   $END)r   r0   r   
isinstancer   interactive_parserlexer_threadstateline_ctrchar_posfeedtextresume_parser   tokentype)r   r1   r2   on_errorespe2s           r    r0   zLALR_Parser.parse'   s4   	;;$$UE22 	a!56,,99??A

++A{Ga!56AJJ///

q16
//<<>>& "1o6GGLLBHHMMCVC00B4I4II A+ A- 		sR    
FB(E>C0*F0	E99A#E!E>!E9-E4/E>4E99E>>F)FFFr$   )__name__
__module____qualname__r!   classmethodr&   r   r   strr-   r3   r0    r"   r    r   r      sB    F  1c 1T#s(^ 1Gr"   r   c                       e Zd ZdZd Zy)	ParseConf)r   r   r2   start_state	end_statestatesc                     || _         | j                   j                  |   | _        | j                   j                  |   | _        | j                   j
                  | _        || _        || _        y r$   )r   start_statesrO   
end_statesrP   rQ   r   r2   )r   r   r   r2   s       r    r!   zParseConf.__init__K   s\    &++88?))44U;&&--"
r"   N)rG   rH   rI   	__slots__r!   rL   r"   r    rN   rN   H   s    YIr"   rN   c                   B    e Zd ZdZd	dZed        Zd Zd Zd Z	d
dZ
y)ParserState)
parse_confr1   state_stackvalue_stackNc                 v    || _         || _        |xs | j                   j                  g| _        |xs g | _        y r$   )rX   r1   rO   rY   rZ   )r   rX   r1   rY   rZ   s        r    r!   zParserState.__init__Y   s7    $
&G4??+F+F*G&,"r"   c                      | j                   d   S )N)rY   r   s    r    positionzParserState.position_   s    ##r"   c                     t        |t              st        S t        | j                        t        |j                        k(  xr | j
                  |j
                  k(  S r$   )r6   rW   NotImplementedlenrY   r_   )r   others     r    __eq__zParserState.__eq__d   sH    %-!!4##$E,=,=(>>b4==TYTbTbCbbr"   c                      t        |       | j                  | j                  t        | j                        t        | j                              S r$   )r@   rX   r1   r   rY   r   rZ   r^   s    r    __copy__zParserState.__copy__i   s?    tDzOOJJ!!"T%%&	
 	
r"   c                     t        |       S r$   )r   r^   s    r    r   zParserState.copyq   s    Dzr"   c                    | j                   }| j                  }| j                  j                  }| j                  j                  }| j                  j
                  }	 |d   }	 ||   |j                     \  }	}
|
|k7  sJ |	t        u rO|rJ |j                  |
       |j                  |j                  |vr|       y  ||j                     |             y |
}t        |j                        }|r|| d  }|| d = || d = ng } ||   |      }||d      |j                  j                      \  }}|t        u sJ |j                  |       |j                  |       |r|d   |k(  r|d   S # t        $ rG ||   j                         D ch c]  }|j                         s| nc c}w }}t        ||| d       w xY w)Nr]   )r9   r7   )rY   rZ   rX   rQ   rP   r   r@   KeyErrorkeysisupperr   r   appendrb   	expansionoriginname)r   r?   is_endrY   rZ   rQ   rP   r   r9   actionargrC   expectedrulesizevalue_action	new_states                     r    
feed_tokenzParserState.feed_tokent   s   &&&&''OO--	OO--	OE\$UmEJJ7
 )###!!z""3'""EJJi,G5j NcYW\WaWaMbchMij 4>>*#TEF+A#TEF+#TEF+A'	$*%+KO%<T[[=M=M%N"%'''""9-""5)k"o:&r?*G   \'-e}'9'9';K';!qyy{A';KK%eXTVZ[[\s   "E- -F=F&!F&%F=)NNrF   )rG   rH   rI   rU   r!   propertyr_   rd   rf   r   ry   rL   r"   r    rW   rW   V   s5    CI- $ $c

*+r"   rW   c                   $    e Zd ZddZddZddZy)r   c                 .    || _         || _        || _        y r$   )r   r   r   )r   r   r   r   s       r    r!   z_Parser.__init__   s    &"
r"   Nc                     t        | j                  | j                  |      }t        ||||      }|rt	        | ||j
                        S | j                  |      S r$   )rN   r   r   rW   r   r1   parse_from_state)r   r1   r2   rZ   rY   r/   rX   parser_states           r    r0   z_Parser.parse   sS    t//G
":uk;O$T<9K9KLL$$\22r"   c                 @   	 |}|j                   j                  |      D ]  }|j                  |        |rt        j                  dd|      nt        ddddd      }|j                  |d      S # t
        $ r4}	 t        | ||j                         |_        |# t        $ r Y |w xY wd}~wt        $ rj}| j                  rXt        d       t        d       t        d       t        |j                        D ]  \  }}t        d	|z  |        t        d        d}~ww xY w)
zRun the main LALR parser loop

        Parameters:
            state (ParseState) - the initial state. Changed in-place.
            last_token (optional, Token) - Used only for line information in case of an empty lexer.
        r5    r   r
   TNzSTATE STACK DUMPz----------------z%d))r1   lexry   r   new_borrow_posr   r   r7   	NameError	Exceptionr   print	enumeraterY   )r   r9   
last_tokenr?   	end_tokenrB   irC   s           r    r~   z_Parser.parse_from_state   s   	E/  ' 0 DI,,VR?eTZ\^`acdfgNhI##It44 	'8uekk'R$ G  G  		zzb	()()%e&7&78DAq%!)a( 9b			sC   A,A/ /	D9BB'	B$ B'#B$$B''D3A%DDrF   )NNFr$   )rG   rH   rI   r!   r0   r~   rL   r"   r    r   r      s    
3r"   r   N)__doc__r   r   typingr   r   r1   r   utilsr	   lalr_analysisr   r   r   lalr_interactive_parserr   lark.exceptionsr   r   r   r   rN   rW   r   rL   r"   r    <module>r      sU         > > 6 R R5) 5p H+ H+T+ +r"   