Ë
    çÍ:ju  ã                   óþ   — d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
mZmZ ddlmZmZ ddl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  G d„ d	e«      Zd
Z G d„ d«      Z G d„ d«      Z d„ Z!d„ Z"d„ Z#e$dk(  r e"«        yy)z
Visualization tools for CFGs.
é    N)
ÚButtonÚCanvasÚEntryÚFrameÚIntVarÚLabelÚ	ScrollbarÚTextÚTkÚToplevel)ÚTreeSegmentWidgetÚtree_to_treesegment)ÚCanvasFrameÚColorizedListÚShowTextÚSymbolWidgetÚ
TextWidget)ÚCFGÚNonterminalÚ_read_cfg_productionÚnonterminals)ÚTreec                   ó6   — e Zd Zej                  d   Zd„ Zd„ Zy)ÚProductionListÚ
rightarrowc                 óz   — |j                  dd¬«       |j                  ddd¬«       |j                  dd	d
¬«       y )NÚterminalú#006000©Ú
foregroundÚarrowÚsymbolÚ0)ÚfontÚ	underlineÚnonterminalÚblue©Ú	helveticaiôÿÿÿÚbold©r    r$   ©Ú
tag_config)ÚselfÚ
textwidgetÚoptionss      úb/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/nltk/draw/cfg.pyÚ_init_colortagszProductionList._init_colortagsR   sE   € Ø×Ñ˜j°YÐÔ?Ø×Ñ˜g¨HÀÐÔDØ×ÑØ fÐ3Mð 	õ 	
ó    c                 óL  — g }|j                  d|j                  «       z  df«       |j                  | j                  df«       |j                  «       D ]M  }t	        |t
        «      r%|j                  d|j                  «       z  df«       Œ8|j                  d|z  df«       ŒO |S )Nz%s	r&   r!   ú %sú %rr   )ÚappendÚlhsÚARROWÚrhsÚ
isinstancer   r"   )r.   ÚitemÚcontentsÚelts       r1   Ú
_item_reprzProductionList._item_reprY   s�   € ØˆØ�‰˜ $§(¡(£*Ñ,¨mÐ<Ô=Ø�‰˜Ÿ™ WÐ-Ô.Ø—8‘8“:ò 	;ˆCÜ˜#œ{Ô+Ø—‘ ¨¯©«Ñ!5°}Ð EÕFà—‘ ¨¡¨jÐ 9Õ:ð		;ð
 ˆr3   N)Ú__name__Ú
__module__Ú__qualname__r   ÚSYMBOLSr9   r2   r?   © r3   r1   r   r   O   s   „ Ø× Ñ  Ñ.€Eò
ó	r3   r   aM  

The CFG Editor can be used to create or modify context free grammars.
A context free grammar consists of a start symbol and a list of
productions.  The start symbol is specified by the text entry field in
the upper right hand corner of the editor; and the list of productions
are specified in the main text editing box.

Every non-blank line specifies a single production.  Each production
has the form "LHS -> RHS," where LHS is a single nonterminal, and RHS
is a list of nonterminals and terminals.

Nonterminals must be a single word, such as S or NP or NP_subj.
Currently, nonterminals must consists of alphanumeric characters and
underscores (_).  Nonterminals are colored blue.  If you place the
mouse over any nonterminal, then all occurrences of that nonterminal
will be highlighted.

Terminals must be surrounded by single quotes (') or double
quotes(").  For example, "dog" and "New York" are terminals.
Currently, the string within the quotes must consist of alphanumeric
characters, underscores, and spaces.

To enter a new production, go to a blank line, and type a nonterminal,
followed by an arrow (->), followed by a sequence of terminals and
nonterminals.  Note that "->" (dash + greater-than) is automatically
converted to an arrow symbol.  When you move your cursor to a
different line, your production will automatically be colorized.  If
there are any errors, they will be highlighted in red.

Note that the order of the productions is significant for some
algorithms.  To re-order the productions, use cut and paste to move
them.

Use the buttons at the bottom of the window when you are done editing
the CFG:
  - Ok: apply the new CFG, and exit the editor.
  - Apply: apply the new CFG, and do not exit the editor.
  - Reset: revert to the original CFG, and do not exit the editor.
  - Cancel: revert to the original CFG, and exit the editor.

c                   ót  — e Zd ZdZej
                  d   Z ej                  dez   dz   «      Z	 ej                  dez   dz   «      Z
 ej                  dez   dz   dz   «      Z ej                  dez   d	z   «      Zd
Zd d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd!d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!y)"Ú	CFGEditora*  
    A dialog window for creating and editing context free grammars.
    ``CFGEditor`` imposes the following restrictions:

    - All nonterminals must be strings consisting of word
      characters.
    - All terminals must be strings consisting of word characters
      and space characters.
    r   z(^\s*\w+\s*)(->|(z))z\s*(->|(z))\s*z#((\w+|'[\w ]*'|\"[\w ]*\"|\|)\s*)*$z\w+|->|'[\w ]+'|"[\w ]+"|(ú)r(   Nc                 óþ  — || _         |�|| _        nt        t        d«      g «      | _        || _        d| _        t        |«      | _        | j                  «        | j                  «        | j                  j                  ddd¬«       | j                  «        | j                  j                  ddd¬«       | j                  «        | j                  j                  ddd¬«       | j                   j#                  «        y )	NÚSé   ÚtopÚxr   ©ÚsideÚfillÚexpandÚbothÚbottom)Ú_parentÚ_cfgr   r   Ú_set_cfg_callbackÚ _highlight_matching_nonterminalsr   Ú_topÚ_init_bindingsÚ_init_startframeÚ_startframeÚpackÚ_init_prodframeÚ
_prodframeÚ_init_buttonsÚ_buttonframeÚ_textwidgetÚfocus)r.   ÚparentÚcfgÚset_cfg_callbacks       r1   Ú__init__zCFGEditor.__init__¯   s×   € ØˆŒØˆ?ØˆD�IäœK¨Ó,¨bÓ1ˆDŒIØ!1ˆÔà01ˆÔ-ô ˜VÓ$ˆŒ	Ø×ÑÔà×ÑÔØ×Ñ×Ñ 5¨s¸1ÐÔ=Ø×ÑÔØ�‰×Ñ %¨f¸QÐÔ?Ø×ÑÔØ×Ñ×Ñ H°3¸qÐÔAà×Ñ×ÑÕ r3   c                 óŒ  — t        | j                  «      x}| _        t        |«      | _        | j                  j                  d¬«       t        |d¬«      j                  d¬«       t        |d¬«      j                  d¬«       | j                  j                  d| j                  j                  «       j                  «       «       y )NÚright©rN   zStart Symbol:©ÚtextzProductions:Úleftr   )r   rW   rZ   r   Ú_startr[   r   ÚinsertrT   Ústartr"   ©r.   Úframes     r1   rY   zCFGEditor._init_startframeÆ   s�   € Ü#(¨¯©Ó#3Ð3ˆ�Ô Ü˜E“lˆŒØ�‰×Ñ˜gÐÔ&Üˆe˜/Ô*×/Ñ/°WÐ/Ô=Üˆe˜.Ô)×.Ñ.°FÐ.Ô;Ø�‰×Ñ˜1˜dŸi™iŸo™oÓ/×6Ñ6Ó8Õ9r3   c                 óà  — t        | j                  «      x}| _        t        |d| j                  dd¬«      j                  d¬«       t        |d| j                  dd¬«      j                  d¬«       t        |d| j                  dd¬«      j                  d¬«       t        |d| j                  dd¬«      j                  d¬«       t        |d	| j                  dd¬«      j                  d
¬«       y )NÚOkr   )rj   Úcommandr%   Ú	takefocusrk   rh   ÚApplyÚResetÚCancelÚHelprg   )
r   rW   r_   r   Ú_okr[   Ú_applyÚ_resetÚ_cancelÚ_helpro   s     r1   r^   zCFGEditor._init_buttonsÎ   sã   € Ü$)¨$¯)©)Ó$4Ð4ˆ�Ô!Üˆu˜4¨¯©¸QÈ!ÔL×QÑQØð 	Rô 	
ô 	ˆu˜7¨D¯K©KÀ1ÐPQÔR×WÑWØð 	Xô 	
ô 	ˆu˜7¨D¯K©KÀ1ÐPQÔR×WÑWØð 	Xô 	
ô 	Ø˜¨$¯,©,À!Èqô	
ç
‰$�Fˆ$Ô
Üˆu˜6¨4¯:©:ÀÈaÔP×UÑUØð 	Võ 	
r3   c                 ó®  — | j                   j                  d«       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d	| j                  «       | j                   j                  d
| j
                  «       | j                   j                  d| j
                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       | j                   j                  d| j                  «       y )Nz
CFG Editorú<Control-q>z<Alt-q>z<Control-d>z<Alt-x>z<Escape>z<Alt-c>z<Control-o>z<Alt-o>z<Control-a>z<Alt-a>z<Control-r>z<Alt-r>z<Control-h>z<Alt-h>z<F1>)rW   ÚtitleÚbindr|   ry   rz   r{   r}   )r.   s    r1   rX   zCFGEditor._init_bindingsà   s\  € Ø�	‰	�‰˜Ô%Ø�	‰	�‰�} d§l¡lÔ3Ø�	‰	�‰�y $§,¡,Ô/Ø�	‰	�‰�} d§l¡lÔ3à�	‰	�‰�y $§,¡,Ô/Ø�	‰	�‰�z 4§<¡<Ô0à�	‰	�‰�y $§,¡,Ô/à�	‰	�‰�} d§h¡hÔ/Ø�	‰	�‰�y $§(¡(Ô+Ø�	‰	�‰�} d§k¡kÔ2Ø�	‰	�‰�y $§+¡+Ô.Ø�	‰	�‰�} d§k¡kÔ2Ø�	‰	�‰�y $§+¡+Ô.Ø�	‰	�‰�} d§j¡jÔ1Ø�	‰	�‰�y $§*¡*Ô-Ø�	‰	�‰�v˜tŸz™zÕ*r3   c                 óè  — t        | j                  «      | _        t        | j                  dd¬«      | _        t        | j                  dd¬«      | _        | j                  j                  | j                  j                  ¬«       | j                  j                  | j                  j                  ¬«       | j                  j                  d	d
¬«       | j                  j                  ddd¬«       | j                  j                  dd¬«       | j                  j                  dd¬«       | j                  j                  dd¬«       d| _        | j                  j                  d| j                  «       | j                  j                  d| j                  «       | j                  j                  d| j                   «       | j                  j                  d| j                   «       | j                  fd„}| j                  j                  d|«       | j"                  j%                  «       D �cg c]#  }|j'                  «       |j)                  «       gf‘Œ% }}t+        t-        |«      dz
  dd«      D ]x  }||   d   ||dz
     d   k(  sŒd||   d   v rŒ#d||dz
     d   v rŒ1t/        ||dz
     d   «       t/        ||   d   «       ||dz
     d   j1                  ||   d   «       ||= Œz |D ]n  \  }}t/        ||«       d |z  }|D ]/  }|D ]#  }	t3        |	t4        «      r	|d!|	z  z  }Œ|d"|	z  z  }Œ% |d#z  }Œ1 |d d$ d%z   }| j                  j7                  d&|«       Œp | j                  «        y c c}w )'Nz#e0e0e0rJ   )Ú
backgroundÚexportselectionr   Úvertical)rt   Úorient)Úyscrollcommand)rs   rg   Úy©rN   rO   rQ   rk   )rP   rO   rN   r   r   r   r!   r"   )r$   ÚerrorÚred©rƒ   ú>z	<<Paste>>z
<KeyPress>z<ButtonPress>c                 ó@   — |j                  «       j                  «        y ©N)Útk_focusNextra   )Úer/   s     r1   Úcyclez(CFGEditor._init_prodframe.<locals>.cycle  s   € Ø×#Ñ#Ó%×+Ñ+Õ-r3   z<Tab>éÿÿÿÿrD   z%s ->r5   r6   z |éþÿÿÿú
Úend)r   rW   r]   r
   r`   r	   Ú_textscrollÚconfigÚsetÚyviewr[   r-   Ú_linenumr�   Ú_replace_arrowsÚ_analyzeÚ_check_analyzerT   Úproductionsr8   r:   ÚrangeÚlenÚprintÚextendr;   r   rm   )
r.   r’   ÚpÚprod_tuplesÚir8   ÚrhssÚsr:   r>   s
             r1   r\   zCFGEditor._init_prodframeõ   s@  € Ü §	¡	Ó*ˆŒô  Ø�O‰O¨	À1ô
ˆÔô % T§_¡_ÀÈ*ÔUˆÔØ×Ñ×Ñ¨t×/?Ñ/?×/CÑ/CÐÔDØ×Ñ×Ñ¨×(8Ñ(8×(>Ñ(>ÐÔ?Ø×Ñ×Ñ 7°ÐÔ5Ø×Ñ×Ñ Q¨V¸&ÐÔAð 	×Ñ×#Ñ# J¸9Ð#ÔEØ×Ñ×#Ñ# G°(Ð#Ô;Ø×Ñ×#Ñ# G¸Ð#Ô>ð ˆŒð 	�	‰	�‰�s˜D×0Ñ0Ô1ð 	�	‰	�‰�{ D§M¡MÔ2Ø�	‰	�‰�| T×%8Ñ%8Ô9Ø�	‰	�‰�¨×(;Ñ(;Ô<ð !%× 0Ñ 0ó 	.ð 	×Ñ×Ñ˜g uÔ-à59·Y±Y×5JÑ5JÓ5LÖM°˜Ÿ™› !§%¡%£' Ò+ÐMˆÐMÜ”s˜;Ó'¨!Ñ+¨Q°Ó3ò 		#ˆAØ˜1‰~˜aÑ  K°°A±Ñ$6°qÑ$9Ó9Ø˜ Q™¨Ñ*Ñ*ØØ˜ Q¨¡UÑ+¨AÑ.Ñ.ØÜ�k ! a¡%Ñ(¨Ñ+Ô,Ü�k !‘n QÑ'Ô(Ø˜A ™EÑ" 1Ñ%×,Ñ,¨[¸©^¸AÑ->Ô?Ø ‘Nð		#ð %ò 	.‰IˆC�Ü�#�tÔØ˜#‘ˆAØò �Øò )�CÜ! #¤{Ô3Ø˜U S™[Ñ(™à˜U S™[Ñ(™ð	)ð
 �T‘	‘ðð �#�2�˜‘ˆAØ×Ñ×#Ñ# E¨1Õ-ð	.ð 	�‰�ùò3 Ns   È-(M/c                 óš   — d|z  }d|z  }| j                   j                  «       D ]$  }|dvsŒ| j                   j                  |||«       Œ& y)z‘
        Remove all tags (except ``arrow`` and ``sel``) from the given
        line of the text widget used for editing the productions.
        ú%d.0ú%d.end)r!   ÚselN)r`   Ú	tag_namesÚ
tag_remove)r.   Úlinenumrn   r–   Útags        r1   Ú_clear_tagszCFGEditor._clear_tagsN  sW   € ð
 ˜Ñ ˆØ˜Ñ ˆØ×#Ñ#×-Ñ-Ó/ò 	=ˆCØÐ*Ò*Ø× Ñ ×+Ñ+¨C°¸Õ<ñ	=r3   c                 óö   — t        | j                  j                  d«      j                  d«      d   «      }|| j                  k7  r4| j                  |«       | j                  | j                  «       || _        yy)z·
        Check if we've moved to a new line.  If we have, then remove
        all colorization from the line we moved to, and re-colorize
        the line that we moved from.
        rm   ú.r   N)Úintr`   ÚindexÚsplitr›   r±   Ú_analyze_line)r.   r‘   r¯   s      r1   rž   zCFGEditor._check_analyzeY  sg   € ô �d×&Ñ&×,Ñ,¨XÓ6×<Ñ<¸SÓAÀ!ÑDÓEˆØ�d—m‘mÒ#Ø×Ñ˜WÔ%Ø×Ñ˜tŸ}™}Ô-Ø#ˆD�Mð $r3   c                 ó¼  — d}	 | j                   j                  d|d«      }|dk(  rnc| j                   j                  ||dz   «       | j                   j                  || j                  d«       | j                   j                  |d«       Œ†d}	 | j                   j                  | j                  |dz   d«      }|dk(  ry	| j                   j                  d||dz   «       ŒQ)
zÃ
        Replace any ``'->'`` text strings with arrows (char \256, in
        symbol font).  This searches the whole buffer, but is fast
        enough to be done anytime they press '>'.
        ú1.0ú->z	end+1charÚ z+2charr!   ú	z+1charN)r`   ÚsearchÚdeleterm   r9   Útag_add)r.   r‘   r!   s      r1   rœ   zCFGEditor._replace_arrowse  sÛ   € ð ˆØØ×$Ñ$×+Ñ+¨D°%¸ÓEˆEØ˜Š{ØØ×Ñ×#Ñ# E¨5°8Ñ+;Ô<Ø×Ñ×#Ñ# E¨4¯:©:°wÔ?Ø×Ñ×#Ñ# E¨4Ô0ð ð ˆØØ×$Ñ$×+Ñ+¨D¯J©J¸ÀÑ8HÈ+ÓVˆEØ˜Š{ØØ×Ñ×$Ñ$ W¨e°U¸XÑ5EÔFð	 r3   c                 ó„  — |j                  «       d   dv rd}na|j                  «       d| j                  fv rd}n@d|j                  «       z   }|| j                  j                  «       vr| j	                  |«       d||j                  «       fz  }d||j                  «       fz  }| j                  j                  |||«       y)	zí
        Given a line number and a regexp match for a token on that
        line, colorize the token.  Note that the regexp match gives us
        the token's text, start index (on the line), and end index (on
        the line).
        r   z'"r   rº   r!   Únonterminal_ú%d.%dN)Úgroupr9   r`   r­   Ú_init_nonterminal_tagrn   r–   r¿   )r.   Úmatchr¯   r°   rn   r–   s         r1   Ú_analyze_tokenzCFGEditor._analyze_token{  s±   € ð �;‰;‹=˜Ñ˜uÑ$Ø‰CØ�[‰[‹]˜t T§Z¡ZÐ0Ñ0Ø‰Cð
 ! 5§;¡;£=Ñ0ˆCØ˜$×*Ñ*×4Ñ4Ó6Ñ6Ø×*Ñ*¨3Ô/à˜7 E§K¡K£MÐ2Ñ2ˆØ˜ %§)¡)£+Ð.Ñ.ˆØ×Ñ× Ñ   e¨SÕ1r3   c                 ó*  — | j                   j                  ||t        j                  ¬«       | j                  sy | j                   |fd„}| j                   |fd„}| j                   j                  |d|«       | j                   j                  |d|«       y )Nr+   c                 ó*   — |j                  |d¬«       y )Nz#80ff80rŒ   r,   ©r‘   r/   r°   s      r1   Úenterz.CFGEditor._init_nonterminal_tag.<locals>.enter˜  s   € Ø×!Ñ! #°)Ð!Õ<r3   c                 ó*   — |j                  |d¬«       y )Nr»   rŒ   r,   rÉ   s      r1   Úleavez.CFGEditor._init_nonterminal_tag.<locals>.leave›  s   € Ø×!Ñ! #°"Ð!Õ5r3   z<Enter>z<Leave>)r`   r-   rF   Ú_BOLDrV   Útag_bind)r.   r°   r    rÊ   rÌ   s        r1   rÄ   zCFGEditor._init_nonterminal_tag“  s�   € Ø×Ñ×#Ñ# C°JÄYÇ_Á_Ð#ÔUØ×4Ò4Øà $× 0Ñ 0°có 	=ð !%× 0Ñ 0°có 	6ð 	×Ñ×!Ñ! # y°%Ô8Ø×Ñ×!Ñ! # y°%Õ8r3   c                 óf  — | j                  |«       | j                  j                  t        |«      dz   t        |«      dz   «      }t        j
                  j                  |«      r'| |fd„}t        j                  j                  ||«       y|j                  «       dk7  r| j                  ||«       yy)z(
        Colorize a given line.
        z.0z.endc                 ó(   — |j                  | |«       y)Nr»   )rÆ   )rÅ   r.   r¯   s      r1   Úanalyze_tokenz.CFGEditor._analyze_line.<locals>.analyze_token¯  s   € Ø×#Ñ# E¨7Ô3Ør3   r»   N)r±   r`   ÚgetÚreprrF   Ú_PRODUCTION_RErÅ   Ú	_TOKEN_REÚsubÚstripÚ_mark_error)r.   r¯   ÚlinerÑ   s       r1   r·   zCFGEditor._analyze_line¡  s›   € ð
 	×Ñ˜Ô!ð ×Ñ×#Ñ#¤D¨£M°DÑ$8¼$¸w»-È&Ñ:PÓQˆô ×#Ñ#×)Ñ)¨$Ô/ð +/¸ó ô ×Ñ×#Ñ# M°4Õ8Ø�Z‰Z‹\˜RÒà×Ñ˜W dÕ+ð  r3   c                 óŒ  — t         j                  j                  |«      }|sd|z  }d|z  }nTt         j                  j	                  |«      sd|z  }d||j                  «       fz  }nd||j                  «       fz  }d|z  }| j                  j                  |d|«      r
d|z  }d|z  }| j                  j                  d||«       y)z:
        Mark the location of an error in a line.
        rª   r«   rÂ   z==rŠ   N)
rF   Ú	_ARROW_REr½   Ú_LHS_RErÅ   rn   r–   r`   Úcomparer¿   )r.   r¯   rÙ   Ú
arrowmatchrn   r–   s         r1   rØ   zCFGEditor._mark_error¸  sÏ   € ô ×(Ñ(×/Ñ/°Ó5ˆ
Ùà˜WÑ$ˆEØ˜WÑ$‰CÜ×"Ñ"×(Ñ(¨Ô.à˜WÑ$ˆEØ˜W j×&6Ñ&6Ó&8Ð9Ñ9‰Cð ˜w¨
¯©Ó(8Ð9Ñ9ˆEØ˜WÑ$ˆCð ×Ñ×#Ñ# E¨4°Ô5Ø˜WÑ$ˆEØ˜WÑ$ˆCØ×Ñ× Ñ  ¨%°Õ5r3   c                 óÚ   — | j                  «        t        | j                  j                  d«      j	                  d«      d   «      }t        d|dz   «      D ]  }| j                  |«       Œ y)zM
        Replace ``->`` with arrows, and colorize the entire buffer.
        r–   r³   r   rJ   N)rœ   r´   r`   rµ   r¶   r    r·   )r.   r‘   Únumlinesr¯   s       r1   r�   zCFGEditor._analyzeÐ  sc   € ð 	×ÑÔÜ�t×'Ñ'×-Ñ-¨eÓ4×:Ñ:¸3Ó?ÀÑBÓCˆÜ˜Q ¨1¡Ó-ò 	(ˆGØ×Ñ˜wÕ'ñ	(r3   c                 ó*  — g }| j                   j                  dd«      }t        j                  | j                  d|«      }t        j                  dd|«      }|j                  d«      }|D ]&  }|j                  «       }|dk(  rŒ|t        |«      z  }Œ( |S )zo
        Parse the current contents of the textwidget buffer, to create
        a list of productions.
        r¹   r–   rº   r¼   ú r•   r»   )r`   rÒ   ÚrerÖ   r9   r¶   r×   r   )r.   rŸ   rj   ÚlinesrÙ   s        r1   Ú_parse_productionszCFGEditor._parse_productionsÙ  s—   € ð
 ˆð ×Ñ×#Ñ# E¨5Ó1ˆÜ�v‰v�d—j‘j $¨Ó-ˆÜ�v‰v�d˜C Ó&ˆØ—
‘
˜4Ó ˆð ò 	6ˆDØ—:‘:“<ˆDØ�rŠzØØÔ/°Ó5Ñ5‰Kð		6ð* Ðr3   c                 ó`   — | j                   €y | j                   j                  «        d | _         y r�   ©rW   Údestroy©r.   r‘   s     r1   Ú_destroyzCFGEditor._destroyþ  s&   € Ø�9‰9ÐØØ�	‰	×ÑÔØˆ�	r3   c                 óD   — | j                  «        | j                  «        y r�   )rz   rê   ré   s     r1   ry   zCFGEditor._ok  s   € Ø�‰ŒØ�‰�r3   c                 ó¾   — | j                  «       }t        | j                  j                  «       «      }t	        ||«      }| j
                  �| j                  |«       y y r�   )rå   r   rl   rÒ   r   rU   )r.   r‘   rŸ   rn   rc   s        r1   rz   zCFGEditor._apply  sP   € Ø×-Ñ-Ó/ˆÜ˜DŸK™KŸO™OÓ-Ó.ˆÜ�%˜Ó%ˆØ×!Ñ!Ð-Ø×"Ñ" 3Õ'ð .r3   c                 ó(  — | j                   j                  dd«       | j                  j                  «       D ]!  }| j                   j	                  dd|z  «       Œ# | j                  «        | j                  �| j                  | j                  «       y y )Nr¹   r–   z%s
)r`   r¾   rT   rŸ   rm   r�   rU   )r.   r‘   Ú
productions      r1   r{   zCFGEditor._reset  s}   € Ø×Ñ×Ñ  uÔ-ØŸ)™)×/Ñ/Ó1ò 	@ˆJØ×Ñ×#Ñ# E¨6°JÑ+>Õ?ð	@à�‰ŒØ×!Ñ!Ð-Ø×"Ñ" 4§9¡9Õ-ð .r3   c                 ód   — 	 | j                  «        | j                  «        y # t        $ r Y Œw xY wr�   )r{   Ú	Exceptionrê   ré   s     r1   r|   zCFGEditor._cancel  s/   € ð	Ø�K‰KŒMð 	�‰�øô ò 	Ùð	ús   ‚# £	/®/c                 óÒ   — 	 t        | j                  dt        j                  «       dd¬«       y # t        $ r. t        | j                  dt        j                  «       d¬«       Y y w xY w)NzHelp: Chart Parser DemoéK   Úfixed)Úwidthr$   ©rô   )r   rS   Ú_CFGEditor_HELPr×   rð   ré   s     r1   r}   zCFGEditor._help  s]   € ð	ÜØ—‘Ø)Ü ×'Ñ'Ó)ØØöøô ò 	ÜØ—‘Ø)Ü ×'Ñ'Ó)Ø÷	ð	ús   ‚,/ ¯4A&Á%A&)NN)r'   )"r@   rA   rB   Ú__doc__r   rC   r9   rã   ÚcompilerÜ   rÛ   rÔ   rÕ   rÍ   re   rY   r^   rX   r\   r±   rž   rœ   rÆ   rÄ   r·   rØ   r�   rå   rê   ry   rz   r{   r|   r}   rD   r3   r1   rF   rF   •   s  „ ñð × Ñ  Ñ.€EØˆb�j‰jÐ-°Ñ5¸Ñ<Ó=€GØ�—
‘
˜;¨Ñ.°Ñ9Ó:€IØ�R—Z‘Zð	à
ñ	ð ñ	ð 1ñ		1ó€Nð �—
‘
Ð<¸uÑDÀsÑJÓK€IØ&€Eó!ò.:ò
ò$+ò*>òr	=ò
$òGò,2ó09ò,ò.6ò0(ò#òJòò(ò.òór3   rF   c                   ó\   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zdd„Zd„ Zd„ Zd„ Zy
)ÚCFGDemoc                 óL  — || _         || _        t        «       | _        | j                  j	                  d«       t        | j                  «      | _        | j                  j                  d«       | j                  | j                  «       t        | j                  «      }|j                  ddd¬«       | j                  | j                  «       | j                  | j                  «       | j                  |«       | j                  |«       | j                  | j                  «       y )NzContext Free Grammar Demoé   rk   rˆ   r   rM   )Ú_grammarÚ_textr   rW   r€   r   Ú_sizer™   rX   r   r[   Ú_init_menubarr^   Ú_init_grammarÚ_init_treeletÚ_init_workspace)r.   Úgrammarrj   Úframe1s       r1   re   zCFGDemo.__init__7  sÖ   € ØˆŒØˆŒ
ô “DˆŒ	Ø�	‰	�‰Ð3Ô4ô ˜DŸI™IÓ&ˆŒ
Ø�
‰
�‰�rÔð 	×Ñ˜DŸI™IÔ&ô �t—y‘yÓ!ˆØ�‰˜ c°!ˆÔ4Ø×Ñ˜4Ÿ9™9Ô%Ø×Ñ˜4Ÿ9™9Ô%Ø×Ñ˜6Ô"Ø×Ñ˜6Ô"Ø×Ñ˜TŸY™YÕ'r3   c                 ó<   — |j                  d| j                  «       y )Nr   )r�   rè   )r.   rK   s     r1   rX   zCFGDemo._init_bindingsS  s   € Ø�‰� §¡Õ-r3   c                  ó   — y r�   rD   ©r.   rb   s     r1   r   zCFGDemo._init_menubarV  ó   € Ør3   c                  ó   — y r�   rD   r  s     r1   r^   zCFGDemo._init_buttonsY  r	  r3   c                 óF  — t        || j                  d¬«      | _        | j                  j                  ddd¬«       | j                  j	                  «        | j                  j                  d| j                  «       | j                  j                  d| j                  «       y )	Né   rõ   rK   rQ   rJ   rM   ÚselectÚmove)r   rý   Ú	_prodlistr[   ra   Úadd_callbackÚ_selectprod_cbr  s     r1   r  zCFGDemo._init_grammar\  ss   € Ü'¨°·±ÀRÔHˆŒØ�‰×Ñ ¨V¸AÐÔ>Ø�‰×ÑÔØ�‰×#Ñ# H¨d×.AÑ.AÔBØ�‰×#Ñ# F¨D×,?Ñ,?Õ@r3   c                 óp   — t        |d¬«      | _        | j                  j                  dd¬«       d | _        y )NÚwhiterŒ   rR   rL   r‰   )r   Ú_treelet_canvasr[   Ú_treeletr  s     r1   r  zCFGDemo._init_treeletc  s1   € Ü% f¸ÔAˆÔØ×Ñ×!Ñ! x°cÐ!Ô:Øˆ�r3   c                 ó’   — t        |d¬«      | _        | j                  j                  ddd¬«       d | _        | j	                  «        y )Nr  rŒ   rg   rQ   rJ   rM   )r   Ú
_workspacer[   Ú_treeÚreset_workspacer  s     r1   r  zCFGDemo._init_workspaceh  s<   € Ü% f¸ÔAˆŒØ�‰×Ñ '°¸qÐÔAØˆŒ
Ø×ÑÕr3   c           	      óv  — | j                   j                  «       }t        | j                  j	                  «       «      }d|dz    df}d|dz    f}| j
                  �%| j                   j                  | j
                  «       | j                  j                  «       j                  «       }t        |||d¬«      }g }| j                  D ]   }|j                  t        |||d¬«      «       Œ" t        |||d¬«      | _        | j                   j                  | j
                  «       |D ]  }	|	j                  d	d
«       Œ y )Nr)   é   r*   é   rJ   )r$   Ú	draggabler  )Úcolorr   éd   )r  Úcanvasr´   rÿ   rÒ   r  Úremove_widgetrý   rn   r"   r   rþ   r7   r   Ú
add_widgetr  )
r.   ÚcÚfontsizeÚ	node_fontÚ	leaf_fontrn   ÚrootnodeÚleavesÚwordÚleafs
             r1   r  zCFGDemo.reset_workspacer  s  € Ø�O‰O×"Ñ"Ó$ˆÜ�t—z‘z—~‘~Ó'Ó(ˆØ  H¨q¡L /°6Ð:ˆ	Ø  H¨q¡L /Ð2ˆ	ð �:‰:Ð!Ø�O‰O×)Ñ)¨$¯*©*Ô5ð —‘×#Ñ#Ó%×,Ñ,Ó.ˆÜ˜a ¨YÀ!ÔDˆð ˆØ—J‘Jò 	LˆDØ�M‰Mœ* Q¨°9ÈÔJÕKð	Lô ' q¨(°FÀ'ÔJˆŒ
ð 	�‰×"Ñ" 4§:¡:Ô.ð ò 	ˆDØ�I‰I�a˜Õñ	r3   c                  ó   — y r�   rD   )r.   rî   s     r1   Úworkspace_markprodzCFGDemo.workspace_markprod’  r	  r3   Nc                 óV  — |€| j                   }t        t        |j                  «       «      t        |j	                  «       «      z
  «      D ]Ü  }|d|f   dk(  r| j
                   t        |j	                  «       «      D ]œ  \  }}|j                  «       ||z      }t        |t        «      r<t        |t        «      r,|j                  |j                  «       j                  «       k(  rŒht        |t        «      r$t        |t        «      r||j                  «       k(  rŒœ ŒÐ t        d|«       ŒÞ y )Nr  r  zMATCH AT)r  r    r¡   Úsubtreesr:   Ú_markproductionÚ	enumerater;   r   r   r"   Úlabelrj   Ústrr   r¢   )r.   ÚprodÚtreer¦   ÚjÚnodeÚwidgets          r1   r/  zCFGDemo._markproduction•  sñ   € Øˆ<Ø—:‘:ˆDÜ”s˜4Ÿ=™=›?Ó+¬c°$·(±(³*«oÑ=Ó>ò 	%ˆAØ�G˜Q�JÑ 7Ò*Ø×$Ò$ä$ T§X¡X£ZÓ0ò %‘��4ØŸ™›¨¨Q©Ñ/�ä˜t¤[Ô1Ü" 6Ô+<Ô=ØŸ™ v§|¡|£~×':Ñ':Ó'<Ò<àä˜t¤SÔ)Ü" 6¬:Ô6Ø §¡£Ò-àáð%ô$ �j !Õ$ñ-	%r3   c                 ó  — | j                   }| j                  j                  |«       | j                  �| j                  j	                  «        |j                  «       }t        |«      D ]!  \  }}t        |t        «      sŒt        |«      }Œ# t        |j                  «       j                  «       g|¢­Ž }t        | j                  j                  «       «      }d|dz    df}d|dz    f}	t        ||||	¬«      | _        d| j                  d<   | j                  j!                  «       \  }
}}}t        |d   «      t        |d	   «      }}| j                  j#                  ||
z
  |z
  dz  ||z
  |z
  dz  «       | j%                  |«       y )
Nr)   r  r*   r  )r%  r&  rJ   r  rô   Úheight)r  r  Ú	highlightr  rè   r:   r0  r;   r   r   r8   r"   r´   rÿ   rÒ   r   Úbboxr  r/  )r.   rî   r   r:   r¦   r>   r4  r$  r%  r&  Úx1Úy1Úx2Úy2ÚwÚhs                   r1   r  zCFGDemo._selectprod_cb´  sg  € Ø×%Ñ%ˆà�‰× Ñ  Ô,Ø�=‰=Ð$Ø�M‰M×!Ñ!Ô#ð �n‰nÓˆÜ “nò 	 ‰FˆAˆsÜ˜#œ{Õ+Ü˜3“i‘ð	 ô �J—N‘NÓ$×+Ñ+Ó-Ð4°Ò4ˆô �t—z‘z—~‘~Ó'Ó(ˆØ  H¨q¡L /°6Ð:ˆ	Ø  H¨q¡L /Ð2ˆ	Ü+Ø�D I¸ô
ˆŒð &'ˆ�‰�kÑ"ð  Ÿ=™=×-Ñ-Ó/ÑˆˆR��RÜ�6˜'‘?Ó#¤S¨°Ñ)9Ó%:ˆ1ˆØ�‰×Ñ˜A ™F R™K¨1Ñ,¨q°2©v¸©{¸aÑ.?Ô@ð 	×Ñ˜ZÕ(r3   c                 ó8   — | j                   j                  «        y r�   rç   )r.   Úargss     r1   rè   zCFGDemo.destroyÓ  s   € Ø�	‰	×ÑÕr3   c                 ó<   —  | j                   j                  |i |¤Ž y r�   )rW   Úmainloop)r.   rC  Úkwargss      r1   rE  zCFGDemo.mainloopÖ  s   € Øˆ�	‰	×Ñ˜DÐ+ FÓ+r3   r�   )r@   rA   rB   re   rX   r   r^   r  r  r  r  r,  r/  r  rè   rE  rD   r3   r1   rú   rú   6  sE   „ ò(ò8.òòòAòò
òò@ó%ò>)ò>ó,r3   rú   c                  óN  ‡— ddl m} mŠm} d}ˆfd„ |j                  «       D «       \	  }}}}}}}	}
} ||||g«       ||||g«       ||||g«       ||||g«       |||
||g«       |||
|g«       ||||g«       ||g «       ||dd|g«       ||dg«       ||dg«       ||d	g«       ||d
g«       ||
dg«       ||dg«       ||dg«       ||dg«       ||dg«       ||dg«       ||dg«      f} | ||«      }dj	                  «       }t        ||«      }|j                  «        y )Nr   )r   r   Ú
ProductionúS VP NP PP P N Name V Detc              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr�   rD   ©Ú.0r¨   r   s     €r1   ú	<genexpr>zdemo2.<locals>.<genexpr>Þ  ó   øè ø€ Ò*X¸a©;°q¯>Ñ*Xùó   ƒÚupÚoverÚIÚtheÚaÚmanÚsawÚinÚwithÚparkÚdogÚstatueÚmyzI saw a man in the park)Únltkr   r   rH  r¶   rú   rE  )r   rH  r   rI   ÚVPÚNPÚPPÚPÚNÚNameÚVÚDetrŸ   r  rj   Údr   s                   @r1   Údemo2rg  Ú  st  ø€ ß1Ñ1à.€LÛ*XÐCUÀ<×CUÑCUÓCWÔ*XÑ'€QˆˆB��A�q˜$  3ñ 	�1�r˜2�hÓÙ�2˜˜Q�xÓ Ù�2˜˜B�xÓ Ù�2˜˜B�xÓ Ù�2˜˜2˜r�{Ó#Ù�2˜˜2�wÓÙ�2˜˜2�wÓÙ�2�rÓÙ�2˜˜f bÐ)Ó*á�2˜�uÓÙ�3˜˜Ó Ù�3˜˜ÓÙ�1�u�gÓÙ�1�u�gÓÙ�1�t�fÓÙ�1�v�hÓÙ�1�v�hÓÙ�1�u�gÓÙ�1�x�jÓ!Ù�3˜˜Óð-€Kñ0 �!�[Ó!€Gà$×*Ñ*Ó,€DÜ�˜Ó€AØ‡J�J…Lr3   c            	      ó\  ‡— ddl m} mŠ d}ˆfd„ |j                  «       D «       \	  }}}}}}}}	}
 | j                  d«      }d„ }t        «       }t        |||«      }t        |d¬«      j                  «        t        |d	|j                  ¬
«      j                  «        |j                  «        y )Nr   )r   r   rI  c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr�   rD   rK  s     €r1   rM  zdemo.<locals>.<genexpr>  rN  rO  a+  
    S -> NP VP
    PP -> P NP
    NP -> Det N
    NP -> NP PP
    VP -> V NP
    VP -> VP PP
    Det -> 'a'
    Det -> 'the'
    Det -> 'my'
    NP -> 'I'
    N -> 'dog'
    N -> 'man'
    N -> 'park'
    N -> 'statue'
    V -> 'saw'
    P -> 'in'
    P -> 'up'
    P -> 'over'
    P -> 'with'
    c                 ó   — t        | «       y r�   )r¢   )r  s    r1   Úcbzdemo.<locals>.cb!  s	   € Üˆg�r3   z
Testing CFG Editor
ri   ÚQuit)rj   rs   )r]  r   r   r¶   Ú
fromstringr   rF   r   r[   r   rè   rE  )r   r   rI   r^  r_  r`  ra  rb  rc  rd  re  r  rk  rK   Úeditorr   s                  @r1   Údemoro    s›   ø€ ß%à.€LÛ*XÐCUÀ<×CUÑCUÓCWÔ*XÑ'€QˆˆB��A�q˜$  3àˆc�n‰nð	ó€Gò0ô ‹$€CÜ�s˜G RÓ(€FÜ	ˆ#Ð,Ô-×2Ñ2Ô4Ü
ˆ3�V S§[¡[Ô1×6Ñ6Ô8Ø‡L�L…Nr3   c                  ó  — ddl m}  t        d«      \	  }}}}}}}}}	 | |||g«       | ||	|g«       | |||g«       | |||g«       | ||||g«       | |||g«       | |||g«       | |g «       | |dd|g«       | |dg«       | |	dg«       | |	dg«       | |d	g«       | |d
g«       | |dg«       | |dg«       | |dg«       | |dg«       | |dg«       | |	dg«      f}
t        «       }|fd„}|j	                  d|«       t        ||
«      }|j                  dd¬«       |j                  d|j                  «       |j                  d|j                  «       |j                  «        |j                  |
d   «       |j                  |
d   «       y )Nr   )rH  z!S, VP, NP, PP, P, N, Name, V, DetrP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  c                 ó$   — |j                  «        y r�   )rè   )r‘   Úts     r1   rè   zdemo3.<locals>.destroyM  s   € Ø	�	‰	�r3   ÚqrJ   rQ   )rP   rO   r  r  r  é   )r]  rH  r   r   r�   r   r[   r  Úmarkonlyra   Úmark)rH  rI   r^  r_  r`  ra  rb  rc  rd  re  rŸ   rr  rè   r¤   s                 r1   Údemo3rw  +  s»  € Ýä*6Ø+ó+Ñ'€QˆˆB��A�q˜$  3ñ 	�1�r˜2�hÓÙ�2˜˜Q�xÓ Ù�2˜˜B�xÓ Ù�2˜˜B�xÓ Ù�2˜˜2˜r�{Ó#Ù�2˜˜2�wÓÙ�2˜˜2�wÓÙ�2�rÓÙ�2˜˜f bÐ)Ó*á�2˜�uÓÙ�3˜˜Ó Ù�3˜˜ÓÙ�1�u�gÓÙ�1�u�gÓÙ�1�t�fÓÙ�1�v�hÓÙ�1�v�hÓÙ�1�u�gÓÙ�1�x�jÓ!Ù�3˜˜Óð-€Kô2 	‹€Aàó ð ‡F�Fˆ3�ÔÜ�q˜+Ó&€AØ‡F�F�!˜&€FÔ!Ø‡N�N�8˜QŸZ™ZÔ(Ø‡N�N�6˜1Ÿ:™:Ô&Ø‡G�G„IØ‡F�Fˆ;�q‰>ÔØ‡F�Fˆ;�q‰>Õr3   Ú__main__)%r÷   rã   Útkinterr   r   r   r   r   r   r	   r
   r   r   Únltk.draw.treer   r   Únltk.draw.utilr   r   r   r   r   Únltk.grammarr   r   r   r   Ú	nltk.treer   r   rö   rF   rú   rg  ro  rw  r@   rD   r3   r1   ú<module>r~     s�   ðñóR 
÷÷ ÷ ÷ B÷õ ÷ NÓ MÝ ô�]ô ð4)€÷XYñ Y÷Ba,ñ a,òH!òR%òP,ð^ ˆzÒÙ…Fð r3   