Ë
    :vžj /  ã                   ó  — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZmZ d	„ Z G d
„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Zd"d„Zd„ Z G d„ d«      Z G d„ de«      Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d „ Z!d!„ Z"y)#z$This module implements a CYK parser.é    )ÚdefaultdictNé   )Ú
ParseError)ÚToken)ÚTree)ÚTerminalÚNonTerminalÚSymbolc                 óX   — t        | t        «      sJ ‚| j                  |j                  k(  S ©N)Ú
isinstanceÚTÚnameÚtype)ÚtÚss     úa/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/lark/parsers/cyk.pyÚmatchr      s%   € Ü�aœÔÐÐØ�6‰6�Q—V‘VÑÐó    c                   ó@   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )ÚRulezContext-free grammar rule.c                 óÂ   •— t         t        | �  «        t        |t        «      sJ |«       ‚t        d„ |D «       «      sJ |«       ‚|| _        || _        || _        || _	        y )Nc              3   ó`   K  — | ]&  }t        |t        «      xs t        |t        «      –— Œ( y ­wr   )r   ÚNTr   ©Ú.0Úxs     r   Ú	<genexpr>z Rule.__init__.<locals>.<genexpr>   s'   è ø€ ÐFÁ#¸Q”:˜a¤Ó$Ò8¬
°1´aÓ(8Ó8Á#ùs   ‚,.)
Úsuperr   Ú__init__r   r   ÚallÚlhsÚrhsÚweightÚalias)Úselfr"   r#   r$   r%   Ú	__class__s        €r   r    zRule.__init__   sZ   ø€ ÜŒd�DÑ"Ô$Ü˜#œrÔ"Ð' CÓ'Ð"ÜÑFÁ#ÓFÔFÐKÈÓKÐFØˆŒØˆŒØˆŒØˆ�
r   c                 óv   — t        | j                  «      ›ddj                  d„ | j                  D «       «      ›�S )Nz -> Ú c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   ©Ústrr   s     r   r   zRule.__str__.<locals>.<genexpr>"   s   è ø€ Ð4NÁXÀ´S¸·VÁXùó   ‚)r,   r"   Újoinr#   ©r&   s    r   Ú__str__zRule.__str__!   s(   € Ü  §¡�]¨C¯H©HÑ4NÀTÇXÂXÓ4NÔ,NÐOÐOr   c                 ó   — t        | «      S r   r+   r/   s    r   Ú__repr__zRule.__repr__$   ó   € Ü�4‹yÐr   c                 óV   — t        | j                  t        | j                  «      f«      S r   )Úhashr"   Útupler#   r/   s    r   Ú__hash__zRule.__hash__'   s   € Ü�T—X‘Xœu T§X¡X›Ð/Ó0Ð0r   c                 ój   — | j                   |j                   k(  xr | j                  |j                  k(  S r   )r"   r#   ©r&   Úothers     r   Ú__eq__zRule.__eq__*   s'   € Ø�x‰x˜5Ÿ9™9Ñ$Ò>¨¯©°U·Y±YÑ)>Ð>r   c                 ó   — | |k(   S r   © r9   s     r   Ú__ne__zRule.__ne__-   s   € Ø˜E‘MÐ"Ð"r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r0   r2   r7   r;   r>   Ú__classcell__©r'   s   @r   r   r      s%   ø„ Ù$ôòPòò1ò?ö#r   r   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚGrammarzContext-free grammar.c                 ó$   — t        |«      | _        y r   )Ú	frozensetÚrules)r&   rI   s     r   r    zGrammar.__init__4   s   € Ü˜uÓ%ˆ�
r   c                 ó4   — | j                   |j                   k(  S r   )rI   r9   s     r   r;   zGrammar.__eq__7   s   € Ø�z‰z˜UŸ[™[Ñ(Ð(r   c                 ód   — ddj                  t        d„ | j                  D «       «      «      z   dz   S )NÚ
c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   )Úreprr   s     r   r   z"Grammar.__str__.<locals>.<genexpr>;   s   è ø€ Ð&C¹
°1¤t¨A§w¹
ùr-   )r.   ÚsortedrI   r/   s    r   r0   zGrammar.__str__:   s*   € Ø�d—i‘i¤Ñ&C¸¿
º
Ó&CÓ CÓDÑDÀtÑKÐKr   c                 ó   — t        | «      S r   r+   r/   s    r   r2   zGrammar.__repr__=   r3   r   N)r?   r@   rA   rB   r    r;   r0   r2   r=   r   r   rF   rF   1   s   „ Ùò&ò)òLór   rF   c                   ó   — e Zd ZdZdd„Zd„ Zy)ÚRuleNodez@A node in the parse tree, which also contains the full rhs rule.c                 ó.   — || _         || _        || _        y r   )ÚruleÚchildrenr$   )r&   rT   rU   r$   s       r   r    zRuleNode.__init__E   s   € ØˆŒ	Ø ˆŒØˆ�r   c                 óŽ   — dt        | j                  j                  «      ›ddj                  d„ | j                  D «       «      ›d�S )Nz	RuleNode(z, [z, c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   r+   r   s     r   r   z$RuleNode.__repr__.<locals>.<genexpr>K   s   è ø€ ÐEdÑVcÐQRÄcÈ!ÇfÑVcùr-   z]))rN   rT   r"   r.   rU   r/   s    r   r2   zRuleNode.__repr__J   s0   � Ü'+¨D¯I©I¯M©MÕ':¸D¿I¹IÑEdÐVZ×VcÒVcÓEdÕ<dÐeÐer   N©r   )r?   r@   rA   rB   r    r2   r=   r   r   rR   rR   B   s   „ ÙJóó
fr   rR   c                   ó4   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zˆ xZS )ÚParserzParser wrapper.c                 óØ   •— t         t        | �  «        |D �ci c]  }||“Œ c}| _        |D �cg c]  }| j	                  |«      ‘Œ }}t        t        |«      «      | _        y c c}w c c}w r   )r   rZ   r    Ú
orig_rulesÚ_to_ruleÚto_cnfrF   Úgrammar)r&   rI   rT   r'   s      €r   r    zParser.__init__R   s_   ø€ ÜŒf�dÑ$Ô&Ù27Ó8±%¨$˜4 ™:°%Ñ8ˆŒÙ16Ó7±¨�—‘˜tÕ$°ˆÐ7Üœg e›nÓ-ˆ�ùò 9ùÚ7s
   ˜
A"®A'c                 ó   — t        |j                  t        «      sJ ‚t        d„ |j                  D «       «      sJ ‚t        |j                  |j                  |j                  j                  r|j                  j                  |¬«      S d|¬«      S )z?Converts a lark rule, (lhs, rhs, callback, options), to a Rule.c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr   )r   r
   r   s     r   r   z"Parser._to_rule.<locals>.<genexpr>[   s   è ø€ ÐFÑ2E¨Q”:˜a¤×(Ñ2Eùó   ‚r   ©r$   r%   )r   Úoriginr   r!   Ú	expansionr   ÚoptionsÚpriority)r&   Ú	lark_rules     r   r]   zParser._to_ruleX   s€   € ä˜)×*Ñ*¬BÔ/Ð/Ð/ÜÑF°)×2EÒ2EÓFÔFÐFÐFÜØ×Ñ˜i×1Ñ1Ø1:×1BÑ1B×1KÒ1K�9×$Ñ$×-Ñ-Øôð 	àQRØôð 	r   c                 ó  ‡— ‰sJ ‚t        ‰«      Št        || j                  «      \  }}t        ˆfd„|dt	        |«      dz
  f   D «       «      rt        d«      ‚|dt	        |«      dz
  f   ‰   }| j                  t        |«      «      S )z(Parses input, which is a list of tokens.c              3   ó<   •K  — | ]  }|j                   ‰k7  –— Œ y ­wr   )r"   )r   ÚrÚstarts     €r   r   zParser.parse.<locals>.<genexpr>h   s   øè ø€ ÐFÑ'E !ˆq�u‰u˜�~Ñ'Eùs   ƒr   é   zParsing failed.)r   Ú_parser_   r!   Úlenr   Ú_to_treeÚ
revert_cnf)r&   Ú	tokenizedrl   ÚtableÚtreesÚparses     `   r   ru   zParser.parsea   s…   ø€ áˆˆuÜ�5“	ˆä˜i¨¯©Ó6‰ˆˆuäÓF u¨a´°Y³À!Ñ1CÐ-DÒ'EÓFÔFÜÐ.Ó/Ð/Ø�qœ#˜i›.¨1Ñ,Ð-Ñ.¨uÑ5ˆØ�}‰}œZ¨Ó.Ó/Ð/r   c                 ó|  — | j                   |j                  j                     }g }|j                  D ]j  }t	        |t
        «      r!|j                  | j                  |«      «       Œ4t	        |j                  t        «      sJ ‚|j                  |j                  «       Œl t        |j                  |«      }||_        |S )z.Converts a RuleNode parse tree to a lark Tree.)r\   rT   r%   rU   r   rR   Úappendrp   r   r   r   rd   )r&   Ú	rule_nodeÚ	orig_rulerU   Úchildr   s         r   rp   zParser._to_treem   s’   € à—O‘O I§N¡N×$8Ñ$8Ñ9ˆ	ØˆØ×'Ô'ˆEÜ˜%¤Ô*Ø—‘ §¡¨eÓ 4Õ5ä! %§*¡*¬eÔ4Ð4Ð4Ø—‘ §
¡
Õ+ð (ô �×!Ñ! 8Ó,ˆØˆŒØˆr   )	r?   r@   rA   rB   r    r]   ru   rp   rC   rD   s   @r   rZ   rZ   O   s   ø„ Ùô.òò
0ör   rZ   c                 ó  — t        | t        «      rRt        d|dz  z  t        | j                  j
                  «      z   «       | j                  D ]  }t        ||dz   «       Œ y t        d|dz  z  t        | j                  «      z   «       y )Nr)   r   rm   )	r   rR   Úprintr,   rT   r"   rU   Úprint_parser   )ÚnodeÚindentrz   s      r   r}   r}   |   sk   € Ü�$œÔ!Üˆc�V˜a‘ZÑ ¤3 t§y¡y§}¡}Ó#5Ñ5Ô6Ø—]”]ˆEÜ˜˜v¨™zÕ*ñ #ô 	ˆc�V˜a‘ZÑ ¤3 t§v¡v£;Ñ.Õ/r   c           
      ó  — t        t        «      }t        t        «      }t        | «      D ]Ä  \  }}|j                  j                  «       D ]¢  \  }}t        ||«      sŒ|D ]‹  }|||f   j                  |«       |j                  |||f   vs,|j                  |||f   |j                     j                  k  sŒXt        |t        |«      g|j                  ¬«      |||f   |j                  <   Œ� Œ¤ ŒÆ t        dt        | «      dz   «      D �]z  }	t        t        | «      |	z
  dz   «      D �]Y  }t        |dz   ||	z   «      D �]@  }
||
dz
  f}|
||	z   dz
  f}t        j                  ||   ||   «      D �]  \  }}|j                   j#                  |j                  |j                  fg «      D ]Ñ  }||||	z   dz
  f   j                  |«       ||   |j                     }||   |j                     }|j                  |j                  z   |j                  z   }|j                  ||||	z   dz
  f   vs(|||||	z   dz
  f   |j                     j                  k  sŒªt        |||g|¬«      ||||	z   dz
  f   |j                  <   ŒÓ �Œ �ŒC �Œ\ �Œ} ||fS )z*Parses sentence 's' using CNF grammar 'g'.©r$   r   rm   )r   ÚsetÚdictÚ	enumerateÚterminal_rulesÚitemsr   Úaddr"   r$   rR   r   Úrangero   Ú	itertoolsÚproductÚnonterminal_rulesÚget)r   Úgrs   rt   ÚiÚwÚterminalrI   rT   ÚlÚpÚspan1Úspan2Úr1Úr2Úr1_treeÚr2_treeÚrule_total_weights                     r   rn   rn   …   sq  € ô œÓ€Eô œÓ€Eä˜!–‰ˆˆ1Ø ×/Ñ/×5Ñ5Ö7‰OˆH�eÜ�X˜qÕ!Û!�DØ˜1˜a˜&‘M×%Ñ% dÔ+ØŸ™¨¨q°!¨f©Ñ5ØŸ™ e¨Q°¨F¡m°D·H±HÑ&=×&DÑ&DÓDÜ2:¸4Ä!ÀAÃ$ÀÐPT×P[ÑP[Ô2\˜˜q !˜f™ d§h¡hÒ/ñ	 "ñ  8ð ô �1”c˜!“f˜q‘j×!ˆä”s˜1“v ‘z A‘~×&ˆAä˜1˜q™5 ! a¡%×(�Ø˜A ™E˜
�Ø˜A ™E A™I˜�Ü'×/Ñ/°°e±¸eÀE¹l×K‘F�B˜Ø !× 3Ñ 3× 7Ñ 7¸¿¹ÀÇÁÐ8HÈ"Ö M˜Ø˜q ! a¡%¨!¡)˜nÑ-×1Ñ1°$Ô7Ø"'¨¡,¨r¯v©vÑ"6˜Ø"'¨¡,¨r¯v©vÑ"6˜Ø,0¯K©K¸'¿.¹.Ñ,HÈ7Ï>É>Ñ,YÐ)Ø ŸH™H¨E°1°a¸!±e¸a±i°.Ñ,AÑAØ0°5¸!¸QÀ¹UÀQ¹Y¸Ñ3HÈÏÉÑ3R×3YÑ3YÓYÜ>FÀtÈgÐW^ÐM_ÐhyÔ>z˜E 1 a¨!¡e¨a¡i .Ñ1°$·(±(Ò;ò !Nò Lò )ò 'ð "ð  �%ˆ<Ðr   c                   ó.   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zˆ xZS )Ú
CnfWrapperzkCNF wrapper for grammar.

  Validates that the input grammar is CNF and provides helper data structures.
  c                 óð  •— t         t        | �  «        || _        |j                  | _        t        t        «      | _        t        t        «      | _        | j                  D �]  }t        |j                  t        «      sJ |«       ‚t        |j                  «      dvrt        d«      ‚t        |j                  «      dk(  rIt        |j                  d   t        «      r,| j                  |j                  d      j!                  |«       Œ¨t        |j                  «      dk(  rOt#        d„ |j                  D «       «      r3| j                  t%        |j                  «         j!                  |«       �ŒJ |«       ‚ y )N)rm   r   zCYK doesn't support empty rulesrm   r   r   c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr   )r   r   r   s     r   r   z&CnfWrapper.__init__.<locals>.<genexpr>Ë   s   è ø€ Ð(JÁE¸q¬°A´r×):ÁEùrb   )r   r›   r    r_   rI   r   Úlistr…   r‹   r   r"   r   ro   r#   r   r   rw   r!   r6   )r&   r_   rk   r'   s      €r   r    zCnfWrapper.__init__¾   s
  ø€ ÜŒj˜$Ñ(Ô*ØˆŒØ—]‘]ˆŒ
Ü)¬$Ó/ˆÔÜ!,¬TÓ!2ˆÔØ—•ˆAä˜aŸe™e¤RÔ(Ð+¨!Ó+Ð(Ü�1—5‘5‹z Ñ'Ü Ð!BÓCÐCÜ�1—5‘5‹z˜QŠ¤:¨a¯e©e°A©h¼Ô#:Ø×#Ñ# A§E¡E¨!¡HÑ-×4Ñ4°QÕ7Ü�Q—U‘U“˜q’¤SÑ(JÀAÇEÂEÓ(JÔ%JØ×&Ñ&¤u¨Q¯U©U£|Ñ4×;Ñ;¸AÖ>à˜a“�uñ r   c                 ó4   — | j                   |j                   k(  S r   )r_   r9   s     r   r;   zCnfWrapper.__eq__Ð   s   € Ø�|‰|˜uŸ}™}Ñ,Ð,r   c                 ó,   — t        | j                  «      S r   )rN   r_   r/   s    r   r2   zCnfWrapper.__repr__Ó   s   € Ü�D—L‘LÓ!Ð!r   )r?   r@   rA   rB   r    r;   r2   rC   rD   s   @r   r›   r›   ¸   s   ø„ ñô
 ò$-ö"r   r›   c                   ó@   ‡ — e Zd ZdZˆ fd„Zd„ Zej                  Zˆ xZS )ÚUnitSkipRulez@A rule that records NTs that were skipped during transformation.c                 ó@   •— t         t        | �  ||||«       || _        y r   )r   r¢   r    Úskipped_rules)r&   r"   r#   r¤   r$   r%   r'   s         €r   r    zUnitSkipRule.__init__Ú   s    ø€ ÜŒl˜DÑ*¨3°°V¸UÔCØ*ˆÕr   c                 ób   — t        |t        | «      «      xr | j                  |j                  k(  S r   )r   r   r¤   r9   s     r   r;   zUnitSkipRule.__eq__Þ   s)   € Ü˜%¤ d£Ó,ÒZ°×1CÑ1CÀu×GZÑGZÑ1ZÐZr   )	r?   r@   rA   rB   r    r;   r   r7   rC   rD   s   @r   r¢   r¢   ×   s   ø„ ÙJô+ò[ð �}‰}„Hr   r¢   c                 ó.  — g }t        | t        «      r|| j                  z  }|j                  |«       t        |t        «      r||j                  z  }t        | j                  |j
                  || j                  |j                  z   | j                  ¬«      S )Nrc   )r   r¢   r¤   rw   r"   r#   r$   r%   )Ú	unit_ruleÚtarget_ruler¤   s      r   Úbuild_unit_skipruler©   ä   s€   € Ø€MÜ�)œ\Ô*Ø˜×0Ñ0Ñ0ˆØ×Ñ˜Ô%Ü�+œ|Ô,Ø˜×2Ñ2Ñ2ˆÜ˜	Ÿ™ {§¡¸Ø&×-Ñ-°×0BÑ0BÑBÈ)Ï/É/ô[ð [r   c                 óš   — | j                   D ]<  }t        |j                  «      dk(  sŒt        |j                  d   t        «      sŒ:|c S  y)zDReturns a non-terminal unit rule from 'g', or None if there is none.rm   r   N)rI   ro   r#   r   r   )r�   rT   s     r   Úget_any_nt_unit_ruler«   ï   s;   € à—”ˆÜˆt�x‰x‹=˜AÓ¤*¨T¯X©X°a©[¼"Õ"=ØŠKð ð r   c                 ó  — | j                   D �cg c]
  }||k7  sŒ	|‘Œ }}| j                   D �cg c]!  }|j                  |j                  d   k(  sŒ |‘Œ# }}||D �cg c]  }t        ||«      ‘Œ c}z  }t	        |«      S c c}w c c}w c c}w )zFRemoves 'rule' from 'g' without changing the language produced by 'g'.r   )rI   r"   r#   r©   rF   )r�   rT   r   Ú	new_rulesÚrefsÚrefs         r   Ú_remove_unit_ruler°   ÷   s‚   € àŸGšGÓ1™G�q q¨D£y’˜G€IÐ1Ø—w’wÓ7‘w�! !§%¡%¨4¯8©8°A©;Ó"6ŠA�w€DÐ7Ø¹DÓA¹D°SÔ% d¨CÕ0¸DÑAÑA€IÜ�9ÓÐùò 2ùÚ7ùÚAs   �
A>šA>®!BÁBÁBc           
   #   ój  K  — t        | j                  «      dz   dj                  d„ | j                  D «       «      z   }d|z  dz   }t	        | j                  | j                  d   t        |dz  «      g| j                  | j                  ¬«      –— t        dt        | j                  «      d	z
  «      D ]=  }t	        t        ||z  «      | j                  |   t        ||dz   z  «      gdd
¬«      –— Œ? t	        t        |t        | j                  «      d	z
  z  «      | j                  dd dd
¬«      –— y­w)z4Splits a rule whose len(rhs) > 2 into shorter rules.Ú__Ú_c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   r+   r   s     r   r   z_split.<locals>.<genexpr>  s   è ø€ Ð.H¹x¸!¬s°1¯v¹xùr-   z__SP_%sz_%dr   rm   rc   r   ÚSplitéþÿÿÿN)
r,   r"   r.   r#   r   r   r$   r%   rˆ   ro   )rT   Úrule_strÚ	rule_namerŽ   s       r   Ú_splitr¹   ÿ   sý   è ø€ ä�4—8‘8‹}˜tÑ# c§h¡hÑ.H¸t¿xºxÓ.HÓ&HÑH€HØ˜XÑ&¨Ñ.€IÜ
ˆt�x‰x˜$Ÿ(™( 1™+¤r¨)°a©-Ó'8Ð9À$Ç+Á+ÐUY×U_ÑU_Ô
`Ò`Ü�1”c˜$Ÿ(™(“m aÑ'Ö(ˆÜ”2�i !‘mÓ$ t§x¡x°¡{´B°yÀAÈÁEÑ7JÓ4KÐ&LÐUVÐ^eÔfÓfð )ä
Œr�)œs 4§8¡8›}¨qÑ0Ñ1Ó2°D·H±H¸R¸S°MÈ!ÐSZÔ
[Ó[ùs   ‚D1D3c                 ó  ‡— | j                   D ��ch c]&  }|j                  D ]  }t        |t        «      sŒ|’Œ Œ( }}}|D �ci c](  }|t	        t        dt        |«      z  «      |gdd¬«      “Œ* }}g }| j                   D ]ä  Št        ‰j                  «      dkD  r¹t        d„ ‰j                  D «       «      r�‰j                  D �cg c]#  }t        |t        «      r||   j                  n|‘Œ% }}|j                  t	        ‰j                  |‰j                  ‰j                  ¬«      «       |j                  ˆfd„|j                  «       D «       «       ŒÔ|j                  ‰«       Œæ t        |«      S c c}}w c c}w c c}w )z/Applies the TERM rule on 'g' (see top comment).z__T_%sr   ÚTermrc   rm   c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr   )r   r   r   s     r   r   z_term.<locals>.<genexpr>  s   è ø€ Ð$H¹x¸!¤Z°´1×%5¹xùrb   c              3   óF   •K  — | ]  \  }}|‰j                   v sŒ|–— Œ y ­wr   )r#   )r   ÚkÚvrT   s      €r   r   z_term.<locals>.<genexpr>  s    øè ø€ ÐL©?¡4 1 a¸aÀ4Ç8Á8ºmœQ©?ùs   ƒ!š!)rI   r#   r   r   r   r   r,   ro   Úanyr"   rw   r$   r%   Úextendr†   rF   )r�   rT   r   Úall_tr   Út_rulesr­   Únew_rhss    `      r   Ú_termrÅ   	  s1  ø€ àŸ7š7ÔI™7�4¨D¯H¬H q¼
À1ÄaÕ8HŠQ¨HˆQ˜7€EÑIÙTYÓZÑTYÈqˆq”$”r˜(¤S¨£VÑ+Ó,¨q¨c¸!À6ÔJÑJÐTY€GÐZØ€IØ—”ˆÜˆt�x‰x‹=˜1Ò¤Ñ$H¸t¿xºxÓ$HÔ!HØJNÏ(Ê(ÓSÉ(ÀQ¬°A´qÔ)9�w˜q‘z—~’~¸qÑ@È(ˆGÐSØ×ÑœT $§(¡(¨G¸D¿K¹KÈtÏzÉzÔZÔ[Ø×ÑÓL¨7¯=©=¬?ÓLÕLà×Ñ˜TÕ"ð ô �9ÓÐùó JùÚZùò Ts   ‘$E2¶E2Á-E8Ã(E=c                 ó®   — g }| j                   D ]:  }t        |j                  «      dkD  r|t        |«      z  }Œ*|j	                  |«       Œ< t        |«      S )z.Applies the BIN rule to 'g' (see top comment).r   )rI   ro   r#   r¹   rw   rF   )r�   r­   rT   s      r   Ú_binrÇ     sN   € à€IØ—”ˆÜˆt�x‰x‹=˜1ÒØœ ›Ñ%‰Ià×Ñ˜TÕ"ð	 ô
 �9ÓÐr   c                 óT   — t        | «      }|rt        | |«      } t        | «      }|rŒ| S )z/Applies the UNIT rule to 'g' (see top comment).)r«   r°   )r�   Únt_unit_rules     r   Ú_unitrÊ   #  s1   € ä'¨Ó*€LÙ
Ü˜a Ó.ˆÜ+¨AÓ.ˆò ð €Hr   c                 óR   — t        t        t        | «      «      «      } t        | «      S )z>Creates a CNF grammar from a general context-free grammar 'g'.)rÊ   rÇ   rÅ   r›   )r�   s    r   r^   r^   ,  s   € äŒd”5˜“8‹nÓ€AÜ�a‹=Ðr   c                 ó$  — |st        t        | |||¬«      ||¬«      S ||d   j                  z
  }t        t        | |d   j                  g||¬«      t	        |d   j                  ||dd  ||d   j                  |d   j
                  «      g|¬«      S )Nrc   r�   r   rm   )rR   r   r$   r"   Úunroll_unit_skipruler%   )r"   Úorig_rhsr¤   rU   r$   r%   s         r   rÍ   rÍ   2  s¨   € ÙÜœ˜S (°6ÀÔGÈÐZ`ÔaÐaà˜-¨Ñ*×1Ñ1Ñ1ˆÜÜ��} QÑ'×+Ñ+Ð,°VÀ5ÔIÜ$ ]°1Ñ%5×%9Ñ%9¸8Ø -¨a¨bÐ 1°8Ø -¨aÑ 0× 7Ñ 7¸ÀqÑ9I×9OÑ9OóQðLð ôð 	r   c                 óì  — t        | t        «      r| S | j                  j                  j                  j                  d«      r| j                  d   S g }t        t        | j                  «      D ]b  }t        |t        «      r?|j                  j                  j                  j                  d«      r||j                  z  }ŒR|j                  |«       Œd t        | j                  t        «      rtt        | j                  j                  | j                  j                  | j                  j                  || j                  j                  | j                  j                   «      S t        | j                  |«      S )zDReverts a parse tree (RuleNode) to its original non-CNF form (Node).Ú__T_r   Ú__SP_)r   r   rT   r"   r   Ú
startswithrU   Úmaprq   rR   rw   r¢   rÍ   r#   r¤   r$   r%   )r~   rU   rz   s      r   rq   rq   ?  s  € ä�$œÔØˆà‡y�y‡}�}×Ñ×$Ñ$ VÔ,Ø�}‰}˜QÑÐàˆÜœ T§]¡]Ö3ˆEä˜%¤Ô*¨u¯z©z¯~©~×/BÑ/B×/MÑ/MÈgÔ/VØ˜EŸN™NÑ*‘à—‘ Õ&ð 4ô �d—i‘i¤Ô.Ü'¨¯	©	¯©°t·y±y·}±}Ø$(§I¡I×$;Ñ$;¸XØ$(§I¡I×$4Ñ$4°d·i±i·o±oóGð Gô ˜DŸI™I xÓ0Ð0r   rX   )#rB   Úcollectionsr   r‰   Ú
exceptionsr   Úlexerr   Útreer   r_   r   r   r	   r   r
   r   r   rF   rR   rZ   r}   rn   r›   r¢   r©   r«   r°   r¹   rÅ   rÇ   rÊ   r^   rÍ   rq   r=   r   r   Ú<module>rØ      s¤   ðÙ *õ $Û å #Ý Ý ß >Ñ >ò÷
#ñ #÷8ñ ÷"	fñ 	f÷*ñ *óZ0ò"÷f"ñ "ô>
�4ô 
ò[òòò\òòòòò
ó1r   