
    C'                        U d dl mZmZmZmZmZ ddlmZmZm	Z	 ddl
mZmZ ddlmZ ddlmZmZmZmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZmZmZm Z  d Z!d Z"i Z#de$d<    G d de      Z%d*dZ&d Z' G d d      Z(defdZ)dedefdZ*d+dededefdZ+e+e#d<    G d d      Z,dedefdZ-d  Z.dedefd!Z/dededej`                  fd"Z1 G d# d$      Z2e1e#d%<   e2e#d&<   d'ed(e fd)Z3y),    )AnyCallableDictOptional
Collection   )ConfigurationErrorGrammarErrorassert_config)get_regexp_width	Serialize)GrammarAnalyzer)LexerThread
BasicLexerContextualLexerLexer)earleyxearleycyk)LALR_Parser)Tree)	LexerConf
ParserConf_ParserArgType_LexerArgTypec                 L     t         dd      }|r S  G  fddt              }|S )N__future_interface__Fc                       e Zd Z fdZd Zy)'_wrap_lexer.<locals>.CustomLexerWrapperc                       |      | _         y N)lexer)self
lexer_conflexer_classs     (lib/third_party/lark/parser_frontends.py__init__z0_wrap_lexer.<locals>.CustomLexerWrapper.__init__   s    (4
    c                 L    | j                   j                  |j                        S r!   )r"   lextext)r#   lexer_stateparser_states      r&   r*   z+_wrap_lexer.<locals>.CustomLexerWrapper.lex   s    zz~~k&6&677r(   N__name__
__module____qualname__r'   r*   )r%   s   r&   CustomLexerWrapperr      s    58r(   r2   )getattrr   )r%   future_interfacer2   s   `  r&   _wrap_lexerr5      s0    {,BEJ	8 	8
 "!r(   c                     t        j                  | d   |      }|xr |j                  j                  d      xs t        }|j                  | d   |||j
                        }||_        t        ||||      S )Nparser_confr   parser)r8   )r   deserialize_pluginsgetr   debug	callbacksParsingFrontend)datamemor$   r=   optionsr7   clsr8   s           r&   _deserialize_parsing_frontendrC      sn    ((m)<dCK:w''++M:
J{C__T(^T9gmmLF%K:{GFKKr(   z/Dict[str, Callable[[LexerConf, Any, Any], Any]]_parser_creatorsc                   x    e Zd ZU dZeed<   eed<   eed<   ddedefdZddZ	de
fd	Zdde
fd
Zddee
   fdZy)r>   )r$   r7   r8   r$   r7   rA   Nc                    || _         || _        || _        |r|| _        nPt        j                  |j                        }| J dj                  |j                                ||||      | _        |j                  }d| _	        |dv r|j                  J d| _	        y t        |t              r)t        |t              sJ  t        |      |      | _        nPt        |t"              r5t$        t&        d|   } ||| j                  |j                  |      | _        nt)        d      |j                  r&t+        | j                   |j                        | _        y y )Nz&{} is not supported in standalone modeF)dynamicdynamic_completeTbasic
contextualz&Bad value for lexer_type: {lexer_type})r7   r$   rA   r8   rD   r;   parser_typeformat
lexer_type
skip_lexerpostlex
isinstancetype
issubclassr   r5   r"   strcreate_basic_lexercreate_contextual_lexer	TypeErrorPostLexConnector)r#   r$   r7   rA   r8   create_parserrN   create_lexers           r&   r'   zParsingFrontend.__init__-   sN   &$  DK,001H1HIM , .V.].]++/ , (
KIDK  **
88%%---"DOj$'j%0000Z0<DJ
C(+5 L &j$++z?Q?QSZ[DJDEE)$**j6H6HIDJ r(   c                     |6| j                   j                  }t        |      dkD  rt        d|      |\  }|S || j                   j                  vr%t        d|d| j                   j                        |S )Nr   z]Lark initialized with more than 1 possible start rule. Must specify which start rule to parsezUnknown start rule z. Must be one of )r7   startlenr	   )r#   r\   start_declss      r&   _verify_startzParsingFrontend._verify_startS   s    =**00K;!#(  *I  KV  W  W GE  $**000$SXZ^ZjZjZpZp%qrrr(   r+   c                     | j                   xr% | j                   j                  j                  d      xs t        }| j                  r|S |j                  | j                  |      S )Nr   )rA   r:   r;   r   rO   	from_textr"   )r#   r+   rB   s      r&   _make_lexer_threadz"ParsingFrontend._make_lexer_thread]   sJ    ||H 5 5 9 9- HX[tKCMM$**d,KKr(   c                     | j                  |      }|i nd|i}| j                  |      } | j                  j                  ||fi |S )Non_error)r_   rb   r8   parse)r#   r+   r\   rd   chosen_startkwstreams          r&   re   zParsingFrontend.parsea   sQ    ))%0#R*h)?((. t{{  <<<r(   c                     | j                  |      }| j                  j                  dk7  rt        d      | j	                  |      }| j
                  j                  ||      S )Nlalrz<parse_interactive() currently only works with parser='lalr' )r_   r7   rL   r	   rb   r8   parse_interactive)r#   r+   r\   rf   rh   s        r&   rk   z!ParsingFrontend.parse_interactiveg   s[     ))%0''61$%cdd((.{{,,V\BBr(   r!   )NN)r/   r0   r1   __serialize_fields__r   __annotations__r   r   r'   r_   rT   rb   re   r   rk    r(   r&   r>   r>   &   sa    @L$J9 $J: $JLLs L=# =Chsm Cr(   r>   returnNc                 p    t        | d       t        |t              sdddd|    }t        ||d| z         y y )N)rj   r   r   rI   )rJ   rG   rH   )rJ   z9Parser %r does not support lexer %%r, expected one of %%s)r   rQ   rR   )r8   r"   expecteds      r&   _validate_frontend_argsrr   q   sK    &34eT"+> 	
 	eX'bek'kl #r(   c                 j    i }|D ]+  }t        | |j                  d       }||||j                  <   - |S r!   )r3   name)transformer	terminalsresultterminalcallbacks        r&   _get_lexer_callbacksrz   |   s>    F;t<$,F8==!  Mr(   c                       e Zd Zd Zd Zy)rX   c                      || _         || _        y r!   )r"   	postlexer)r#   r"   r}   s      r&   r'   zPostLexConnector.__init__   s    
"r(   c                 p    | j                   j                  ||      }| j                  j                  |      S r!   )r"   r*   r}   process)r#   r,   r-   is       r&   r*   zPostLexConnector.lex   s+    JJNN;5~~%%a((r(   Nr.   rn   r(   r&   rX   rX      s    #)r(   rX   c                 `    |xr |j                   j                  d      xs t        } ||       S )Nr   )r:   r;   r   )r$   r8   rP   rA   rB   s        r&   rU   rU      s,    9w''++L9
HjCz?r(   r$   c           	      .   |xr |j                   j                  d      xs t        }|j                  j                  j                         D ci c]  \  }}|t        |j                               ! }}}|r|j                  nd} || ||      S c c}}w )Nr   rn   )always_accept)	r:   r;   r   _parse_tablestatesitemslistkeysr   )	r$   r8   rP   rA   rB   idxtr   r   s	            r&   rV   rV      s    >w''++,=>
R?CKQK^K^KeKeKkKkKm)nKma#d1668n*<KmF)n>EW%:%:2Mz6?? *os   $Br7   c                     |r|j                   nd}|r|j                  nd}|xr |j                  j                  d      xs t        } ||||      S )NFr   )r<   strict)r<   r   r:   r;   r   )r$   r7   rA   r<   r   rB   s         r&   create_lalr_parserr      sK    $GMM%E&W^^EF:w''++M:
J{C{%77r(   rj   c                       e Zd Zd ZddZy)EarleyRegexpMatcherc                    i | _         |j                  D ]  }|j                  j                         }	 t	        |      d   }|dk(  rt        d|      |j                  r|j                  d      }|j                  j                  ||j                        | j                   |j                  <    y # t        $ r t        d|j                  d|      w xY w)Nr   z/Dynamic Earley doesn't allow zero-width regexpszBad regexp in token z: zutf-8)regexpsrv   pattern	to_regexpr   r
   
ValueErrorrt   	use_bytesencode	re_modulecompileg_regex_flags)r#   r$   r   regexpwidths        r&   r'   zEarleyRegexpMatcher.__init__   s    %%AYY((*F](03 A:&'XZ[\\##w/#-#7#7#?#?
H`H`#aDLL  &  T"1666#RSSTs   B..%Cc                 T    | j                   |j                     j                  ||      S r!   )r   rt   match)r#   termr+   indexs       r&   r   zEarleyRegexpMatcher.match   s"    ||DII&,,T599r(   N)r   )r/   r0   r1   r'   r   rn   r(   r&   r   r      s    b :r(   r   c                     | j                   rt        d      t        |       }t        j                  | ||j
                  fi |S )Nz7Earley's dynamic lexer doesn't support lexer_callbacks.)r=   r
   r   r   Parserr   )r$   r7   rg   earley_matchers       r&   create_earley_parser__dynamicr      s?    TUU(4N>>*k>3G3GN2NNr(   c                 4    | j                   |j                  k(  S r!   )rt   rR   )r   tokens     r&   _match_earley_basicr      s    99

""r(   c                 :    t        j                  | |t        fi |S r!   )r   r   r   )r$   r7   rg   s      r&   create_earley_parser__basicr      s    ==[2ELLLr(   c                    |j                   dk(  }|r|j                  nd}|j                   dk7  r|j                  xs t        nd }i }| j                  dk(  rt
        }n!| j                  dk(  rd|d<   t
        }nt        } || |f|||d|S )	NresolveFforestrG   rH   Tcomplete_lex)resolve_ambiguityr<   
tree_class)	ambiguityr<   r   r   rN   r   r   )r$   r7   rA   r   r<   r   extrafs           r&   create_earley_parserr      s    ))Y6$GMM%E/6/@/@H/L##+tRVJE	))			"4	4 $n)'Zw8IQVcmwqvwwr(   c                   &    e Zd ZddZd Zd Zd Zy)CYK_FrontEndNc                     t        |      | _        t        j                  |j                        | _        |j                  | _        y r!   )r   	_analysisr   r   rulesr8   r=   )r#   r$   r7   rA   s       r&   r'   zCYK_FrontEnd.__init__   s1    (5jj!2!23$..r(   c                     t        |j                  d             }| j                  j                  ||      }| j	                  |      S r!   )r   r*   r8   re   
_transform)r#   lexer_threadr\   tokenstrees        r&   re   zCYK_FrontEnd.parse   s<    l&&t,-{{  /t$$r(   c                     t        |j                               }|D ]B  }|j                  D cg c]%  }t        |t              r| j                  |      n|' c}|_        D | j                  |      S c c}w r!   )r   iter_subtreeschildrenrQ   r   _apply_callback)r#   r   subtreessubtreecs        r&   r   zCYK_FrontEnd._transform   sr    **,-G_f_o_op_oZ[:a;N 4 4Q 7TU U_opG   ##D))  qs   *A2c                 T     | j                   |j                     |j                        S r!   )r=   ruler   )r#   r   s     r&   r   zCYK_FrontEnd._apply_callback   s     (t~~dii(77r(   r!   )r/   r0   r1   r'   re   r   r   rn   r(   r&   r   r      s    /%
*8r(   r   r   r   rL   rN   c                     t        |t              sJ t        |t              sJ | |_        ||_        t        |||      S r!   )rQ   r   r   rL   rN   r>   )rL   rN   r$   r7   rA   s        r&   _construct_parsing_frontendr      sC     j),,,k:...)K&J:{G<<r(   )ro   Nr!   )4typingr   r   r   r   r   
exceptionsr	   r
   r   utilsr   r   parsers.grammar_analysisr   r"   r   r   r   r   parsersr   r   r   parsers.lalr_parserr   r   r   commonr   r   r   r   r5   rC   rD   rm   r>   rr   rz   rX   rU   rV   r   r   r   r   r   r   r   r   r   rn   r(   r&   <module>r      sR   < < G G . 5 B B ) ) ,  H H
"L GI C HHCi HCVm) )
 @	 @P_ @89 8: 8Xc 8 .  : :*Oi Oj O#MI MJ MxY xZ xU[UbUb x$8 8. 2  &  =#=!=r(   