ó
    ÖÁ“i /  ã                   ó   • S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  SSK
JrJrJr  S	 r " S
 S5      r " S S5      r " S S5      r " S S5      rS"S jrS r " S S5      r " S S\5      rS rS rS rS rS rS rS rS r S  r!S! r"g)#z$This module implements a CYK parser.é    )ÚdefaultdictNé   )Ú
ParseError)ÚToken)ÚTree)ÚTerminalÚNonTerminalÚSymbolc                 ób   • [        U [        5      (       d   eU R                  UR                  :H  $ ©N)Ú
isinstanceÚTÚnameÚtype)ÚtÚss     ÚM/home/mande/repo/quber/.venv/lib/python3.13/site-packages/lark/parsers/cyk.pyÚmatchr      s(   € Ü�aœ×ÑÐÐØ�6‰6�Q—V‘VÑÐó    c                   óJ   ^ • \ rS rSrSrU 4S jrS rS rS rS r	S r
S	rU =r$ )
ÚRuleé   zContext-free grammar rule.c                 óÎ   >• [         [        U ]  5         [        U[        5      (       d   U5       e[        S U 5       5      (       d   U5       eXl        X l        X0l        X@l	        g )Nc              3   óp   #   • U  H,  n[        U[        5      =(       d    [        U[        5      v •  M.     g 7fr   )r   ÚNTr   ©Ú.0Úxs     r   Ú	<genexpr>Ú Rule.__init__.<locals>.<genexpr>   s&   é € ÐFÂ#¸Q”:˜a¤Ó$×8¬
°1´aÓ(8Ô8Â#ùs   ‚46)
Úsuperr   Ú__init__r   r   ÚallÚlhsÚrhsÚweightÚalias)Úselfr$   r%   r&   r'   Ú	__class__s        €r   r"   ÚRule.__init__   sX   ø€ ÜŒd�DÑ"Ô$Ü˜#œr×"Ñ"Ð' CÓ'Ð"ÜÑFÁ#ÓF×FÑFÐKÈÓKÐFØŒØŒØŒØ�
r   c                 óz   • [        U R                  5      < SSR                  S U R                   5       5      < 3$ )Nz -> Ú c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr   ©Ústrr   s     r   r   ÚRule.__str__.<locals>.<genexpr>"   s   é € Ð4NÂXÀ´S¸·V°VÂXùó   ‚)r/   r$   Újoinr%   ©r(   s    r   Ú__str__ÚRule.__str__!   s(   € Ü  §¡ž]¨C¯H©HÑ4NÀTÇXÂXÓ4NÕ,NÐOÐOr   c                 ó   • [        U 5      $ r   r.   r3   s    r   Ú__repr__ÚRule.__repr__$   ó   € Ü�4‹yÐr   c                 óV   • [        U R                  [        U R                  5      45      $ r   )Úhashr$   Útupler%   r3   s    r   Ú__hash__ÚRule.__hash__'   s   € Ü�T—X‘Xœu T§X¡X›Ð/Ó0Ð0r   c                 ót   • U R                   UR                   :H  =(       a    U R                  UR                  :H  $ r   )r$   r%   ©r(   Úothers     r   Ú__eq__ÚRule.__eq__*   s'   € Ø�x‰x˜5Ÿ9™9Ñ$×>¨¯©°U·Y±YÑ)>Ð>r   c                 ó   • X:X  + $ r   © r@   s     r   Ú__ne__ÚRule.__ne__-   s   € ØÒ"Ð"r   )r'   r$   r%   r&   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r"   r4   r7   r=   rB   rF   Ú__static_attributes__Ú__classcell__©r)   s   @r   r   r      s*   ø† Ù$õòPòò1ò?÷#ð #r   r   c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚGrammaré1   zContext-free grammar.c                 ó$   • [        U5      U l        g r   )Ú	frozensetÚrules)r(   rU   s     r   r"   ÚGrammar.__init__4   s   € Ü˜uÓ%ˆ�
r   c                 ó4   • U R                   UR                   :H  $ r   ©rU   r@   s     r   rB   ÚGrammar.__eq__7   s   € Ø�z‰z˜UŸ[™[Ñ(Ð(r   c                 ód   • SSR                  [        S U R                   5       5      5      -   S-   $ )NÚ
c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr   )Úreprr   s     r   r   Ú"Grammar.__str__.<locals>.<genexpr>;   s   é € Ð&Cº
°1¤t¨A§w wº
ùr1   )r2   ÚsortedrU   r3   s    r   r4   ÚGrammar.__str__:   s*   € Ø�d—i‘i¤Ñ&C¸¿
º
Ó&CÓ CÓDÑDÀtÑKÐKr   c                 ó   • [        U 5      $ r   r.   r3   s    r   r7   ÚGrammar.__repr__=   r9   r   rX   N)
rH   rI   rJ   rK   rL   r"   rB   r4   r7   rM   rE   r   r   rQ   rQ   1   s   † Ùò&ò)òLõr   rQ   c                   ó(   • \ rS rSrSrSS jrS rSrg)ÚRuleNodeéB   z@A node in the parse tree, which also contains the full rhs rule.c                 ó(   • Xl         X l        X0l        g r   )ÚruleÚchildrenr&   )r(   rg   rh   r&   s       r   r"   ÚRuleNode.__init__E   s   € ØŒ	Ø ŒØ�r   c                 ó’   • S[        U R                  R                  5      < SSR                  S U R                   5       5      < S3$ )Nz	RuleNode(z, [z, c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr   r.   r   s     r   r   Ú$RuleNode.__repr__.<locals>.<genexpr>K   s   é € ÐEdÒVcÐQRÄcÈ!ÇfÀfÒVcùr1   z]))r]   rg   r$   r2   rh   r3   s    r   r7   ÚRuleNode.__repr__J   s0   � Ü'+¨D¯I©I¯M©MÖ':¸D¿I¹IÑEdÐVZ×VcÒVcÓEdÖ<dÐeÐer   )rh   rg   r&   N©r   )rH   rI   rJ   rK   rL   r"   r7   rM   rE   r   r   rd   rd   B   s   † ÙJôõ
fr   rd   c                   ó>   ^ • \ rS rSrSrU 4S jrS rS rS rSr	U =r
$ )ÚParseréO   zParser wrapper.c                 óà   >• [         [        U ]  5         U Vs0 s H  o"U_M     snU l        U Vs/ s H  o R	                  U5      PM     nn[        [        U5      5      U l        g s  snf s  snf r   )r!   rp   r"   Ú
orig_rulesÚ_to_ruleÚto_cnfrQ   Úgrammar)r(   rU   rg   r)   s      €r   r"   ÚParser.__init__R   s[   ø€ ÜŒf�dÑ$Ô&Ù27Ó8²%¨$ š:±%Ñ8ˆŒÙ16Ó7²¨—‘˜tÖ$±ˆÐ7Üœg e›nÓ-ˆ�ùò 9ùÚ7s
   ˜A&°A+c                 ó2  • [        UR                  [        5      (       d   e[        S UR                   5       5      (       d   e[        UR                  UR                  UR                  R                  (       a  UR                  R                  US9$ SUS9$ )z?Converts a lark rule, (lhs, rhs, callback, options), to a Rule.c              3   óB   #   • U  H  n[        U[        5      v •  M     g 7fr   )r   r
   r   s     r   r   Ú"Parser._to_rule.<locals>.<genexpr>[   s   é € ÐFÒ2E¨Q”:˜a¤×(Ð(Ò2Eùó   ‚r   ©r&   r'   )r   Úoriginr   r#   Ú	expansionr   ÚoptionsÚpriority)r(   Ú	lark_rules     r   rt   ÚParser._to_ruleX   s†   € ä˜)×*Ñ*¬B×/Ñ/Ð/Ð/ÜÑF°)×2EÒ2EÓF×FÑFÐFÐFÜØ×Ñ˜i×1Ñ1Ø1:×1BÑ1B×1K×1K�9×$Ñ$×-Ñ-Øñð 	àQRØñð 	r   c                 ó&  ^• T(       d   e[        T5      m[        XR                  5      u  p4[        U4S jUS[	        U5      S-
  4    5       5      (       a  [        S5      eUS[	        U5      S-
  4   T   nU R                  [        U5      5      $ )z(Parses input, which is a list of tokens.c              3   ó@   >#   • U  H  oR                   T:g  v •  M     g 7fr   )r$   )r   ÚrÚstarts     €r   r   ÚParser.parse.<locals>.<genexpr>h   s   øé € ÐFÒ'E !�u‰u˜Ž~Ò'Eùs   ƒr   é   zParsing failed.)r   Ú_parserv   r#   Úlenr   Ú_to_treeÚ
revert_cnf)r(   Ú	tokenizedr†   ÚtableÚtreesÚparses     `   r   r�   ÚParser.parsea   s„   ø€ æˆˆuÜ�5“	ˆä˜i¯©Ó6‰ˆäÔF u¨a´°Y³À!Ñ1CÐ-DÒ'EÓF×FÑFÜÐ.Ó/Ð/Ø�qœ#˜i›.¨1Ñ,Ð-Ñ.¨uÑ5ˆØ�}‰}œZ¨Ó.Ó/Ð/r   c                 ó”  • U R                   UR                  R                     n/ nUR                   Hv  n[	        U[
        5      (       a"  UR                  U R                  U5      5        M:  [	        UR                  [        5      (       d   eUR                  UR                  5        Mx     [        UR                  U5      nX%l        U$ )z.Converts a RuleNode parse tree to a lark Tree.)rs   rg   r'   rh   r   rd   Úappendr‹   r   r   r   r}   )r(   Ú	rule_nodeÚ	orig_rulerh   Úchildr   s         r   r‹   ÚParser._to_treem   s–   € à—O‘O I§N¡N×$8Ñ$8Ñ9ˆ	ØˆØ×'Ô'ˆEÜ˜%¤×*Ñ*Ø—‘ §¡¨eÓ 4Ö5ä! %§*¡*¬e×4Ñ4Ð4Ð4Ø—‘ §
¡
Ö+ñ (ô �×!Ñ! 8Ó,ˆØŒØˆr   )rv   rs   )rH   rI   rJ   rK   rL   r"   rt   r�   r‹   rM   rN   rO   s   @r   rp   rp   O   s   ø† Ùõ.òò
0÷ð r   rp   c                 ó"  • [        U [        5      (       aS  [        SUS-  -  [        U R                  R
                  5      -   5        U R                   H  n[        X!S-   5        M     g [        SUS-  -  [        U R                  5      -   5        g )Nr,   r   rˆ   )	r   rd   Úprintr/   rg   r$   rh   Úprint_parser   )ÚnodeÚindentr–   s      r   rš   rš   |   sl   € Ü�$œ×!Ñ!Üˆc�V˜a‘ZÑ ¤3 t§y¡y§}¡}Ó#5Ñ5Ô6Ø—]”]ˆEÜ˜¨™zÖ*ò #ô 	ˆc�V˜a‘ZÑ ¤3 t§v¡v£;Ñ.Õ/r   c                 ó  • [        [        5      n[        [        5      n[        U 5       HÉ  u  pEUR                  R                  5        H¦  u  pg[        Xe5      (       d  M  U H‰  nX$U4   R                  U5        UR                  X4U4   ;  d-  UR                  X4U4   UR                     R                  :  d  MY  [        U[        U5      /UR                  S9X4U4   UR                  '   M‹     M¨     MË     [        S[        U 5      S-   5       GHt  n	[        [        U 5      U	-
  S-   5       GHQ  n[        US-   XI-   5       GH7  n
XJS-
  4nX¤U	-   S-
  4n[        R                  " X+   X,   5       GH  u  pÞUR                   R#                  UR                  UR                  4/ 5       HÈ  nX$XI-   S-
  4   R                  U5        X;   UR                     nX<   UR                     nUR                  UR                  -   UR                  -   nUR                  X4XI-   S-
  4   ;  d(  UX4XI-   S-
  4   UR                     R                  :  d  M¦  [        X�U/US9X4XI-   S-
  4   UR                  '   MÊ     GM     GM:     GMT     GMw     X#4$ )z*Parses sentence 's' using CNF grammar 'g'.©r&   r   rˆ   )r   ÚsetÚdictÚ	enumerateÚterminal_rulesÚitemsr   Úaddr$   r&   rd   r   ÚrangerŠ   Ú	itertoolsÚproductÚnonterminal_rulesÚget)r   ÚgrŽ   r�   ÚiÚwÚterminalrU   rg   ÚlÚpÚspan1Úspan2Úr1Úr2Úr1_treeÚr2_treeÚrule_total_weights                     r   r‰   r‰   …   sB  € ô œÓ€Eô œÓ€Eä˜!–‰ˆØ ×/Ñ/×5Ñ5Ö7‰OˆHÜ�X×!Ó!Û!�DØ˜a˜&‘M×%Ñ% dÔ+ØŸ™¨°!¨f©Ó5ØŸ™ e°¨F¡m°D·H±HÑ&=×&DÑ&DÕDÜ2:¸4Ä!ÀAÃ$ÀÐPT×P[ÑP[Ñ2\˜ !˜f™ d§h¡hÓ/ó	 "ó  8ñ ô �1”c˜!“f˜q‘j×!ˆä”s˜1“v ‘z A‘~×&ˆAä˜1˜q™5 !¡%×(�Ø ™E˜
�Ø ™E A™I˜�Ü'×/Ò/°±¸e¹l×K‘F�BØ !× 3Ñ 3× 7Ñ 7¸¿¹ÀÇÁÐ8HÈ"Ö M˜Ø !¡%¨!¡)˜nÑ-×1Ñ1°$Ô7Ø"'¡,¨r¯v©vÑ"6˜Ø"'¡,¨r¯v©vÑ"6˜Ø,0¯K©K¸'¿.¹.Ñ,HÈ7Ï>É>Ñ,YÐ)Ø ŸH™H¨E°a±e¸a±i°.Ñ,AÓAØ0°5¸Q¹UÀQ¹Y¸Ñ3HÈÏÉÑ3R×3YÑ3YÕYÜ>FÀtÐW^ÐM_ÐhyÑ>z˜E a¡e¨a¡i .Ñ1°$·(±(Ó;ô !Nô Lô )ô 'ñ "ð  ˆ<Ðr   c                   ó8   ^ • \ rS rSrSrU 4S jrS rS rSrU =r	$ )Ú
CnfWrapperé¸   zgCNF wrapper for grammar.

Validates that the input grammar is CNF and provides helper data structures.
c                 ó  >• [         [        U ]  5         Xl        UR                  U l        [        [        5      U l        [        [        5      U l        U R                   GH(  n[        UR                  [        5      (       d   U5       e[        UR                  5      S;  a  [        S5      e[        UR                  5      S:X  aO  [        UR                  S   [        5      (       a-  U R                  UR                  S      R!                  U5        M¶  [        UR                  5      S:X  aU  [#        S UR                   5       5      (       a4  U R                  [%        UR                  5         R!                  U5        GM$   U5       e   g )N)rˆ   r   zCYK doesn't support empty rulesrˆ   r   r   c              3   óB   #   • U  H  n[        U[        5      v •  M     g 7fr   )r   r   r   s     r   r   Ú&CnfWrapper.__init__.<locals>.<genexpr>Ë   s   é € Ð(JÂE¸q¬°A´r×):Ð):ÂEùr{   )r!   r¸   r"   rv   rU   r   Úlistr¢   r¨   r   r$   r   rŠ   r%   r   r   r“   r#   r<   )r(   rv   r…   r)   s      €r   r"   Ú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Ñ%JØ×&Ñ&¤u¨Q¯U©U£|Ñ4×;Ñ;¸A×>à˜a“�uò r   c                 ó4   • U R                   UR                   :H  $ r   )rv   r@   s     r   rB   ÚCnfWrapper.__eq__Ð   s   € Ø�|‰|˜uŸ}™}Ñ,Ð,r   c                 ó,   • [        U R                  5      $ r   )r]   rv   r3   s    r   r7   ÚCnfWrapper.__repr__Ó   s   € Ü�D—L‘LÓ!Ð!r   )rv   r¨   rU   r¢   )
rH   rI   rJ   rK   rL   r"   rB   r7   rM   rN   rO   s   @r   r¸   r¸   ¸   s   ø† ñõ
 ò$-÷"ð "r   r¸   c                   óJ   ^ • \ rS rSrSrU 4S jrS r\R                  rSr	U =r
$ )ÚUnitSkipRuleé×   z@A rule that records NTs that were skipped during transformation.c                 ó:   >• [         [        U ]  XXE5        X0l        g r   )r!   rÄ   r"   Úskipped_rules)r(   r$   r%   rÇ   r&   r'   r)   s         €r   r"   ÚUnitSkipRule.__init__Ú   s   ø€ ÜŒl˜DÑ*¨3°VÔCØ*Õr   c                 ól   • [        U[        U 5      5      =(       a    U R                  UR                  :H  $ r   )r   r   rÇ   r@   s     r   rB   ÚUnitSkipRule.__eq__Þ   s)   € Ü˜%¤ d£Ó,×Z°×1CÑ1CÀu×GZÑGZÑ1ZÐZr   )rÇ   )rH   rI   rJ   rK   rL   r"   rB   r   r=   rM   rN   rO   s   @r   rÄ   rÄ   ×   s   ø† ÙJõ+ò[ð �}‰}†Hr   rÄ   c                 ó8  • / n[        U [        5      (       a  X R                  -  nUR                  U5        [        U[        5      (       a  X!R                  -  n[        U R                  UR
                  UU R                  UR                  -   U R                  S9$ )Nr|   )r   rÄ   rÇ   r“   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                 ó¬   • U R                    HD  n[        UR                  5      S:X  d  M  [        UR                  S   [        5      (       d  MB  Us  $    g)zDReturns a non-terminal unit rule from 'g', or None if there is none.rˆ   r   N)rU   rŠ   r%   r   r   )rª   rg   s     r   Úget_any_nt_unit_rulerÐ   ï   s>   € à—”ˆÜˆt�x‰x‹=˜AÕ¤*¨T¯X©X°a©[¼"×"=Ó"=ØŠKñ ð r   c                 ó,  • U R                    Vs/ s H  o"U:w  d  M
  UPM     nnU R                    Vs/ s H#  o"R                  UR                  S   :X  d  M!  UPM%     nnX4 Vs/ s H  n[        X5      PM     sn-  n[	        U5      $ s  snf s  snf s  snf )zFRemoves 'rule' from 'g' without changing the language produced by 'g'.r   )rU   r$   r%   rÎ   rQ   )rª   rg   r   Ú	new_rulesÚrefsÚrefs         r   Ú_remove_unit_rulerÕ   ÷   s|   € àŸGšGÓ1šG�q¨D¡y—™G€IÐ1Ø—w’wÓ7’w�!§%¡%¨4¯8©8°A©;Ñ"6�A‘w€DÐ7Ø¸DÓAºD°SÔ% dÖ0¹DÑAÑA€IÜ�9ÓÐùò 2ùÚ7ùÚAs   �	BœB² BÁBÁ"Bc           
   #   óX  #   • [        U R                  5      S-   SR                  S U R                   5       5      -   nSU-  S-   n[	        U R                  U R                  S   [        US-  5      /U R                  U R                  S9v •  [        S[        U R                  5      S	-
  5       H9  n[	        [        X#-  5      U R                  U   [        X#S-   -  5      /SS
S9v •  M;     [	        [        U[        U R                  5      S	-
  -  5      U R                  SS SS
S9v •  g7f)z4Splits a rule whose len(rhs) > 2 into shorter rules.Ú__Ú_c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr   r.   r   s     r   r   Ú_split.<locals>.<genexpr>  s   é € Ð.Hºx¸!¬s°1¯v¨vºxùr1   z__SP_%sz_%dr   rˆ   r|   r   ÚSplitéþÿÿÿN)
r/   r$   r2   r%   r   r   r&   r'   r¥   rŠ   )rg   Ú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ÈÁ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   ‚D(D*c                 ó4  ^• U R                    VVs1 s H/  oR                    H  n[        U[        5      (       d  M  UiM     M1     nnnU Vs0 s H%  oD[	        [        S[        U5      -  5      U/SSS9_M'     nn/ nU R                    Hñ  m[        TR                  5      S:”  aÄ  [        S TR                   5       5      (       a£  TR                   Vs/ s H(  n[        U[        5      (       a  XR   R                  OUPM*     nnUR                  [	        TR                  UTR                  TR                  S95        UR                  U4S jUR                  5        5       5        Mà  UR                  T5        Mó     [        U5      $ s  snnf s  snf s  snf )z/Applies the TERM rule on 'g' (see top comment).z__T_%sr   ÚTermr|   rˆ   c              3   óB   #   • U  H  n[        U[        5      v •  M     g 7fr   )r   r   r   s     r   r   Ú_term.<locals>.<genexpr>  s   é € Ð$Hºx¸!¤Z°´1×%5Ð%5ºxùr{   c              3   óP   >#   • U  H  u  pUTR                   ;   d  M  Uv •  M     g 7fr   )r%   )r   ÚkÚvrg   s      €r   r   rã     s   øé € ÐLª?¡4 1¸aÀ4Ç8Á8¹mŸQ™Qª?ùs   ƒ&�	&)rU   r%   r   r   r   r   r/   rŠ   Úanyr$   r“   r&   r'   Úextendr£   rQ   )rª   rg   r   Úall_tr   Út_rulesrÒ   Únew_rhss    `      r   Ú_termrì   	  s1  ø€ àŸ7š7ÔIš7�4¯H­H q¼
À1Äa×8H�Q©H‰Q™7€EÑIÙTYÓZÒTYÈq”$”r˜(¤S¨£VÑ+Ó,¨q¨c¸!À6ÑJÒJÑTY€GÐZØ€IØ—”ˆÜˆt�x‰x‹=˜1Ó¤Ñ$H¸t¿xºxÓ$H×!HÑ!HØJNÏ(Ê(ÓSÊ(ÀQ¬°A´q×)9Ñ)9�w‘z—~’~¸qÒ@É(ˆGÐSØ×ÑœT $§(¡(¨G¸D¿K¹KÈtÏzÉzÑZÔ[Ø×ÑÔL¨7¯=©=¬?ÓLÖLà×Ñ˜TÖ"ñ ô �9ÓÐùó JùÚZùò Ts   ‘(F
½
F
Á,FÃ/Fc                 ó¶   • / nU R                    H=  n[        UR                  5      S:”  a  U[        U5      -  nM,  UR	                  U5        M?     [        U5      $ )z.Applies the BIN rule to 'g' (see top comment).r   )rU   rŠ   r%   rß   r“   rQ   )rª   rÒ   rg   s      r   Ú_binrî     sN   € à€IØ—”ˆÜˆt�x‰x‹=˜1ÓØœ ›Ñ%ŠIà×Ñ˜TÖ"ñ	 ô
 �9ÓÐr   c                 óh   • [        U 5      nU(       a  [        X5      n [        U 5      nU(       a  M  U $ )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   • [        [        [        U 5      5      5      n [        U 5      $ )z>Creates a CNF grammar from a general context-free grammar 'g'.)rñ   rî   rì   r¸   )rª   s    r   ru   ru   ,  s   € äŒd”5˜“8‹nÓ€AÜ�a‹=Ðr   c                 ó
  • U(       d  [        [        XXES9X4S9$ XBS   R                  -
  n[        [        XS   R                  /XES9[	        US   R                  UUSS  UUS   R                  US   R
                  5      /US9$ )Nr|   rž   r   rˆ   )rd   r   r&   r$   Úunroll_unit_skipruler'   )r$   Úorig_rhsrÇ   rh   r&   r'   s         r   rô   rô   2  s›   € ÞÜœ˜S°6ÑGÈÑaÐaà¨Ñ*×1Ñ1Ñ1ˆÜÜ� QÑ'×+Ñ+Ð,°VÑIÜ$ ]°1Ñ%5×%9Ñ%9¸8Ø -¨a¨bÐ 1°8Ø -¨aÑ 0× 7Ñ 7¸ÀqÑ9I×9OÑ9OóQðLð ñð 	r   c                 ó"  • [        U [        5      (       a  U $ U R                  R                  R                  R                  S5      (       a  U R                  S   $ / n[        [        U R                  5       Hm  n[        U[        5      (       aD  UR                  R                  R                  R                  S5      (       a  XR                  -  nM\  UR                  U5        Mo     [        U R                  [        5      (       at  [        U R                  R                  U R                  R                  U R                  R                  UU R                  R                  U R                  R                   5      $ [        U R                  U5      $ )zDReverts a parse tree (RuleNode) to its original non-CNF form (Node).Ú__T_r   Ú__SP_)r   r   rg   r$   r   Ú
startswithrh   ÚmaprŒ   rd   r“   rÄ   rô   r%   rÇ   r&   r'   )r›   rh   r–   s      r   rŒ   rŒ   ?  s  € ä�$œ×ÑØˆà‡y�y‡}�}×Ñ×$Ñ$ V×,Ñ,Ø�}‰}˜QÑÐàˆÜœ T§]¡]Ö3ˆEä˜%¤×*Ñ*¨u¯z©z¯~©~×/BÑ/B×/MÑ/MÈg×/VÑ/VØŸ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   rn   )#rL   Úcollectionsr   r¦   Ú
exceptionsr   Úlexerr   Útreer   rv   r   r   r	   r   r
   r   r   rQ   rd   rp   rš   r‰   r¸   rÄ   rÎ   rÐ   rÕ   rß   rì   rî   rñ   ru   rô   rŒ   rE   r   r   Ú<module>rÿ      s¤   ðÙ *õ $Û å #Ý Ý ß >Ñ >ò÷
#ñ #÷8ñ ÷"	fñ 	f÷*ñ *ôZ0ò"÷f"ñ "ô>
�4ô 
ò[òòò\òòòòò
ó1r   