
                            d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	Z	ddl
mZ ddlmZ ddlmZmZmZmZmZmZmZ dd	lmZmZmZmZmZmZmZ dd
lmZm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddlm1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z< ddl=m>Z>m?Z?m@Z@mAZAmBZB  e@d      ZCej                  j                  eF      ZGdgZHdZIdZJ e/d      ZKi dddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:i d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_ZLi d`dadbdcdddedfdgdhdidjdkdldmdnddoddpdqdrdsdtdudLdKdvdwdxdydzd{d|d}d~eJz  dddddddddddddZMi ddgdddgdg dddgddvdgdddgdddgddxdgddgdg ddddgddgdddgdg ddg ddg dddzgi ddxgddxdzgdddgddgddgddgdddgdddgdddgdddgddgddgdg dâdddgddgddgdddgdgddgddgdd|gdМZNdZOdZP G dӄ de>      ZQeC G dՄ deA             ZR G dׄ de?      ZS G dل de>      ZT G dۄ deA      ZU G d݄ deA      ZV G d߄ deA      ZWd ZXd ZYd ZZeC G d deA             Z[d Z\ G d deB      Z] G d deA      Z^d Z_ G d d      Z` edd      Za G d d      Zb ebdeH      Zcd Zdd ZeeC G d deA             Zfd Zgd Zhddgfddgfdg dfdg d fddgfddgfdg dfdg dfd	d
gfddgfddgfddgfddgfgZid Zjd&dZkd Zld Zmd&dendendeee8enf      fdZod'dZpd Zqd Zr G d d      Zs G d d       Ztd! Zug fd"Zvd# Zwd$endenfd%Zxy((  z"Parses and creates Grammar objects    N)
namedtuple)copydeepcopy)literal_eval)suppress)ListTupleUnionCallableDictOptionalSequence   )bfsloggerclassify_boolis_id_continueis_id_startbfs_all_uniquesmall_factors)TokenTerminalDef
PatternStr	PatternRE)ParseTreeBuilder)ParsingFrontend)	LexerConf
ParserConf)RuleOptionsRuleTerminalNonTerminalSymbolTOKEN_DEFAULT_PRIORITY)classify
dedup_list)GrammarErrorUnexpectedCharactersUnexpectedToken
ParseErrorUnexpectedInput)TreeSlottedTree)TransformerVisitorv_argsTransformer_InPlaceTransformer_NonRecursiveT)inlinegrammarsz.larkimslux	__empty__.DOT,COMMA:COLON;	SEMICOLON+PLUS-MINUS*STAR/SLASH\	BACKSLASH|VBAR?QMARK!BANG@AT#HASH$DOLLAR%PERCENT^
CIRCUMFLEX&	AMPERSAND_
UNDERSCORE<LESSTHAN>MORETHAN=EQUAL"DBLQUOTE'QUOTE`	BACKQUOTE~TILDE(LPAR)RPAR{LBRACE}RBRACE[LSQB]RSQB
NEWLINEz
CRLFTABSPACE)	 _LPARz\(_RPARz\)_LBRAz\[_RBRAz\]_LBRACEz\{_RBRACEz\}OPz[+*]|[?](?![a-z_])_COLON_COMMA_ORz\|_DOTz\.(?!\.)_DOTDOTz\.\.RULE_MODIFIERSz(!|![?]?|[?]!?)(?=[_a-z])RULEz_?[a-z][_a-z0-9]*TERMINALz_?[A-Z][_A-Z0-9]*STRINGz"(\\"|\\\\|[^"\n])*?"i?z/(?!/)(\\/|\\\\|[^/])*?/[%s]*z(\r?\n)+\s*z(\r?\n)+\s*\|z[ \t]+z\s*//[^\n]*|\s*#[^\n]*z\\[ ]*\nz->z%ignorez	%overridez%declarez%extendz%importz[+-]?\d+)REGEXP_NL_NL_ORWSCOMMENTrH   _TO_IGNORE	_OVERRIDE_DECLARE_EXTEND_IMPORTNUMBERstart_list_itemz_list _item)ruletermignoreimportdeclareoverrideextendr   r   zBrule_modifiers RULE template_params priority _COLON expansions _NLrule_modifiers priorityz_DOT NUMBERtemplate_paramsz _LBRACE _template_params _RBRACE_template_paramsz_template_params _COMMA RULE
expansions_expansions)aliasz_expansions _OR aliasz_expansions _NL_OR aliasz?aliaszexpansion _TO nonterminal	expansion
_expansionz_expansion exprz?expr)atomzatom OPzatom TILDE NUMBERz atom TILDE NUMBER _DOTDOT NUMBERz?atom)z_LPAR expansions _RPARmaybevaluer   )terminalnonterminalliteralrangetemplate_usager   r   z?namez?symbolr   z_LBRA expansions _RBRAr   zSTRING _DOTDOT STRINGr   z*nonterminal _LBRACE _template_args _RBRACE_template_argsz_template_args _COMMA valuer   zTERMINAL _COLON expansions _NLz*TERMINAL _DOT NUMBER _COLON expansions _NLr   z_OVERRIDE rulez_OVERRIDE termr   z_EXTEND rulez_EXTEND termr   z_IGNORE expansions _NLr   z_DECLARE _declare_args _NLr   )z_IMPORT _import_path _NLz._IMPORT _import_path _LPAR name_list _RPAR _NLz!_IMPORT _import_path _TO name _NL_import_path
import_lib
import_rel_import_argsz_DOT _import_argsnamez_import_args _DOT name
_name_listz_name_list _COMMA namesymbolz_declare_args symbolr   )	name_listr   _declare_argsr      2   c                   *    e Zd Zd Zd Zd Zd Zd Zy)FindRuleSizec                     || _         y Nkeep_all_tokens)selfr   s     $lib/third_party/lark/load_grammar.py__init__zFindRuleSize.__init__   s
    .    c                     t        |t              r|j                  j                  d       S t        |t              r| j
                  xs |j                   S |t        u ryJ |       )Nr[   F)
isinstancer"   r   
startswithr!   r   
filter_out_EMPTY)r   syms     r   _will_not_get_removedz"FindRuleSize._will_not_get_removed   sZ    c;'xx**3///c8$''=s~~+==&=cur   c              #      K   |D ]@  }t        |t              r| t        |t              r| j                  |      rdnd @J  y w)Nr   r   )r   intr#   r   )r   argsas      r   _args_as_intzFindRuleSize._args_as_int   sC     A!S!Av&55a8aa?u s   AA	c                 6    t        | j                  |            S r   )sumr   r   r   s     r   r   zFindRuleSize.expansion       4$$T*++r   c                 6    t        | j                  |            S r   )maxr   r   s     r   r   zFindRuleSize.expansions   r   r   N)__name__
__module____qualname__r   r   r   r   r    r   r   r   r      s    /,,r   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)EBNF_to_BNFc                 J    g | _         i | _        d| _        d| _        d | _        y )Nanonr   )	new_rulesrules_cacheprefixirule_optionsr   s    r   r   zEBNF_to_BNF.__init__   s'     r   c                 h    d| j                   || j                  fz  }| xj                  dz  c_        |S )Nz
__%s_%s_%dr   )r   r   )r   innernew_names      r   
_name_rulezEBNF_to_BNF._name_rule   s-    4;;tvv">>!r   c                     t        |      }| j                  j                  ||| j                  f       || j                  |<   |S r   )r"   r   appendr   r   )r   keyr   r   ts        r   	_add_rulezEBNF_to_BNF._add_rule   s@    tZ1B1BCD !r   c           
          	 | j                   |   S # t        $ rW | j                  |      }t        |      }t	        dt	        d|g      t	        d||g      g      }| j                  |||      cY S w xY wNr   r   )r   KeyErrorr   r"   STr   )r   type_exprr   r   trees         r   _add_recurse_rulezEBNF_to_BNF._add_recurse_rule   s    		8##D)) 	8u-HH%Al;';D	*% D >>$$77	8s    AA10A1c           
          ||||f}	 | j                   |   S # t        $ rN | j                  d||fz        }t        dt        d|g|z  |g|z  z         g      }| j	                  |||      cY S w xY w)aN  Generate a rule that repeats target ``a`` times, and repeats atom ``b`` times.

        When called recursively (into target), it repeats atom for x(n) times, where:
            x(0) = 1
            x(n) = a(n) * x(n-1) + b

        Example rule when a=3, b=4:

            new_rule: target target target atom atom atom atom

        zrepeat_a%d_b%dr   r   )r   r   r   r   r   )r   r   btargetr   r   r   r   s           r   _add_repeat_rulezEBNF_to_BNF._add_repeat_rule  s     !VT"	7##C(( 	7'71a&'@AHlRfX\TFQJ5N%O$PQD>>#x66	7s    AA.-A.c                    ||||df}	 | j                   |   S # t        $ r | j                  d||fz        }t        dt	        |      D cg c]  }t        d|g|z  |gz          nc c}w c}t	        |      D cg c]  }t        d|g|z  |g|z  z          nc c}w c}z         }	| j                  |||	      cY S w xY w)a_  Creates a rule that matches atom 0 to (a*n+b)-1 times.

        When target matches n times atom, and target_opt 0 to n-1 times target_opt,

        First we generate target * i followed by target_opt, for i from 0 to a-1
        These match 0 to n*a - 1 times atom

        Then we generate target * a followed by atom * i, for i from 0 to b-1
        These match n*a to n*a + b-1 times atom

        The created rule will not have any shift/reduce conflicts so that it can be used with lalr

        Example rule when a=3, b=4:

            new_rule: target_opt
                    | target target_opt
                    | target target target_opt

                    | target target target
                    | target target target atom
                    | target target target atom atom
                    | target target target atom atom atom

        optzrepeat_a%d_b%d_optr   r   )r   r   r   r   r   r   )
r   r   r   r   
target_optr   r   r   r   r   s
             r   _add_repeat_opt_rulez EBNF_to_BNF._add_repeat_opt_rule  s    2 !VT5)		7##C(( 	7';q!f'DEHlDI!H%DLq;
j\ 9:H% AFa@H1;
dVAX 56% D
 >>#x66	7s'    2B=
A&%B=:B"B=<B=c                    |t         k  r5t        dt        ||dz         D cg c]  }t        d|g|z         c}      S |}t        |t              D ]  \  }}| j                  ||||      } ||k(  r|S ||z
  dz   }t        |t              }	|}
t        dg       }|	dd D ].  \  }}| j                  |||
||      }| j                  |||
|      }
0 |	d   \  }}| j                  |||
||      }t        dt        d|g|gz         g      S c c}w )z\Generates a rule tree that repeats ``rule`` exactly between ``mn`` to ``mx`` times.
        r   r   r   N)REPEAT_BREAK_THRESHOLDr   r   r   SMALL_FACTOR_THRESHOLDr   r  )r   r   mnmxn	mn_targetr   r   diffdiff_factorsdiff_targetdiff_opt_targets               r   _generate_repeatszEBNF_to_BNF._generate_repeats:  sF    &&l%PRTVYZTZJ[$\J[QRdVaZ%@J[$\]] 	!"&<=DAq--aItDI >8Bw{$T+AB["- "%DAq"771k?\`aO//1k4HK & B133Aq+X\],K)?P1P!Q RSS1 %]s   D	
c                    |j                   dk(  rt        dg       }t        d||g      S |j                   dk(  r| j                  d|      S |j                   dk(  r*| j                  d|      }t        d|t        dg       g      S |j                   dk(  r`t        |      d	k(  rt	        |d
         x}}n.t        t        |      \  }}||k  s|d
k  rt        d|||fz        | j                  |||      S J |       )NrK   r   r   r?   plusrC   starri   r   r   'Bad Range for %s (%d..%d isn't allowed))r   r   r   lenr   mapr'   r  )r   r   opr   emptyr   r	  r
  s           r   r   zEBNF_to_BNF.exprY  s    88s?{B'ElT5M22XX_
 ))&$77XX_
 --fd;HlXr+r/B$CDDXX_4yA~d1g,&RS$B7b1f&'PTXZ\^`Sa'abb))$B77bur   c                     | j                   xr | j                   j                  }t        |      j                  |      }t	        dt
        g|z        }t	        d||g      S )Nr   r   )r   r   r   	transformr   r   )r   r   r   	rule_sizer  s        r   r   zEBNF_to_BNF.maybev  sW    ++Q0A0A0Q0Q 1;;DA	;9 45,u..r   N)r   r   r   r   r   r   r   r   r  r  r   r   r   r   r   r   r      s1    !

87(#7JT>:/r   r   c                   .    e Zd Zed        Zd Zd Zd Zy)SimplifyRule_Visitorc                 v    | j                  | j                        r	 | j                  | j                        ry y r   )expand_kids_by_datadata)r   s    r   _flattenzSimplifyRule_Visitor._flatten  s+    &&tyy1 &&tyy1r   c                    | j                  |       t        |j                        D ]  \  }}t        |t              s|j
                  dk(  s'd|_        t        |j                        D cg c]J  }| j                  t        dt        |j                        D cg c]  \  }}||k(  r|n| c}}            L c}}}|_        | j                  |        y  y c c}}w c c}}}w r   )	r"  	enumeratechildrenr   r,   r!  r&   visitr   )r   r   r   childoptionjothers          r   r   zSimplifyRule_Visitor.expansion  s     	d!$--0HAu%&5::+E(	 0:%../I!K/IV "&B{MVW[WdWdMe=gMeE HIAvVSX=XMe=g -h "i/I!K d# 1=g !Ks   ..C"
C/C"
C"
c                     |j                   \  }}|j                  dk(  rLg }|j                   d   j                   D ]  }|j                  t        d||g             ! d|_        ||_         y y )Nr   r   r   )r%  r!  r   r   )r   r   r   
alias_namealiasesr'  s         r   r   zSimplifyRule_Visitor.alias  se    ==j99$Gq)22r'E:+>?@ 3$DI#DM %r   c                     | j                  |       t        t        |j                              t        |j                        k7  rt	        |j                        |_        y y r   )r"  r  setr%  r&   )r   r   s     r   r   zSimplifyRule_Visitor.expansions  sB    ds4==!"c$--&88&t}}5DM 9r   N)r   r   r   staticmethodr"  r   r   r   r   r   r   r  r  }  s#     ,$6r   r  c                       e Zd Zd Zd Zd Zy)RuleTreeToTextc                     |S r   r   )r   xs     r   r   zRuleTreeToText.expansions  s    r   c                 
    |d fS r   r   )r   symbolss     r   r   zRuleTreeToText.expansion  s    }r   c                 H    |\  \  }}}|J ||d|f       ||j                   fS )NrA   r   )r   r4  r   _aliasr   s        r   r   zRuleTreeToText.alias  s8    %&"FU~>y#v>>~%**$$r   N)r   r   r   r   r   r   r   r   r   r2  r2    s    %r   r2  c                   &    e Zd ZdZd Zed        Zy)PrepareAnonTerminalszfCreate a unique list of anonymous terminals. Attempt to give meaningful names to them when we add themc                     || _         | j                   D ch c]  }|j                   c}| _        |D ci c]  }|j                  | c}| _        d| _        d | _        y c c}w c c}w Nr   )	terminalsr   term_setpatternterm_reverser   r   )r   r>  tds      r   r   zPrepareAnonTerminals.__init__  s]    "+/>>:>R>:6?@iRZZ^i@  ;@s
   A A%c                 8   |j                   }|| j                  v r>|j                  | j                  |   j                  j                  k7  rt	        d|z        d }t        |t              r	 | j                  |   j                  }n?t        |t              r(|| j                  v r!| j                  |   j                  }nJ |       |$d| j                  z  }| xj                  dz  c_        || j                  vra|| j                  vsJ | j                  j!                  |       t#        ||      }|| j                  |<   | j$                  j'                  |       | j(                  r| j(                  j*                  rdnt        |t              }t-        ||      S # t        $ ru 	 t        |   }nV# t        $ rJ |rEt        |      r:t        |d         r,|j                         | j                  vr|j                         }Y nw xY w|| j                  v rd }Y Sw xY w)Nz+Conflicting flags for the same terminal: %sr   Fz	__ANON_%dr   r   )r   rA  flagsr@  r'   r   r   r   r   _TERMINAL_NAMESr   r   upperr?  r   r   addr   r>  r   r   r   r!   )r   pr   	term_nametermdefr   s         r   r@  zPrepareAnonTerminals.pattern  s   !!!agg1B1B11E1M1M1S1S&SMPQQRR	a$% --a055	 9%D%%% --a055	!O5#dff,IFFaKFDMM)D-----MMi(!)Q/G#*Da NN!!'*"//D4E4E4U4UU[efgis[t
	j99=  	%2 / 6I 2!6;uQx;PUZU`U`UbjnjwjwUw$)KKM	2 - $I	%s7   ,F 	H%	F/.H/AH?HHHHN)r   r   r   __doc__r   inline_argsr@  r   r   r   r;  r;    s    p! ): ):r   r;  c                   "    e Zd ZdZd Zd Zd Zy)_ReplaceSymbolszHelper for ApplyTemplatesc                     i | _         y r   )namesr   s    r   r   z_ReplaceSymbols.__init__  s	    
r   c                     t        |      dk(  rJt        |d   t              r7|d   j                  | j                  v r| j                  |d   j                     S | j                  d|d       S )Nr   r   r   )r  r   r#   r   rQ  __default__)r   cs     r   r   z_ReplaceSymbols.value  sY    q6Q;:adF3!		TZZ8O::adii((D11r   c                     |d   j                   }|| j                  v r'| j                  d| j                  |   g|dd  z   d       S | j                  d|d       S )Nr   r   r   )r   rQ  rS  )r   rT  r   s      r   r   z_ReplaceSymbols.template_usage  s_    tyy4::##$4tzz$7G6H1QR56PRVWW 0!T::r   N)r   r   r   rL  r   r   r   r   r   r   rO  rO    s    #2
;r   rO  c                       e Zd ZdZd Zd Zy)ApplyTemplateszIApply the templates, creating new rules that represent the used templatesc                 N    || _         t               | _        t               | _        y r   )	rule_defsrO  replacerr/  created_templates)r   rY  s     r   r   zApplyTemplates.__init__  s    "')!$r   c                 (  	 |d   j                   	|dd  }	ddj                  d |D              d}|| j                  vr| j                  j                  |       	fd| j                  D        \  \  }}}}t        |      t        |      k(  sJ |       t        |      }t        t        ||            | j                  _
        | j                  j                  |       | j                  j                  |g |t        |      f       t        |      S )Nr   r   ro   r9   c              3   4   K   | ]  }|j                     y wr   r8  ).0r   s     r   	<genexpr>z0ApplyTemplates.template_usage.<locals>.<genexpr>  s     0FAs   rq   c              3   4   K   | ]  }|d    k(  s|  yw)r   Nr   )r^  r   r   s     r   r_  z0ApplyTemplates.template_usage.<locals>.<genexpr>  s     +V~!1QUA~s   )r   joinr[  rH  rY  r  r   dictziprZ  rQ  r  r   r"   )
r   rT  r   result_name_nparamsr   optionsresult_treer   s
            @r   r   zApplyTemplates.template_usage  s    tyyu"&0F0F(FGd444""&&{3+Vt~~+V)'Rwv;#d)+1T1+"4.K"&s64'8"9DMMMM##K0NN!!;K'AR"ST;''r   N)r   r   r   rL  r   r   r   r   r   rW  rW     s    S'
(r   rW  c                 ,     t         fd|D              S )Nc              3   @   K   | ]  }j                  |        y wr   )rfind)r^  rT  ss     r   r_  z_rfind.<locals>.<genexpr>  s     +7aqwwqz7s   )r   )rl  choicess   ` r   _rfindrn    s    +7+++r   c                 d   d}t        |       }|D ]2  }||z  }|dk(  s	 t        |      }|dk(  r|dz  }n	|dvr|dz  }||z  }4 |j	                  dd      j	                  dd	      }d
|z  }	 t        |      } | S # t        $ r t        d| z        w xY w# t        $ r}t        | |      d }~ww xY w)Nr   rG   z/Literal ended unexpectedly (bad escaping): `%r`\\Uuxnftrz\"rc   re   z\'z	u'''%s''')iternextStopIterationr'   replacer   SyntaxError)rl  wr   r  n2to_evales          r   eval_escapingr{    s    
AQA	Q9Z!W TzV9$T	GA  	
		%%%c51AAoG!! H ! Z"#TWX#XYYZ  !1a  !s#   A:-B :B	B/B**B/c                 l   t        | t              sJ | j                  }t        |d      dz   }|dkD  sJ ||d  }t	        d |D              sJ |       | j
                  dk(  rd|v rt        d      | j
                  dk(  rd|v rd	|vrt        d
      |d | }|d   |d   k(  r|d   dv sJ |dd }t        |      }|dk(  rt        d| z        | j
                  dk(  r*|j                  dd      }t        ||| j                        S | j
                  dk(  rt        ||| j                        S J d       )Nz/"r   r   c              3   ,   K   | ]  }|t         v   y wr   )	_RE_FLAGS)r^  fs     r   r_  z&_literal_to_pattern.<locals>.<genexpr>;  s     -u!qI~us   r   rw   z*You cannot put newlines in string literalsr   r4  zLYou can only use newlines in regular expressions with the `x` (verbose) flagr  z"/r   z$Empty terminals are not allowed (%s)rp  rG   )rawz:Invariant failed: literal.type not in ["STRING", "REGEXP"])r   r   r   rn  alltyper'   r{  ru  r   r   )r   v
flag_startrE  r4  rl  s         r   _literal_to_patternr  5  sV   gu%%%A4"J>>jkNE-u--4u4-||xDAIGHH||xDAI#U2B 9 : 	: 	
+:AQ41R5=QqTT\))	!BAaABwAGKLL||xIIfd#!U66		!Ew}}55RRRur   c                       e Zd Zd Zd Zy)PrepareLiteralsc                 .    t        dt        |      g      S )Nr@  )r   r  )r   r   s     r   r   zPrepareLiterals.literalX  s    )1':;<<r   c                 ,   |j                   |j                   cxk(  rdk(  sJ  J |j                  dd }|j                  dd }t        t        |            t        t        |            cxk(  rdk(  sJ  J d|d|d}t	        dt        |      g      S )Nr   r   r  rs   rA   ru   r@  )r  r   r  r{  r   r   )r   r   endregexps       r   r   zPrepareLiterals.range[  s    zzSXX111111Ab!ii"o='(Cc0B,CHqHHHHH#S))i/011r   N)r   r   r   r   r   r   r   r   r  r  V  s    =2r   r  c                     t        | d      S )Nr   )r   )r  	flags_sets     r   _make_joined_patternr  d  s    VR  r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TerminalTreeToPatternc                     |\  }|S r   r   )r   psrI  s      r   r@  zTerminalTreeToPattern.patternh  s    r   c                     |sJ t        |      dk(  r|d   S dj                  d |D              }t        ||D ch c]  }|j                   c}      S c c}w )Nr   r   r   c              3   <   K   | ]  }|j                           y wr   	to_regexpr^  r   s     r   r_  z2TerminalTreeToPattern.expansion.<locals>.<genexpr>q  s     7A!++-   )r  ra  r  rE  )r   itemsr@  r   s       r   r   zTerminalTreeToPattern.expansionl  sT    uu:?8O''777#Gu-Eu!aggu-EFF-Es   A
c                     t        |      dk(  r|d   S |j                  d        ddj                  d |D              z  }t        ||D ch c]  }|j                   c}      S c c}w )Nr   r   c                 `    | j                    | j                   t        | j                         fS r   )	max_width	min_widthr  r   r4  s    r   <lambda>z2TerminalTreeToPattern.expansions.<locals>.<lambda>z  s!    !++|c!''l] Kr   )r   z(?:%s)rI   c              3   <   K   | ]  }|j                           y wr   r  r  s     r   r_  z3TerminalTreeToPattern.expansions.<locals>.<genexpr>|  s     &Cdq{{}dr  )r  sortra  r  rE  )r   expsr@  r   s       r   r   z TerminalTreeToPattern.expansionst  sc    t9>7N 			K	Lchh&Cd&CCD#Gt-Dt!aggt-DEE-Ds   A&
c                 8   |d d \  }}|dk(  rTt        |      dk(  rdt        |d         z  }nDt        t        |dd        \  }}||k  rt        d|||fz        d||fz  }nt        |      dk(  sJ t	        d|j                         d||j                        S )	N   ri      z{%d}r  z{%d,%d}z(?:rm   )r  r   r  r'   r   r  rE  )r   r   r   r  r	  r
  s         r   r   zTerminalTreeToPattern.expr  s    !H	r94yA~c$q'l*S$qr(+B7&'PTY[]_aSb'bcc"b)t9>!>u'8"=u{{KKr   c                 ,    | j                  |dgz         S )NrK   )r   )r   r   s     r   r   zTerminalTreeToPattern.maybe  s    yy&&r   c                     t        d      )NzBAliasing not allowed in terminals (You used -> in the wrong place))r'   )r   r   s     r   r   zTerminalTreeToPattern.alias  s    _``r   c                     |d   S r=  r   r   r  s     r   r   zTerminalTreeToPattern.value  s    tr   N)
r   r   r   r@  r   r   r   r   r   r   r   r   r   r  r  g  s)    G	FL'ar   r  c                       e Zd Zd Zy)ValidateSymbolsc                 >    |\  }t        |t        t        f      sJ |S r   )r   r,   r#   r  s     r   r   zValidateSymbols.value  s"    !dF^,,,r   N)r   r   r   r   r   r   r   r  r    s    r   r  c                 6    t        d      j                  |       S )z#Deepcopy tree `t` without recursionF)r2   r  r   s    r   nr_deepcopy_treer    s    #E*44Q77r   c            	           e Zd ZU eeeeeef   f      ed<   eeeeedf   ee	f      ed<   ee   ed<   deeeeedf   ee	f      deeeeeef   f      dee   ddfdZ
d Zy)	Grammar	term_defs.rY  r   returnNc                 .    || _         || _        || _        y r   )r  rY  r   )r   rY  r  r   s       r   r   zGrammar.__init__  s    ""r   c                    ,-  j                   D cg c]  \  }\  }}|t        |      |ff }}}} j                  D cg c]  \  }}}}||t        |      |f }}}}}|D ]Q  \  }	\  }
}|
t        |
j	                  d            }t        |      dk(  s5|d   j                  rEt        d|	z         t               t               z  }|D 	
cg c]&  \  }	\  }
}|
rt        |	|j                  |
      |      ( }}
}	}t        |      }t               t               z  |z  }|t        |      z  }t               }g }d}|t        |      k  r||   \  }	}}}|dz  }t        |      dk7  r,|r|j                   rt#        d      nd }||_        |	|_        ||_        |j                  |      }|j                  |      }|j)                  |	||f       |t        |      k  r||j*                  z  }t        |      t        |D 	ch c]  \  }	}}|	
 c}}}	      k(  sJ d       t-               }t/               }g }|D ]'  }|\  }	}}|j1                  |       |j                  |      }t3        |      D ]  \  }\  }} | r#|	j5                  d      rt        d	|	d
| d      |D !cg c]  }!|!t6        k(   }"}!t9        |"      r8t;        |      xs
 t#               }#|"|#_        |D !cg c]  }!|!t6        k7  s|! }}!n|}#|D ]8  }$t?        |$t@              sJ |$jB                  s"|#s%|#j                   s2d|$_"        : tG        tI        |	      ||| |#      }%|j)                  |%        * t        tK        |            t        |      k7  rtM        |d       }&|&jO                         D ]  }'t        |'      dkD  s|'d   jP                  r$t        ddjS                  d |'D              z        t        |'D (ch c]%  }(|(jT                  |(jV                  |(jX                  f' c}(      t        |'      k(  rJ  t        tK        |            }	 t        |      })|D (*ch c]4  }(|(jP                  D ]#  }*t?        |*tH              r|*|(jZ                  k7  r|*% 6 c}*}(,,|D *ch c]  }*tI        |*       c}*z  ,t]        |,fd      \  }}+|+D ]  }(t_        j`                  d|(        t        |      |)k(  rndk7  r|D (ch c]/  }(|(jP                  D ]  }t?        |tb              r|jd                    1 c}}(-t]        | -fd      \  }}+|+r.t_        j`                  d|+D cg c]  }|jd                   c}       || jf                  fS c c}}}w c c}}}}w c c}}
}	w c c}}}	w c c}!w c c}!w c c}(w c c}*}(w c c}*w c c}}(w c c}w )Nr   r   r   zTerminals cannot be empty (%s)Tr   zWhoops, name collisionr[   zRule za is marked for expansion (it starts with an underscore) and isn't allowed to have aliases (alias=rm   Fc                     | S r   r   r  s    r   r  z!Grammar.compile.<locals>.<lambda>  s    Ar   zXRules defined twice: %s

(Might happen due to colliding expansion of optionals: [] or ?)r   c              3   &   K   | ]	  }d |z    yw)z
  * %sNr   r  s     r   r_  z"Grammar.compile.<locals>.<genexpr>	  s     4RTZ!^Ts   c                      | j                   v S r   )origin)r
used_ruless    r   r  z!Grammar.compile.<locals>.<lambda>  s    QXXYcMcr   zUnused rule: %srC   c                 t    | j                   v xs( | j                   j                  v xs | j                   v S r   )r   r   )r   r   terminals_to_keep
used_termss    r   r  z!Grammar.compile.<locals>.<lambda>$  sO    166ZCW  DP[\[a[aeiepep[p  DPtutztz  P  uP  DPr   zUnused terminals: %s)4r  r  rY  list	find_datar  r%  r'   r  r  r   r  r;  r  rW  r   r   r   r   r   r   r   r2  r  r&  r$  r   r   anyr   empty_indicesr   r#   is_termr   r    r"   r/  r%   valuesr   ra  r   orderrg  r  r   r   debugr!   r   r   ).r   r   r  r  r   rI  r  orY  r   	term_treer   r   transformerr>  anon_tokens_transfebnf_to_bnfrulesr   rf  	rule_treerg  r   r   res_t_orule_tree_to_textsimplify_rulecompiled_rulesrule_contentr   r   r4  r  exp_optionsr   r   
duplicatesdupsr  rT  rl  unusedr  r  s.   ` `                                         @@r   compilezGrammar.compile  s    EINNSNyq&1aa*1-q12N	SFJnnUn
1aa,Q/3n	U ,5'D'9h i11+>?J:!#JqM,B,B"#Cd#JKK ,5 &'*?*AA8AP8A44	8Y !{'<'<Y'GR8A 	 P 2)<%'/*;;>PP 	~i00 "m#i. /8|,D&)WFA6{a@GGLcLc;t<imL'3K$!%K.:+((3D''-CLL$W-. #i.  	&&&5zS5!A5<4R$5!ABB\D\\B +,,.!L".D$%*44T:J)2:)>%%IuT__S1&  X\  ^c  (d  e  e4= >IqFI >}%"&w-"@;=K0=K-,5 CIqFII C")K$C%c6222{{{{7R7R). % K-y!UKP%%d+# *? "2 s>"#s>'::!.+>J"))+t9q=Aw((*  ,H-/WW4RT4R-R,S T T tLt!!''199 =tLMQTUYQZZZZ , "#n"56N N#A%3 /^%&[[)![9 !QXX %0 ^ /J 595a;q>599J%2>Cc%d"NF.2 >"a'  #*8 =.Q*+++Q$.q($; &&*5 !. =J !.i  :P  !QIv3f5Mfafff5MN.$++55o TU PB "B  !? !D*  M/ :=
 6NsG   VV
+VV!+V(*V-9V-8*V2
9V7 V= 4W"W
)r   r   r   r   r	   strr,   r   __annotations__r   r   r  r   r   r   r  r    s    E#uT3Y//011E#uS#XkABCCI$uS%S/4-T'U"V cghmnqsxy}  @C  zC  tD  oD  iE  dF   PT  UX  PY   ^b 
z6r   r  PackageResourcezpkg_name pathc                   x    e Zd ZU dZeed<   ee   ed<   ddedee   ddfdZd Zde	dee
f   d	edee
ef   fd
Zy)FromPackageLoadera  
    Provides a simple way of creating custom import loaders that load from packages via ``pkgutil.get_data`` instead of using `open`.
    This allows them to be compatible even from within zip files.

    Relative imports are handled, so you can just freely use them.

    pkg_name: The name of the package. You can probably provide `__name__` most of the time
    search_paths: All the path that will be search on absolute imports.
    pkg_namesearch_pathsr  Nc                      || _         || _        y r   )r  r  )r   r  r  s      r   r   zFromPackageLoader.__init__<  s     (r   c                 f    t        |       j                  d| j                  d| j                  dS )Nrk   , rm   )r  r   r  r  r   s    r   __repr__zFromPackageLoader.__repr__@  s#    #Dz22DMM4CTCTUUr   	base_pathgrammar_pathc                    || j                   }n@t        |t              r|j                  | j                  k7  r
t	               |j
                  g}d }|D ]q  }t        j
                  j                  ||      }	 t        j                  | j                  |      }t        | j                  |      |r|j                         fc S dfc S  t	        d      |# t        $ r}|}Y d }~d }~ww xY w)Nr   z"Cannot find grammar in given paths)r  r   r  r  IOErrorpathosra  pkgutilget_datadecode)	r   r  r  to_tryerrr  	full_pathtextrz  s	            r   __call__zFromPackageLoader.__call__C  s    &&F i9Y=O=OSWS`S`=`inn%FDT<8Ib(/(8(8	(R
 't}}i@TX4;;=aa^`aa  :;D  s   8 C	C)C$$C)))r   )r   r   r   rL  r  r  r   r   r  r
   r  r	   r  r   r   r   r  r  .  st     M3-) )HSM )T )VE%c?(B"C ESV E[`apruau[v Er   r  larkc           	         	 d}| j                         D ]  \  }}|	|j                  d      D ]z  }|j                  \  }t        |t              rt        d|d|d      t        |t              r&	 | |j                     }|J ||j                  d<   d}it        |t              rzJ   |sn| j                         D ]Z  \  }}|s	|j                  D ]C  }|j                         D 	cg c]  }	t        |	       }
}	t        |      |
v s7t        d	|z         \ y # t        $ r t        d|j                  z        w xY wc c}	w )
NTFr   z'Rules aren't allowed inside terminals (z in rm   z!Terminal used but not defined: %sr   zNRecursion in terminal '%s' (recursion is only allowed in rules, not terminals))r  r  r%  r   r"   r'   r!   r   r   r,   iter_subtreesid)	term_dictchangedr   
token_treeexpitem
term_valuer   r'  r4  idss              r   resolve_term_referencesr  _  sY     ) 1D*!!++G4dK0&]acg'hiih/\%.tyy%9
 &111&0CLLO"G%dD111 5 !2" ) ,  oo'
d&+&9&9&;<&;r!u&;<d8s?&'wz~'~ ' ( $ \*+NQUQZQZ+Z[[\ =s   2D+E"Ec                     t        | t              sJ | j                         rt        | | j	                  d            S t        |       S Nr[   rD  )r   r  isupperr!   r   r"   rl  s    r   symbol_from_strcaser    s:    a89		8A!,,s"34WUVWr   c                       e Zd Zd Zd Zy)PrepareGrammarc                 L    t        t        |      |j                  d            S r   )r!   r  r   r   r   s     r   r   zPrepareGrammar.terminal  s    D	dooc.BCCr   c                 ,    t        |j                        S r   )r"   r   r  s     r   r   zPrepareGrammar.nonterminal  s    4::&&r   N)r   r   r   r   r   r   r   r   r  r    s    D'r   r  c                     | j                   dk(  sJ | j                  d      D ch c]%  }|j                  d       D ]  }|j                   ' c}}S c c}}w )Nr   r   c                 "    t        | t              S r   )r   r#   r  s    r   r  z$_find_used_symbols.<locals>.<lambda>  s    Z6-Br   )r!  r  scan_valuesr   )r   r4  r   s      r   _find_used_symbolsr    sa    99$$$ NN;7 E7q]]#BC FFC 7 E E Es   *Ac                  R   	 t         j                  S # t        $ r t        j	                         D  cg c]  \  } }t        | t        |             nc c}} w }} }t        j	                         D  cg c]2  \  } }| j                  d      |t        | j                  d            f4 nc c}} w }} }|D 	cg c]\  \  }}}t        |      D ]H  \  }}t        t        |      |j                         D 	cg c]  }	t        |	       nc c}	w c}	|d |      J ^ n
c c}	}}}}}w }}}}}}}	t!        |t"              j%                         }
dd l}t)        ||g d      }t+        ||
dg      }d|_        d|_        t1        ||d       t         _        t         j                  cY S w xY w)NrK   )expand1r   )r   r   rH   r   basiclalr)_get_parsercacheAttributeError	TERMINALSr  r   r   RULESlstripr   r   r$  r    r"   splitr  r   r   create_callbackrer   r   
lexer_typeparser_typer   )r   r   r>  r4  r  r  xsr  r   rl  callbackr  
lexer_confparser_confs                 r   r  r    s{   !    !LUOOL]^L][T5[y'78L]^	^  %{{}.,GD! ++c"A{4??3;O'PQ,. . "'B B!&XQA9R=41a k!nqwwy&Qy!':1'=y&QSTVZ\]^3@ _!&B B $E2.>>@y".LM
 7)< '
"(+JTJ   !s?    !F&A!F&37B+*F&=;D8D
DBF&%F&zIncorrect type of valueza: 1
zUnclosed parenthesisza: (
zUnmatched closing parenthesis)za: )
za: [)
za: (]
z5Expecting rule or terminal definition (missing colon))za
zA
za->
zA->
za A
z#Illegal name for rules or terminalszAa:
zAlias expects lowercase namez
a: -> "a"
zUnexpected colon)za::
za: b:
za: B:
za: "a":
zMisplaced operator)za: b??za: b(?)za:+
za:?
za:*
za:|*
z;Expecting option ("|") or a new rule or terminal definitionza:a
()
z"Terminal names cannot contain dotszA.B
z%Expecting rule or terminal definitionz"a"
z%import expects a namez%import "a"
z%ignore expects a valuez%ignore %import
c                 Z    |j                  | t        d      }|r|S d|j                  v ryy )NT)use_acceptsr   zExpecting a value)match_examplesGRAMMAR_ERRORSexpected)parserz  errors      r   _translate_parser_exceptionr'    s5      D IL#& $r   c           
         	 t               j                  | dz   |      }t               j                  |      S # t        $ r<}|j                  |       }t	        d|j
                  |j                  ||fz        d }~wt        $ ra}|j                  |       }t        t               j                  |      }|r*t	        |d|j
                  d|j                  d|       d }~ww xY w)Nrw   z1Unexpected input at line %d column %d in %s: 

%sz
, at line z column z

)r  r%  r(   get_contextr'   linecolumnr)   r'  r  r  )r  r   r   r   rz  contextr&  s          r   _parse_grammarr-    s    }""4$;6 %%d++   >--%PFFAHHdG<= > 	> --%+KM,?,?C5!&&RSRZRZ\cdees"   8 	C%7A88C%AC  C%c                    t        | t              rgt        t               j                  |       }|r|S dj                  | j                  xs | j                        }dt        | j                        d|dS t        |       S )Nr  zUnexpected token z. Expected one of: {rq   )
r   r)   r'  r  r%  ra  acceptsr$  r  token)r&  error2r$  s      r   _error_reprr2    sb    %),[]-@-@%HM99U]]<enn=?B5;;?OQYZZ5zr   c                 T    d }t        d| fg|      D ]  \  }} ||      s||fc S  y )Nc              3      K   | \  }}|j                         D ]*  }t        |d      }	 |j                  |      }||fz   |f , y # t        $ r Y 9w xY ww)Nr   )rm  r   
feed_tokenr*   )noder  rI  choicer   new_ps         r   expandz*_search_interactive_parser.<locals>.expand  sd     aiikFfb!A.Q fY&-- "  s'   %AAA	AAAAr   )r   )interactive_parser	predicater9  r  rI  s        r   _search_interactive_parserr<    s8    	. "B(:#;"<fEaQ<7N Fr   r  r  c                     g fd}t               j                  | dz   ||      }t        d       }|j                         D cg c]  }|d   	 c}D ]  }d |d   _         S c c}w )Nc                 0   j                  | t        |       f       t        | j                  j	                         d       \  }}|D ]'  }| j                  j                  t        |d             ) | j                  j                  t        dd             y)Nc                 &    d| j                         v S )Nr   )rm  )rI  s    r   r  z7find_grammar_errors.<locals>.on_error.<locals>.<lambda>  s    bgklktktkvbvr   r   r   rw   T)r   r2  r<  r:  as_immutabler5  r   )rz  
token_pathr[   
token_typeerrorss       r   on_errorz%find_grammar_errors.<locals>.on_error  s}    q+a.)* 313G3G3T3T3VXvw
A$J  ++E*b,AB %	''eT(:;r   rw   )rD  c                      | d   j                   S r=  )r*  )rz  s    r   r  z%find_grammar_errors.<locals>.<lambda>  s    !		r   r   )r  r%  r%   r  r:  )r  r   rD  _treeerrors_by_lineelrz  rC  s          @r   find_grammar_errorsrI    s|    F MtUXFEf&9:N,33565be56F"&! M	 7s   A)c                       fd}|S )Nc                 f    | v r|    } n| d   dk(  rdd| dd  } nd| }  |       } | S )Nr   r[   __r   r   )rl  r-  base_mangler   s    r   manglez_get_mangle.<locals>.mangle  sL    <
Ats{!'12/ &*"AAr   r   )r   r-  rM  rN  s   ``` r   _get_manglerO     s    
 Mr   c                     || S t        |       } | j                         D ]N  }t        |j                        D ]4  \  }}t	        |t
              s|j                  |      |j                  |<   6 P | S r   )r   r  r$  r%  r   r#   renamed)r  rN  r   r   rT  s        r   _mangle_definition_treerR    sf    ~

3-C ajj)DAq!V$ !		& 1

1 * !
 Jr   c           	      j   | j                   r5| j                   \  }d|v }|r|j                  d      rt        d      d|v }nd}d}|j                   r|j                   \  }t        |      }	nd }	|#|j                   D 
cg c]  }
|
j                   }}
|||t        |||	|r|      fS d       fS c c}
w )NrK   r[   z4Inlined rules (_rule) cannot use the ?rule modifier.rM   F)r   template_source)r%  r   r'   r   r   r   )modifiers_treer   rf  priority_treer   mr  r   rI  r   r   s              r   _make_rule_tuplerX    s    $$(ts+UVV(##q6#)??3?a!''?3['T\JP$&] ] ]VZ&] ] ] 4s   >B0c                       e Zd ZddZy)
DefinitionNc                 N    || _         || _        t        |      | _        || _        y r   )r  r   tuplerf  rg  )r   r  r   rf  rg  s        r   r   zDefinition.__init__2  s"    	Fmr   r   N)r   r   r   r   r   r   r   rZ  rZ  1  s    r   rZ  c                   n   e Zd ZU eed<   eeeef      ed<   e	eef   ed<   e	ee
f   ed<   ee   ed<   ddedeeeeef         dee	eef      ddfd	Zd
 Zd Zd dddZd dZd Zd Zd Zd!dededeeegef      ddfdZd Zd"deedf   dee   de	eef   deeegef      ddf
dZd#dZdefdZy)$GrammarBuilderglobal_keep_all_tokensimport_paths
used_files_definitions_ignore_namesFNr  c                 Z    || _         |xs g | _        |xs i | _        i | _        g | _        y r   )r`  ra  rb  rc  rd  )r   r`  ra  rb  s       r   r   zGrammarBuilder.__init__A  s3    &<#(.B$*35(*r   c                     i }t        |d      D ]B  \  }}|dk(  rdn
t        |      }||d|z   <   d|   x|d|z   <   }|j                         |d|z   <   D t         |j                  di |      )	Nr   r   r   r   )r   r   r  Typer   )r$  r  titler'   format)	r   r  msgrQ  r   r   r   postfixlowercase_types	            r   _grammar_errorzGrammarBuilder._grammar_errorI  s     a0GAtFbAG%)D'!"6J76SSD'!"^%3%9%9%;D'!"	 1
 :3::--..r   c                     |r/|d}|S t        |t              st        dt        |            |S |t	               }nt        |t              st        d      | j
                  rd|_        |S )Nr   z@Terminal require a single int as 'options' (e.g. priority), got z1Rules require a RuleOptions instance as 'options'T)r   r   r'   r  r   r`  r   )r   r  rg  s      r   _check_optionszGrammarBuilder._check_optionsR  sx       -"kopwkx#z{{  %-5"#VWW***.'r   )r   c          	         || j                   v r|s)| j                  |d|       n|r| j                  |d|       |j                  d      r| j                  |d|       t        |||| j	                  ||            | j                   |<   y )Nz&{Type} '{name}' defined more than oncez+Cannot override a nonexisting {type} {name}rL  zDNames starting with double-underscore are reserved (Error at {name}))rc  rn  r   rZ  rp  )r   r   r  r  rf  rg  r   s          r   _definezGrammarBuilder._defineb  s    4$$$##G-UW[\)VX\]??4 )oquv",Wc64CVCVW^`gCh"i$r   c                    || j                   vr| j                  |d|       | j                   |   }||j                  k7  r| j                  |d|       t        |      |j                  k7  r| j                  |d|       |j
                  | j                  |d|       |j
                  }t        |t              r|j                  dk(  sJ |j                  j                  d|       y )Nz6Can't extend {type} {name} as it wasn't defined beforezHCannot extend {type} {name} - one is a terminal, while the other is not.z6Cannot extend {type} with different parameters: {name}z,Can't extend {type} {name} - it is abstract.r   r   )rc  rn  r  r\  rf  r   r   r,   r!  r%  insert)r   r   r  r  rf  rg  dbases           r   _extendzGrammarBuilder._extendn  s    t((()acghd#aii)suyz=AHH$)acgh66>)WY]^ vv$%$))|*CCCQ$r   c                    t        |t              r| j                  j                  |       y t        |t              sJ |}|j
                  dk(  rt        |j                        dk(  r|j                  \  }|j
                  dk(  ryt        |j                        dk(  ra|j                  \  }|j
                  dk(  rD|j                  \  }t        |t              r&| j                  j                  |j                         y dt        | j                        z  }| j                  j                  |       t        d|t              | j                  |<   y )Nr   r   r   r   z__IGNORE_%dT)rg  )r   r  rd  r   r,   r!  r  r%  r!   r   rZ  r$   rc  )r   exp_or_namer   t2r  r   s         r   _ignorezGrammarBuilder._ignore  s   k3'%%k2k4000Avv%#ajj/Q*>jj77K'C,<,AKKFDyyG+ $%dH5 ..55dii@" #d&8&8"99D%%d+&0qBX&YDd#r   c                    t        |j                        dkD  r|j                  \  }}n|j                  \  }d }t        |t              r7t	        |j                        }|j                  }t        t        ||            }nat	        |j                  d d       }|s|j                  \  }t        d|z        |j                  d   }|j                  |xs |j                  i}|j                  dk(  rd }	n|dk(  r<	 t        j                  j                  t        j                  d   j                        }
n|}
|
rtt        |
t"              rAt#        |
j$                  t        j                  j'                  |
j                        d         }	nZt        j                  j'                  |
      d   }	n7t        j                  j                  t        j                  j(                        }	||	|fS # t         $ r d }
Y w xY w)Nr   r  z&Nothing was imported from grammar `%s`r   <string>__main__r   )r  r%  r   r,   r\  rb  rc  r'   r   r!  r  r  abspathsysmodules__file__r  r  r  r  curdir)r   stmtgrammar_name	path_nodearg1dotted_pathrQ  r-  r   r  	base_files              r   _unpack_importzGrammarBuilder._unpack_import  s   t}}!"mmOItJIDdD!	 2 23KMME3ue,-G	 2 23B 78K!**"#Kd#RSS%%b)DzzDLD#7#78G>>\)Iz)% "J0G0P0P QI )	i9 /	0B0BBGGMMR[R`R`DabcDd eI "i 8 ;IGGOOBGGNN;	Iw.. & % $I%s   9:G( (G65G6c                 |   |j                   dk(  rt        |j                   \  }}}}d}nb|j                  d   j                  }d}t	        |j                        dk(  rt        |j                  d         nt        }|j                  d   }d}t        fd	|D              } |      }t        |      }|||||fS )
Nr   Fr   r   r  r   r  Tc              3   .   K   | ]  } |        y wr   r   )r^  rI  rN  s     r   r_  z4GrammarBuilder._unpack_definition.<locals>.<genexpr>  s     5f6!9fs   )	r!  rX  r%  r   r  r   r$   r\  rR  )r   r   rN  r   rf  r  optsr  s     `     r   _unpack_definitionz!GrammarBuilder._unpack_definition  s    99&6&F#D&#tG==#))DF,/,>!,C3t}}Q'(I_D--#CG5f55F$<D%c62Wc64//r   grammar_textr  rN  c                 ,   t        ||      }i }|j                  D ]`  }|j                  dk(  s| j                  ||      \  }}}		 ||   \  }
}||
k(  sJ ddj	                  |      z         |j                  |	       b |j                         D ]  \  }\  }}	| j                  |||	|        |j                  D ]m  }|j                  dv r  | j                  | j                  ||        2|j                  dk(  r1|j                  \  } | j                  | j                  ||      ddi r|j                  dk(  r.|j                  \  } | j                  | j                  ||        |j                  dk(  r| | j                  |j                    |j                  d	k(  rn|j                  D ]]  }t        |t              sJ |       t        |t              }||j                   }n ||j                         }| j                  ||d        _ X|j                  dk(  riJ |        | j"                  j                         D ci c]  \  }}|j$                  r||j&                    }}}t)        |       y # t        $ r ||	f||<   Y qw xY wc c}}w )
Nr   zInconsistent base_path for %s.r7   )r   r   r   Tr   r   r   )r-  r%  r!  r  ra  updater   r  	do_importrr  r  rw  r{  r   r#   r!   r   rc  r  r   r  )r   r  r  rN  r   importsr  r  r  r-  import_base_pathimport_aliasesr  r   r  r   ru  r  s                     r   load_grammarzGrammarBuilder.load_grammar  sy   lL9OQMMDyyH$262E2EdL2Y/Y>7>{7K4$n$(88r:Z]`]e]efq]r:rr8"))'2 " 29-K-)WNN;	7FC 2A MMDyy,,d55dFCDj(]]d55a@P4Ph&]]d55a@Ah&> DLL$--0i'"mmF%ff5=v=5(:G~%{{%fkk2LLw5 , h&"d"u3 ":  ,,224
4ayy AFFl4 	 
 	 	*M   >+4g+=GK(>D
s   7I9#J9JJc                       fd}t        t        ||            } j                  j                         D ci c]  \  }}||v s|| c}} _        y c c}}w )Nc                     	 j                   |    }|j                  rg S t        |j                        t        |j                        z
  S # t        $ r g cY S w xY wr   )rc  r   r  r  r   r/  rf  )r   ru  r   s     r   rule_dependenciesz8GrammarBuilder._remove_unused.<locals>.rule_dependencies  sX    %%f- yy	%aff-AHH==	  	s   A AA)r/  r   rc  r  )r   usedr  _usedkr  s   `     r   _remove_unusedzGrammarBuilder._remove_unused  sV    	> C/01.2.?.?.E.E.GV.Gda1PU:QT.GVVs   AAr  .r  r-  rM  c           	         |sJ t        dj                  |      ||      }t        j                  j                  | t        z   }| j
                  ||gng z   t        gz   }|D ]V  }	 t        |      r |||      \  }	}
nFt        j                  j                  ||      }	t        |	d      5 }|j                         }
d d d        t        
      }| j                  j                  |	|      |k7  rt        d      || j                  |	<   t        | j                  | j
                  | j                        }|j!                  |
|	|       |j#                  t%        ||             |j&                  D ]"  }|| j&                  v st)        d|d|d        | j&                  j*                  d
i |j&                    y  t        |d       J d|d	       # 1 sw Y   xY w# t,        $ r Y w xY w)NrL  utf8encodingz)Grammar file was changed during importingzCannot import 'z' from 'z': Symbol already defined.zCouldn't import grammar zP, but a corresponding file was found at a place where lark doesn't search for itr   )rO  ra  r  r  EXTra  stdlib_loadercallableopenreadsha256_digestrb  getRuntimeErrorr_  r`  r  r  r  rc  r'   r  r  )r   r  r  r-  rM  rN  r  r  sourcejoined_pathr  r  hgbr   s                  r   r  zGrammarBuilder.do_import  s   {TYY{3WkJww||[1C7""Y5JykPRSWdVeeFF#(.y,(G%K"$'',,v|"DKkF;q vvx <
 "$'??&&{A6!;&'RSS/0,#D$?$?ARARTXTcTcdk6:!!#fg"67OODt000*fjlx+yzz , )!!((;2??;1 6 / X  KV  X  X5- <; s+   'AG!,G=G!G	G!!	G.-G.c           
      L   | j                   j                         D ]  \  }}|j                  }|j                  }t	        |      D ]>  \  }}|| j                   v rt        d|d|d      ||d | v s.t        d|d|d       |n|j                  d      D ]  }|j                  d   j                  }|j                  dd  }	||vs0|| j                   vr | j                  |j                  d|z  |       t        |	      t        | j                   |   j                        k7  st        | j                   |   j                        t        |	      }}
| j                  |j                  d	|
d
|d||        t        |      D ]4  }|| j                   vs||vs| j                  |j                  d||       6  t        | j                         j                  | j                        s7t        dt        | j                        t        | j                         z
  z        y )Nz'Template Parameter conflicts with rule z (in template rm   zDuplicate Template Parameter r   r   r   z5Template '%s' used but not defined (in {type} {name})z=Wrong number of template arguments used for {name} (expected z, got z) (in {type2} {name2})z9{Type} '{name}' used but not defined (in {type2} {name2})z8Terminals %s were marked to ignore but were not defined!)rc  r  rf  r   r$  r'   r  r%  r   rn  r  r  r  r/  
issupersetrd  )r   r   ru  rf  r  r   rI  tempr   r   r$  actuals               r   validatezGrammarBuilder.validate9  s   ((..0GD!XXF&&C!&)1)))&ghjn'oppr
?&]^`d'eff	 * {&67mmA&++}}QR(f$$"3"33++AII7nqt7tvz{4yC(9(9#(>(E(E$FF+.t/@/@/E/L/L+MsSWy&++AII\dfl8nortxz 8 *#.d///Cv4E''		3npsuyz /1 18 4$$%001C1CDY]`aeasas]twz{  |M  |M  xN  ^N   O  P  P Er   c                 r   | j                          g }g }| j                  j                         D ]p  \  }}|j                  |j                  |j
                  }}}|j                  r&t        |      dk(  sJ |j                  |||ff       \|j                  ||||f       r t        ||| j                        S r=  )r  rc  r  rf  r   rg  r  r  r   r  rd  )r   rY  r  r   ru  rf  r  rg  s           r   buildzGrammarBuilder.buildY  s    		((..0GD!%&XXqvvqyy'SVyy6{a'''  $g!78  $W!=> 1 y)T-?-?@@r   )FNNr]  )z<?>Nr   )r  N)r   r   r   boolr  r   r
   r  r   r   rZ  r   r   rn  rp  rr  rw  r{  r  r  r  r  r	   r  r  r  r  r   r   r   r_  r_  8  s     uS(]+,,S#XsJ''9+t +RVW\]`bj]jWkRlIm +  AI  JN  OR  TW  OW  JX  AY +  cg +/ 
ju 
j%(Z*%/N0(2+ 2+C 2+xX`beafhkakXlOm 2+w{ 2+jW!XU38_ !X# !XY]^acf^fYg !Xv~  @H  JM  IN  PS  IS  @T  wU !X  _c !XHP@Aw Ar   r_  c                     | j                         D ]  \  }}d }t        |t              rFt        j                  j                  |      r't        |d      5 }|j                         }d d d        nIt        |t              r9t        t              5  t        j                  | j                  d      }d d d        |t        |      }||k7  st        j                   d|z          y y# 1 sw Y   9xY w# 1 sw Y   ExY w)Nr  r  zutf-8z"File %r changed, rebuilding ParserFT)r  r   r  r  r  existsr  r  r  r   r  r  r  r  r  r   info)file_hashesr  oldr  r  currents         r   verify_used_filesr  h  s     &&(	cdC RWW^^D%9dV,vvx -,o.'"''.55g> #<%'>KK<tCD )  -, #"s   C("C4(C1	4C=	c                     t        d|      }|j                  | d       t        |j                  j	                               S )zXReturns a list of paths to the lark grammars imported by the given grammar (recursively)Fr}  )r_  r  r  rb  keys)grammarra  builders      r   list_grammar_importsr  z  s8    UL1G*-""'')**r   c                 v    t        ||      }|j                  | |       |j                         |j                  fS r   )r_  r  r  rb  )r  r  ra  r`  r  s        r   r  r    s6    3\BG&)==?G....r   rl  c                     t         j                  dk\  r4t        j                  | j	                  d      d      j                         S t        j                  | j	                  d            j                         S )zGet the sha256 digest of a string

    Supports the `usedforsecurity` argument for Python 3.9+ to allow running on
    a FIPS-enabled system.
    )r  	   r  F)usedforsecurity)r  version_infohashlibsha256encode	hexdigestr  s    r   r  r    sV     6!~~ahhv.FPPRR~~ahhv./99;;r   rg  r   )yrL  r  os.pathr  r  collectionsr   r   r   r  astr   
contextlibr   typingr   r	   r
   r   r   r   r   utilsr   r   r   r   r   r   r   lexerr   r   r   r   parse_tree_builderr   parser_frontendsr   commonr   r   r  r   r    r!   r"   r#   r$   r%   r&   
exceptionsr'   r(   r)   r*   r+   r   r,   r-   r   visitorsr.   r/   r0   r1   r2   rM  r  dirnamer  __path__IMPORT_PATHSr  r~  r   rF  r  r  r  r  r   r   r  r2  r;  rO  rW  rn  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r'  r-  r2  r<  r  rI  rO  rR  rX  rZ  r_  r  r  r  r  r   r   r   <module>r     sL   (   
 "     I I I i i i < < 0 - ) ] ] ' h h ) a aD!77??8$|			%%%'% '% +	%
 &% '% &% '% 	;% &% '% &% $% &% (%  )!%" ,#%$ +%%& ,'%( *)%* *+%, '-%. */%0 	71%2 +3%4 '5%6 &7%8 &9%: (;%< (=%> &?%@ &A%B 	9C%D VE%F 
I%PUU U U	
 u u 	
 c c 
5 K w S 1   #!" (#$ /:
(=	BK	gYK	w&K	 ZK	
 QRK	 'K	 K	 :K	 79K	 =/K	  0K	& .<'K	( ,)K	, 2()-K	0  1K	<  =K	D   EK	P QK	R F8SK	V fj!WK	X 
M*YK	\ &']K	^ %&_K	b CDcK	d w46eK	j -9;kK	n !!#oK	r ~sK	v '(wK	x ,-yK	z  4{K	B \<0CK	D >"EK	F &'GK	H V56IK	L 34 67(#UK	`  
  ,; ,: X/% X/ X/v*67 *6Z
%[ 
%4:. 4:n;) ;$(( (.,4SB 
2) 
2 
2!-4 -`) 8
E6 E6P .@*E *EZ "&,7@DX '( ' 'E!* 
#XJ/	(,	(*JK	@Bkl	.	:	'-9	IJ	YZ	FV	-y9	07)<	!O#45	"%8$9: '," c # $u_VYEY?Z:[ ,	]0 mA mA`	$ 02 +/	<S 	<S 	<r   