
    NgzN                    ^   d Z ddl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 ddlmZmZ ddlmZmZmZ ddl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*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3  G d de          Z4 G d d          Z5 G d d          Z6 G d d          Z7 G d d          Z8 G d d          Z9 G d de9e.          Z: G d de9e'          Z; G d de9e&          Z< G d d e9e+          Z= G d! d"          Z>d# Z?e@d$k    r
 e?             d%gZAdS )&a  
A graphical tool for exploring chart parsing.

Chart parsing is a flexible parsing algorithm that uses a data
structure called a "chart" to record hypotheses about syntactic
constituents.  Each hypothesis is represented by a single "edge" on
the chart.  A set of "chart rules" determine when new edges can be
added to the chart.  This set of rules controls the overall behavior
of the parser (e.g. whether it parses top-down or bottom-up).

The chart parsing tool demonstrates the process of parsing a single
sentence, with a given grammar and lexicon.  Its display is divided
into three sections: the bottom section displays the chart; the middle
section displays the sentence; and the top section displays the
partial syntax tree corresponding to the selected edge.  Buttons along
the bottom of the window are used to control the execution of the
algorithm.

The chart parsing tool allows for flexible control of the parsing
algorithm.  At each step of the algorithm, you can select which rule
or strategy you wish to apply.  This allows you to experiment with
mixing different strategies (e.g. top-down and bottom-up).  You can
exercise fine-grained control over the algorithm by selecting which
edge you wish to apply a rule to.
    N)
ButtonCanvasCheckbuttonFrameIntVarLabelMenu	ScrollbarTkToplevel)askopenfilenameasksaveasfilename)Font)	showerrorshowinfo)	CFGEditorTreeSegmentWidgettree_to_treesegment)CanvasFrameColorizedListEntryDialogMutableOptionMenuShowTextSymbolWidget)CFGNonterminal)
BottomUpPredictCombineRuleBottomUpPredictRuleChartLeafEdgeLeafInitRuleSingleEdgeFundamentalRuleSteppingChartParserTopDownInitRuleTopDownPredictRuleTreeEdge)Tree)in_idlec                   4    e Zd Zej        d         Zd Zd ZdS )EdgeList
rightarrowc                     |                     dd           |                     ddd           |                     dd	           |                     d
dd           d S )Nterminalz#006000)
foregroundarrowsymbol0)font	underlinedotz#000000nonterminalblue)	helveticabold)r.   r2   )
tag_config)self
textwidgetoptionss      T/var/www/html/ai-engine/env/lib/python3.11/site-packages/nltk/app/chartparser_app.py_init_colortagszEdgeList._init_colortags^   s~    jY???gHDDDe	:::f3M 	 	
 	
 	
 	
 	
    c                 L   g }|                     d|                                z  df           |                     | j        df           t          |                                          D ]\  }}||                                k    r|                     d           t          |t                    r-|                     d|                                z  df           t|                     d|z  df           |	                                r|                     d           |S )Nz%s	r5   r/   )z *r4   z %sz %rr-   )
appendlhsARROW	enumeraterhsr4   
isinstancer   r0   is_complete)r;   itemcontentsielts        r>   
_item_reprzEdgeList._item_reprf   s   $((**,m<===W-...

++ 	; 	;FAsDHHJJ...#{++ ;!5} EFFFFj 9:::: 	+OOM***r@   N)__name__
__module____qualname__r   SYMBOLSrD   r?   rM    r@   r>   r*   r*   [   s?         .E
 
 
    r@   r*   c                       e 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ddZd Zd Zd Zd Zd Zd ZddZd Zd Zd ZdS )ChartMatrixViewzS
    A view of a chart that displays the contents of the corresponding matrix.
    TChart MatrixFc                 0   || _         g | _        g | _        d | _        |rit	          |          | _        | j                            |           | j                            d| j                   | 	                    | j                   nt          |          | _        |                     | j                   |                     | j                   |r|                     | j                   nd | _        i | _        d| _        |                                  d S )N<Control-q>r   )_chart_cells_marks_selected_cellr   _roottitlebinddestroy
_init_quitr   _init_matrix
_init_list_init_numedges_numedges_label
_callbacks
_num_edgesdraw)r;   parentcharttoplevelr]   show_numedgess         r>   __init__zChartMatrixView.__init__   s     " 	'!&))DJJU###JOOM4<888OODJ''''vDJ$*%%%
### 	(
++++#'D 		r@   c                 d    t          |d| j                  }|                    ddd           d S )NQuittextcommandbottomr   nonesideexpandfill)r   r_   pack)r;   rootquits      r>   r`   zChartMatrixView._init_quit   s6    d>>>		x	77777r@   c                     t          |dd          }|                    ddddd	           t          |d
d
d          | _        | j                            dd           d S )N   sunkenborderreliefr   rs         top)rv   rw   padxpadyru      white)widthheight
background)rv   rw   )r   rx   r   _canvas)r;   ry   cframes      r>   ra   zChartMatrixView._init_matrix   sk    tAh77716FFFfCPPP00000r@   c                 l    t          |d          | _        | j                            ddd           d S )Nz0 edgesrp   r   rs   r   )rv   rw   ru   )r   rd   rx   r;   ry   s     r>   rc   zChartMatrixView._init_numedges   s;    $T	:::!!e!DDDDDr@   c                     t          |g dd          | _        | j                            dddd           | fd	}| j                            d
|           | j                                         d S )N      )r   r   r   r   bothr   )ru   rv   rw   r   c                 2    |                     d|            d S Nselect_fire_callbacks)edger;   s     r>   cbz&ChartMatrixView._init_list.<locals>.cb         400000r@   r   )r*   _listrx   add_callbackfocus)r;   ry   r   s      r>   rb   zChartMatrixView._init_list   s    dBb;;;

U16BBB 	1 	1 	1 	1 	
"---
r@   c                 j    | j         d S 	 | j                                          n#  Y nxY wd | _         d S Nr\   r_   r;   es     r>   r_   zChartMatrixView.destroy   D    :F	J    	D


   % )c                 `    || j         ur$|| _         d| _        |                                  d S d S Nr   )rX   rf   rg   r;   ri   s     r>   	set_chartzChartMatrixView.set_chart   s6    ##DKDOIIKKKKK $#r@   c                 V   | j         d S t          | j                  fdt                    D             }| j        D ]<}||                                         |                                xx         dz  cc<   =t                    D ]}t          |          D ]}||         |         dk    rd}n\d                    t          ddd||         |         z  d	z  z             t          ddd||         |         z  d	z  z
                      }| j        |         |         }| j
                            ||
           ||f| j        k    r8| j
                            |dd           | j
                            |           | j
                            |dd           t          | j                            | j                            }| j                            |           | j                                        | _        | j        d| j        z  | j        d<   d S d S )Nc                 B    g | ]}d  t                    D             S )c                     g | ]}d S r   rR   .0rK   s     r>   
<listcomp>z5ChartMatrixView.update.<locals>.<listcomp>.<listcomp>   s    +++Qq+++r@   ranger   jNs     r>   r   z*ChartMatrixView.update.<locals>.<listcomp>   s.    >>>++%((+++>>>r@   r   r   gray20z#00{:02x}{:02x}   2      
   rw   z#00ffffr   )outliner   black)spanz%d edgesrp   )r\   lenrY   r   rX   startendformatminmaxr   
itemconfigr[   	tag_raiselistr   r   set	num_edgesrf   rd   )	r;   
cell_edgesr   rK   r   colorcell_tagedgesr   s	           @r>   updatezChartMatrixView.update   sG   :F >>>>U1XX>>>
K 	6 	6Dtzz||$TXXZZ000A50000 q 	P 	PA1a[[ P Pa=#q(($EE-44CcJqM!,<&<r&A!ABBAsS:a=+;%;b%@@AA E  ;q>!,''u'===q6T000L++Hiq+QQQL**84444L++HgQ+OOOOP" T[''T-@'AABB
u +//11++5+GD ((( ,+r@   c                 f    | j                             dd           |                                  d S )Ninactiveboxhiddenstater   r   r   r;   s    r>   activatezChartMatrixView.activate   .    X>>>r@   c                 f    | j                             dd           |                                  d S )Nr   normalr   r   r   s    r>   
inactivatezChartMatrixView.inactivate   r   r@   c                 B    d| j                             |i           |<   d S Nr   re   
setdefaultr;   eventfuncs      r>   r   zChartMatrixView.add_callback   $    67""5"--d333r@   Nc                 L    |
| j         |= d S 	 | j         |         |= d S #  Y d S xY wr   re   r   s      r>   remove_callbackzChartMatrixView.remove_callback   A    <&&&OE*4000    #c                     || j         vrd S t          | j         |                                                   D ]} ||  d S r   re   r   keysr;   r   argscb_funcs       r>   r   zChartMatrixView._fire_callbacks   U    ''FDOE27799:: 	 	GGTNNN	 	r@   c                     | j         d S ||f| j        k    r$| j                                        | j        k    rd S ||f| _        |                                  |                     d||           d S )Nselect_cell)r\   r[   rX   r   rf   r   r   r;   rK   r   s      r>   r   zChartMatrixView.select_cell  s{    :F q6T(((T[-B-B-D-D-W-WF !f 	]Aq11111r@   c                     | j         d S d | _        | j                            g            |                                  d S r   )r\   r[   r   r   r   r   s    r>   deselect_cellzChartMatrixView.deselect_cell  s<    :F"
rr@   c                 x    | j         ||fk    r|                                  d S |                     ||           d S r   )r[   r   r   r   s      r>   _click_cellzChartMatrixView._click_cell  sH    1a&((     Q"""""r@   c                 r     | j         |                                  | j                            |           d S r   )r   r   r   viewr;   r   s     r>   	view_edgezChartMatrixView.view_edge   s4    $))++&&
r@   c                     | j         d S  | j        |                                  | j                            |           d S r   )r\   r   r   r   markr   s     r>   	mark_edgezChartMatrixView.mark_edge$  sA    :F$))++&&
r@   c                 L    | j         d S | j                            |           d S r   )r\   r   unmarkr   s     r>   unmark_edgezChartMatrixView.unmark_edge*  s+    :F
$r@   c                     | j         d S  | j        |                                  | j                            |           d S r   )r\   r   r   r   markonlyr   s     r>   markonly_edgezChartMatrixView.markonly_edge/  sC    :F$))++&&
D!!!!!r@   c           	      ~   | j         d S dx}}d}| j        }|                    d           | j                                        dz   t          |d                   |z
  z  }t          |d                   |z
  |z
  z  }|                    d           t                    D ]}|                    |dz
  ||z  |dz  z   |z   t          |          d	           |                    ||z  |dz  z   |z   |z  |z   dz   t          |          d
	           |	                    |||dz   z  |z   |z  |z   ||dz   z  |z   d           |	                    ||z  |z   |||z  |z   |z  |z   d           |
                    ||||z  z   |z  |z   d           fdt                    D             | _        t                    D ]{}t          |          D ]h}|
                    ||z  |z   ||z  |z   |dz   |z  |z   |dz   |z  |z   d          }	|	| j        |         |<   | ||fd}
|                    |	d|
           i|t          |d                   t          |d                   }}|
                    dd|dz   |dz   ddd          }	|                    |	           |                                  d S )N   r   allr   r   r   r|   r   )rp   anchorn.)dashr   c                 B    g | ]}d  t                    D             S )c                     g | ]}d S r   rR   r   s     r>   r   z3ChartMatrixView.draw.<locals>.<listcomp>.<listcomp>b  s    //////r@   r   r   s     r>   r   z(ChartMatrixView.draw.<locals>.<listcomp>b  s.    BBBA//eAhh///BBBr@   r   r   c                 2    |                     ||           d S r   )r   )r   r;   rK   r   s       r>   r   z ChartMatrixView.draw.<locals>.cbn  s    $$Q*****r@   
<Button-1>id   gray50r   r   )rw   r   tag)r\   r   deleterX   
num_leavesintr   create_textreprcreate_linecreate_rectanglerY   tag_bind	tag_lowerr   )r;   LEFT_MARGIN
BOT_MARGIN
TOP_MARGINcdxdyrK   r   tr   xmaxymaxr   s                @r>   rg   zChartMatrixView.draw5  s   :F#%%j
L	K""$$q(!G*oo+q0!H++j8A=	 q 	 	AMMaR"q&:!=DGGTW     MMBa+-B#a'!WW	     MMa!ez)Q$a!ez)     MMQ$Q$Q#      	
[26%926J;NVW 	 	
 	
 	

 CBBBqBBBq 	0 	0A1a[[ 0 0&&F[(FZ'UbL;.UbL:-! '   %&Aq!#'1 + + + + 

1lB////0  7__c!H+&6&6d3J3J  
 
 	
A 	r@   c                 *     | j         j        |i | d S r   r\   rx   r;   r   kwargss      r>   rx   zChartMatrixView.pack  !    
((((((r@   )TrU   Fr   )rN   rO   rP   __doc__rl   r`   ra   rc   rb   r_   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rg   rx   rR   r@   r>   rT   rT   {   s        
 QV   <8 8 81 1 1E E E      #H #H #HJ    8 8 8     2 2 2  # # #           
" " "L L L\) ) ) ) )r@   rT   c                   Z    e Zd Zd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dS )ChartResultsViewTc                 (   || _         || _        g | _        d| _        g | _        d | _        d | _        |rOt          |          | _        | j        	                    d           | j        
                    d| j                   nt          |          | _        |rt          | j                  }|                    ddd           t          |d| j        	                              d
           t          |d| j        	                              d           t          |d| j        	                              d           t#          | j        d          | _        | j                            ddd           |                                  d S )Nr   z!Chart Parser Application: ResultsrW   rr   r   xrt   rn   ro   rightru   z	Print AllleftzPrint Selectionr   )closeenoughr   r   r   )rX   _grammar_trees_y_treewidgets
_selection
_selectboxr   r\   r]   r^   r_   r   rx   r   	print_allprint_selectionr   _cframer   )r;   rh   ri   grammarrj   buttonss         r>   rl   zChartResultsView.__init__  s    	'!&))DJJ@AAAJOOM4<8888vDJ  	DJ''GLLhqsL;;;7>>>CCCQQQ7dnEEEJJPVJWWW7!2D<PQQQVV W   
 #4:2>>>uQV<<< 	r@   Nc                    | j         d S |d|                                | j                                        k    rd S |                                d| j                                        fk    rd S | j                            | j                                                  D ] }|| j        vr| 	                    |           !d S r   )
r\   rC   r2  r   r   rX   r  parsesr3  _add)r;   r   parses      r>   r   zChartResultsView.update  s    :FxxzzT]002222yy{{q$+"8"8":":;;;[''(;(;(=(=>> 	! 	!EDK''		%   	! 	!r@   c                 z   | j                             |           | j                                        }t	          ||          }| j                            |           | j                            |d| j                   |                    | j	                   |
                                d         dz   | _        d S )Nr   r   )r3  rB   r:  canvasr   r5  
add_widgetr4  
bind_click_clickbbox)r;   r@  r  
treewidgets       r>   r?  zChartResultsView._add  s    5!!! L!!(E22
 	  ,,,
B888 	dk*** //##A&+r@   c                     | j                                         }| j        |                    | j                   || _        |                                \  }}}}|                    ||||dd          | _        d S )Nr|   z#088)r   r   )r:  rB  r6  r  r7  rF  r  )r;   widgetr  x1y1x2y2s          r>   rE  zChartResultsView._click  st    L!!?&HHT_%%% !;;==RR,,RR1f,UUr@   c                     ||                                 d<   |                                D ]3}t          |t                    r|                     ||           .||d<   4d S )Nr   )labelsubtreesrG   r   _color)r;   rG  r   childs       r>   rQ  zChartResultsView._color  sr    &+
7#((** 	' 	'E%!233 'E5))))!&g		' 	'r@   c                 J    | j         d S | j                                         d S r   )r\   r:  print_to_filer   s     r>   r8  zChartResultsView.print_all  s)    :F""$$$$$r@   c                 R   | j         d S | j        t          dd           d S | j                                        }| j        D ]%}|| j        ur| j                            |           &|                    | j                   | j        	                                \  }}}}| j        
                    d|z
  d|z
             d||z
  dz    d||z
  dz    |d<   | j                                         | j        g| _        |                                  |                                  d S )NzPrint ErrorzNo tree selectedr   z0 0 r    scrollregion)r\   r6  r   r:  rB  r5  destroy_widgetr  r7  rF  moverT  clearr   )r;   r   r  rI  rJ  rK  rL  rM  s           r>   r9  z ChartResultsView.print_selection  s2   :F?"m%788888##%%A+ 8 800L//777HHT_%%%#3355RRO  b"r'222 DrBw| D Db2gl D DAnL&&((( "& 1DJJLLLKKMMMMMr@   c                    | j         d S | j        D ]}| j                            |           g | _        g | _        | j        1| j                                                            | j                   d | _        d| _	        d S )Nr   )
r\   r5  r:  rX  r3  r6  rB  r  r7  r4  )r;   rG  s     r>   rZ  zChartResultsView.clear  s    :F+ 	4 	4JL''
3333?&L!!((999r@   c                 d    |                                   || _        |                                  d S r   )rZ  rX   r   r   s     r>   r   zChartResultsView.set_chart  s'    

r@   c                 d    |                                   || _        |                                  d S r   )rZ  r2  r   r;   r;  s     r>   set_grammarzChartResultsView.set_grammar	  s'    

r@   c                 j    | j         d S 	 | j                                          n#  Y nxY wd | _         d S r   r   r   s     r>   r_   zChartResultsView.destroy  r   r   c                 *     | j         j        |i | d S r   r%  r&  s      r>   rx   zChartResultsView.pack  r(  r@   )Tr   )rN   rO   rP   rl   r   r?  rE  rQ  r8  r9  rZ  r   r_  r_   rx   rR   r@   r>   r+  r+    s           B! ! ! !, , ,$V V V' ' '% % %
  *
 
 
  
  
  ) ) ) ) )r@   r+  c                       e Zd ZdZdej        d         ej        d         dZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd ZddgZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Z d!S )"ChartComparera  

    :ivar _root: The root window

    :ivar _charts: A dictionary mapping names to charts.  When
        charts are loaded, they are added to this dictionary.

    :ivar _left_chart: The left ``Chart``.
    :ivar _left_name: The name ``_left_chart`` (derived from filename)
    :ivar _left_matrix: The ``ChartMatrixView`` for ``_left_chart``
    :ivar _left_selector: The drop-down ``MutableOptionsMenu`` used
          to select ``_left_chart``.

    :ivar _right_chart: The right ``Chart``.
    :ivar _right_name: The name ``_right_chart`` (derived from filename)
    :ivar _right_matrix: The ``ChartMatrixView`` for ``_right_chart``
    :ivar _right_selector: The drop-down ``MutableOptionsMenu`` used
          to select ``_right_chart``.

    :ivar _out_chart: The out ``Chart``.
    :ivar _out_name: The name ``_out_chart`` (derived from filename)
    :ivar _out_matrix: The ``ChartMatrixView`` for ``_out_chart``
    :ivar _out_label: The label for ``_out_chart``.

    :ivar _op_label: A Label containing the most recent operation.
    -intersectionunion)rd  andorc                    dgdz  }t          |          | _        d| _        d| _        | j        | _        | j        | _        d| j        i| _        | j        | _        d | _        t                      | _
        | j
                            d           | j
                            d| j                   | j
                            d| j                   |                     | j
                   |                     | j
                   |                     | j
                   |                     | j
                   |                     | j
                   |D ]}|                     |           d S )N    NonezChart ComparisonrW   <Control-x>)r   _emptychart
_left_name_right_name_left_chart_right_chart_charts
_out_chart	_operatorr   r\   r]   r^   r_   _init_menubar_init_chartviews_init_divider_init_buttons_init_bindings
load_chart)r;   chart_filenamesfaketokfilenames       r>   rl   zChartComparer.__init__B  s^    $( >> !!+ ,  01 *  TT

+,,,
t|444
t|444 	4:&&&dj)))4:&&&4:&&&DJ''' ( 	& 	&HOOH%%%%	& 	&r@   c                 j    | j         d S 	 | j                                          n#  Y nxY wd | _         d S r   r   r   s     r>   r_   zChartComparer.destroyh  r   r   c                     d S r   )r\   mainloopr&  s      r>   r  zChartComparer.mainloopq  s    r@   c                    t          |          }t          |d          }|                    ddd| j                   |                    ddd| j                   |                                 |                    dd	| j        d
           |                    dd|           t          |d          }|                    d| j        d           |                    d| j        d           |                    d| j	        d           |                                 |                    d| j
                   |                    dd|           | j                            |           d S )Nr   tearoff
Load ChartCtrl-o)rO  acceleratorr3   rq   zSave OutputCtrl-sExitr   Ctrl-xrO  r3   rq   r  FilerO  r3   menuIntersection+)rO  rq   r  Union*
Differencerd  Swap ChartsrO  rq   Comparer  )r	   add_commandload_chart_dialogsave_chart_dialogadd_separatorr_   add_cascade_intersection_union_difference_swapchartsr\   config)r;   ry   menubarfilemenuopmenus        r>   rv  zChartComparer._init_menubary  s   t** +++ *	 	 	
 	
 	
 	 *	 	 	
 	
 	
 	   At| 	 	
 	
 	
 	&AHEEE gq))) $*<# 	 	
 	
 	
 	$+3OOO(8c 	 	
 	
 	
 	8HIII)qvFFF 	
w'''''r@   c                 Z    t          |dd          }|                    ddd           d S )Nr|   r}   r~   r   r-  )ru   rw   ipady)r   rx   )r;   ry   dividers      r>   rx  zChartComparer._init_divider  s4    Qx888%c33333r@   c                 ~   d}d}t          |d          }|                    ddd           t          |d	d
          }|                    ddddd           t          |t          | j                                                  | j                  | _        | j                            ddd           t          || j	        dd          | _
        | j
                            ddddd           | j
                            d| j                   | j
                            d| j                   | j
                                         t          |dd	d|          | _        | j                            ddd           t          |d	d
          }|                    ddddd           t          |t          | j                                                  | j                  | _        | j                            ddd           t          || j	        dd          | _        | j                            ddddd           | j                            d| j                   | j                            d| j                   | j                                         t          |dd	d|                              ddd           t          |d	d
          }|                    ddddd           t          |d          | _        | j                            dd !           t          || j	        dd          | _        | j                            ddddd           | j                            d| j                   | j                            d| j                   | j                                         d S )"N)r0   )r7   r  z#c0c0c0r   r   r   r   rt   r   groover~   r0  rk     )ru   r   r   rv   rw   )rq   r   r-  )ru   r   rw   FT)rj   rk   rr   r   r   rV  )rp   r   r   r2   )ru   r   r   =Outputr   	   )ru   r   )r   rx   r   r   rs  r   _select_left_left_selectorrT   rn  _left_matrixr   select_edger   r   r   	_op_label_select_right_right_selector_right_matrix
_out_label_out_matrix)r;   ry   opfonteqfontframe	cv1_frame	cv2_frame	out_frames           r>   rw  zChartComparer._init_chartviews  s    #dy111

af
555 %(;;;	F16JJJ/tDL--//00$:K
 
 
 	  e!# >>>+t'%t
 
 
 	H11QVTTT&&x1ABBB&&}d6FGGG$$&&& 1
 
 
 	aa888 %(;;;	F16JJJ0tDL--//00$:L 
  
  
 	!!u13!???,t'%t
 
 
 	XAAafUUU''$2BCCC''t7GHHH%%''' 	e#Q96JJJOOaa 	P 	
 	
 	

 %(;;;	F16JJJ	999%a000*t'%t
 
 
 	8!!AFSSS%%h0@AAA%%mT5EFFF##%%%%%r@   c                 N   t          |          }|                    dddd           t          |d| j                                      d	           t          |d
| j                                      d	           t          |d| j                                      d	           t          |d                              d	           t          |d| j                                      d	           t          |d| j                                      d	           d S )Nrr   r   r-  r   )ru   r   rw   rv   r  ro   r0  r/  r  r  r   r
  r  zDetach Outputr.  )r   rx   r   r  r  r  r  _detach_out)r;   ry   r<  s      r>   ry  zChartComparer._init_buttons  s8   ++(Q???w^T5GHHHMM 	N 	
 	
 	
 	wWdk:::??V?LLLw\43CDDDIIvIVVVgR   %%6%222w]D4DEEEJJPVJWWWw_d6FGGGLL 	M 	
 	
 	
 	
 	
r@   c                 <    |                     d| j                   d S )N<Control-o>)r^   r  r   s     r>   rz  zChartComparer._init_bindings  s    		-!788888r@   c                     || _         | j        |         | _        | j                            | j                   |dk    r| j                                         |                                  d S Nrl  )ro  rs  rq  r  r   r   	_apply_opr;   names     r>   r  zChartComparer._select_left  sf    <-##D$45556>>((***r@   c                     || _         | j        |         | _        | j                            | j                   |dk    r| j                                         |                                  d S r  )rp  rs  rr  r  r   r   r  r  s     r>   r  zChartComparer._select_right  sg     L.$$T%67776>>))+++r@   c                     | j         dk    r|                                  d S | j         dk    r|                                  d S | j         dk    r|                                  d S d S )Nrd  rh  rg  )ru  r  r  r  r   s    r>   r  zChartComparer._apply_op	  sr    >S  ^t##KKMMMMM^u$$      %$r@   zPickle file.picklez	All filesr  c                    t          | j        d          }|sd S 	 t          |d          5 }t          j        | j        |           d d d            d S # 1 swxY w Y   d S # t          $ r!}t          dd|d|            Y d }~d S d }~ww xY w)Nr  	filetypesdefaultextensionwbzError Saving ChartUnable to open file: 
)r   CHART_FILE_TYPESopenpickledumprt  	Exceptionr   r;   r   r~  outfiler   s        r>   r  zChartComparer.save_chart_dialog  s   $+i
 
 
  	F	Wh%% 6DOW5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 	W 	W 	W*,UH,U,URS,U,UVVVVVVVVV	Ws:   A! AA! AA! AA! !
B+BBc                     t          | j        d          }|sd S 	 |                     |           d S # t          $ r!}t	          dd|d|            Y d }~d S d }~ww xY w)Nr  r  zError Loading Chartr  r  )r   r  r{  r  r   )r;   r   r~  r   s       r>   r  zChartComparer.load_chart_dialog"  s    "+i
 
 
  	F	XOOH%%%%% 	X 	X 	X+-VX-V-VST-V-VWWWWWWWWW	Xs   3 
AAAc                 \   t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   t          j                            |          }|                    d          r
|d d         }|                    d          r
|d d         }|| j        |<   | j        	                    |           | j
        	                    |           | j        | j        u r| j                            |           d S | j        | j        u r| j
                            |           d S d S )Nrbr  iz.charti)r  r  loadospathbasenameendswithrs  r  addr  rq  rn  r   rr  )r;   r~  infileri   r  s        r>   r{  zChartComparer.load_chart-  sj   (D!! 	(VK''E	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(w))==## 	9D=="" 	9D"T%%%  &&& t///##D)))))$"222 $$T***** 32s   266c                     | j                                          | j                                         | j                                         d S r   )r  r   r  r  r   s    r>   _update_chartviewsz ChartComparer._update_chartviews@  sG      """!!###!!!!!r@   c                 v   || j         v r| j                            |           n| j                                         || j        v r| j                            |           n| j                                         || j        v r| j                            |           d S | j                                         d S r   )rq  r  r  r   rr  r  rt  r  r   s     r>   r  zChartComparer.select_edgeI  s    4###++D1111))+++4$$$,,T2222**,,,4?""**400000((*****r@   c                     | j                             ||           | j                            ||           | j                            ||           d S r   )r  r   r  r  r   s      r>   r   zChartComparer.select_cellW  sS    %%a+++&&q!,,,$$Q*****r@   c                     |                                  sd S t          | j                                                  }| j        D ]!}|| j        vr|                    |g            "|                     d|           d S )Nrd  _checkcompatr   rq  tokensrr  insert_updater;   	out_chartr   s      r>   r  zChartComparer._difference`  s      "" 	F$*113344	$ 	+ 	+D4,,,  r***S)$$$$$r@   c                     |                                  sd S t          | j                                                  }| j        D ]!}|| j        v r|                    |g            "|                     d|           d S )Nrg  r  r  s      r>   r  zChartComparer._intersectionk  s      "" 	F$*113344	$ 	+ 	+Dt(((  r***UI&&&&&r@   c                 *   |                                  sd S t          | j                                                  }| j        D ]}|                    |g            | j        D ]}|                    |g            |                     d|           d S )Nrh  )r  r   rq  r  r  rr  r  r  s      r>   r  zChartComparer._unionv  s      "" 	F$*113344	$ 	' 	'DT2&&&&% 	' 	'DT2&&&&T9%%%%%r@   c                     | j         | j        }}| j                            |           | j                            |           d S r   )ro  rp  r  r   r  )r;   r0  r.  s      r>   r  zChartComparer._swapcharts  sD    ot'7e&&&  &&&&&r@   c                    | j                                         | j                                        k    sT| j                                         | j                                        k    s | j         | j        k    s| j        | j        k    rP| j        | _        | j                            | j                   | j                                         d| j	        d<   dS dS )Nr  rp   FT)
rq  r  rr  property_namesrn  rt  r  r   r   r  r   s    r>   r  zChartComparer._checkcompat  s    ##%%):)A)A)C)CCC..00D4E4T4T4V4VVV4#333 D$444 #.DO&&t777'')))&.DOF#54r@   c                     || _         | j        |         | j        d<   || _        | j                            |           d                    | j        | j         | j                  | j	        d<   d S )Nrp   z{} {} {})
ru  	_OPSYMBOLr  rt  r  r   r   ro  rp  r  )r;   operatorr  s      r>   r  zChartComparer._update  sl    !!%!9v#""9---","3"3ON#
 #
r@   c                     | j         | _        | j                            | j                   d| j        d<   | j                                         d S )NrV  rp   )rn  rt  r  r   r  r   r   s    r>   _clear_out_chartzChartComparer._clear_out_chart  sL    *""4?333!$v##%%%%%r@   c                 T    t          | j        | j        | j        d                    d S )Nrp   )r]   )rT   r\   rt  r  r   s    r>   r  zChartComparer._detach_out  s(    
DO4?6;RSSSSSSr@   N)!rN   rO   rP   r)  r   rQ   r  rl   r_   r  rv  rx  rw  ry  rz  r  r  r  r  r  r  r{  r  r  r   r  r  r  r  r  r  r  r  rR   r@   r>   rc  rc     s        8 #N3"7+ I$& $& $&L  - - -%( %( %(N4 4 4;& ;& ;&z
 
 
9 9 9    ! ! ! 34FG
W 
W 
W	X 	X 	X+ + +&" " "+ + ++ + +	% 	% 	%	' 	' 	'
& 
& 
&' ' '
  "	
 	
 	
& & &T T T T Tr@   rc  c                      e Zd ZdZdZdZdZdZd-d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/dZd Zd Zd0dZd1dZd-dZd1dZd  Zd! Zd" Zd# Z d$ Z!d-d%Z"d& Z#d' Z$d/d(Z%d) Z&d* Z'd-d+Z(d, Z)dS )2	ChartViewa  
    A component for viewing charts.  This is used by ``ChartParserApp`` to
    allow students to interactively experiment with various chart
    parsing techniques.  It is also used by ``Chart.draw()``.

    :ivar _chart: The chart that we are giving a view of.  This chart
       may be modified; after it is modified, you should call
       ``update``.
    :ivar _sentence: The list of tokens that the chart spans.

    :ivar _root: The root window.
    :ivar _chart_canvas: The canvas we're using to display the chart
        itself.
    :ivar _tree_canvas: The canvas we're using to display the tree
        that each edge spans.  May be None, if we're not displaying
        trees.
    :ivar _sentence_canvas: The canvas we're using to display the sentence
        text.  May be None, if we're not displaying the sentence text.
    :ivar _edgetags: A dictionary mapping from edges to the tags of
        the canvas elements (lines, etc) used to display that edge.
        The values of this dictionary have the form
        ``(linetag, rhstag1, dottag, rhstag2, lhstag)``.
    :ivar _treetags: A list of all the tags that make up the tree;
        used to erase the tree (without erasing the loclines).
    :ivar _chart_height: The height of the chart canvas.
    :ivar _sentence_height: The height of the sentence canvas.
    :ivar _tree_height: The height of the tree

    :ivar _text_height: The height of a text string (in the normal
        font).

    :ivar _edgelevels: A list of edges at each level of the chart (the
        top level is the 0th element).  This list is used to remember
        where edges should be drawn; and to make sure that no edges
        are overlapping on the chart view.

    :ivar _unitsize: Pixel size of one unit (from the location).  This
       is determined by the span of the chart's location, and the
       width of the chart display canvas.

    :ivar _fontsize: The current font size

    :ivar _marks: A dictionary from edges to marks.  Marks are
        strings, specifying colors (e.g. 'green').
    r      (   Nc                    |                     dd          }|                     dd          }|                     dd          | _        || _        i | _        g | _        i | _        i | _        g | _        d| _        d| _	        g | _
        d| _        |st                      }|                    d           |fd	}|fd
}|                    d|           t          |d|          }	|	                    d           || _        n|| _        |                     |           |                     | j                  \  | _        | _        d| j        d<   d| j        d<   |rjt-          | j        dd          }
|
                    dd           t/          |
d          | _        d| j        d<   | j                            d           nd| _        |r9|                     | j        dd          \  }}||c| _        | _        d | j        d<   nd| _        |                                  |                                  |                                  |                                  | j                            d!| j                   dS )"z4
        Construct a new ``Chart`` display.
        	draw_treer   draw_sentencer   fontsizer8   Nz
Chart Viewc                 .    |                                  d S r   r_   )r   r   s     r>   destroy1z$ChartView.__init__.<locals>.destroy1      r@   c                 .    |                                   d S r   r  )r   s    r>   destroy2z$ChartView.__init__.<locals>.destroy2  r  r@   qDonero   rr   r/  i,  r   r  r1  sunkr|   r   r   r   )rw   ru   r   r   #e0e0e0r   r   r  r-  r   z<Configure>) get	_fontsizerX   re   _edgelevels	_edgetagsrZ   	_treetoks_treetoks_edge_treetoks_index
_tree_tags_compactr   r]   r^   r   rx   r\   _init_fonts
_sb_canvas	_chart_sb_chart_canvasr   r   _sentence_canvas_tree_sb_tree_canvas_analyzerg   _resize_grow
_configure)r;   ri   ry   kwr  r  r   r  r
  br   sbrB  s                r>   rl   zChartView.__init__  s   
 FF;**	22
C00     "    <$$CIIl### #     !     HHS(###s:::AFFF!!!DJJDJ 	 04tz/J/J,+'*8$,.=)  	)4:fQ???FKKV(K333$*6"$=$=$=D!2;D!,/!&&F&3333 %)D!  	%??4:sC@@LR24f.T]D-*-Dh'' $D 			

 	t?????r@   c                     t          dd| j                  | _        t          d| j                  | _        t          t	                      d                   | _        |                    d| j                   d S )Nr7   r9   familyweightsizer*  r,  r2   r2   *Font)r   r  	_boldfont_fontr   _sysfont
option_addr   s     r>   r  zChartView._init_fonts?  sg    [dnUUU4>BBB
&((6"2333/////r@   yr   rr   c                 (   t          |dd          }|                    |||           t          |d          }t          |d          }|                    d	d
           |                    d|d           |j        |d<   |j        |d<   ||fS )zK
        Helper for __init__: construct a canvas with a scrollbar.
        r  r|   r  )rw   rv   ru   r  r  vertical)orientr.  r4  ru   rw   r0  yesru   rw   rv   rq   yscrollcommand)r   rx   r   r
   yviewr   )r;   ry   rv   rw   ru   r   rB  r'  s           r>   r  zChartView._sb_canvasF  s     tF1555f48889555 vj111
W3'''d5999 9#%6 F|r@   c                 >    | j                             ddd           d S )Nscrollunitsr  r<  r   s     r>   	scroll_upzChartView.scroll_upY  #      2w77777r@   c                 >    | j                             ddd           d S )Nr>  r   r@  rA  r   s     r>   scroll_downzChartView.scroll_down\  #      1g66666r@   c                 >    | j                             ddd           d S )Nr>  r?  pagesrA  r   s     r>   page_upzChartView.page_up_  rC  r@   c                 >    | j                             ddd           d S )Nr>  r   rH  rA  r   s     r>   	page_downzChartView.page_downb  rF  r@   c                    | j                                         }t          t          | j        d                   || j        z  t          j        dz  z             }| j                            |           | j                            | j        d                    |dt          j        z  z
  |z  | _        | j	        | j
        | j	        d<   dS dS )z/
        Grow the window, if necessary
        r   r|   r
  r   r  N)rX   r  r   r  r  	_unitsizer  _MARGIN	configurer  _sentence_height)r;   r   r   s      r>   r#  zChartView._growe  s    
 K""$$"7+,,a$..@9CTWXCX.X
 
 	$$5$111$$D,>x,H$III!i&7"771<  ,.2.CD!(+++ -,r@   c                 t   | j                             t          |                      | j                            t          |                      | j                            t          |                      |                                  |                                  |                                  d S N)r,  )r1  rO  absr0  r2  r!  r#  rg   r;   r,  s     r>   set_font_sizezChartView.set_font_sizez  s    
3t99*---  s4yyj 111c$iiZ000

		r@   c                 *    t          | j                  S r   )rS  r  r   s    r>   get_font_sizezChartView.get_font_size  s    4>"""r@   c                     | j                                         }|j        dt          j        z  z
  |z  | _        |                                  dS )z
        The configure callback.  This is called whenever the window is
        resized.  It is also called when the window is first mapped.
        It figures out the unit size, and redraws the contents of each
        canvas.
        r|   N)rX   r  r   r  rN  rM  rg   )r;   r   r   s      r>   r$  zChartView._configure  sC     K""$$'A	(9$99Q>		r@   c                 x   |{|| _         g | _        i | _        |                                  |                                  |                                  |                                  |                                  dS | j         D ] }|| j        vr| 	                    |           !|                                  dS )au  
        Draw any edges that have not been drawn.  This is typically
        called when a after modifies the canvas that a CanvasView is
        displaying.  ``update`` will cause any edges that have been
        added to the chart to be drawn.

        If update is given a ``chart`` argument, then it will replace
        the current chart with the given chart.
        N)
rX   r  rZ   r!  r#  rg   
erase_treer"  r  	_add_edge)r;   ri   r   s      r>   r   zChartView.update  s     DK!DDKMMOOOJJLLLIIKKKOOLLNNNNN ) )t~--NN4(((LLNNNNNr@   c                     |                                 \  }}| j        |         D ]Q}|                                 \  }}||cxk    r|k     s(n ||cxk    r|k     sn ||cxk    r|cxk    r|k    rn N dS RdS )z
        Return True if the given edge overlaps with any edge on the given
        level.  This is used by _add_edge to figure out what level a
        new edge should be added to.
        TF)r   r  )r;   r   lvls1e1	otheredges2e2s           r>   _edge_conflictzChartView._edge_conflict  s     99;;R)#. 	 	I ~~''HRb22====b====bB6J6J6J6J"6J6J6J6J6J6J6J6J6Jtt 7Kur@   c           	      J   | j         }t          |t                    r|                                }g }|                                D ]n}t          |t
                    r5|                    t          |                                                     L|                    t          |                     od
                    |          }n|                                }d}||fD ]}|                    dd|| j        dd          }|                    |          }	|                    |           |	d         }
t          |                                d          }t          | j        |
|z            | _        t          | j        |	d	         |	d         z
            | _        d
S )z
        Given a new edge, recalculate:

            - _text_height
            - _unitsize (if the edge text is too big for the current
              _unitsize, then increase _unitsize)
        rV  rj  r   nwr0  rp   r2   r  justifyr|   r   r   N)r  rG   r&   rC   rF   r   rB   strr0   r  joinr  r0  rF  r  r   lengthrM  _text_height)r;   r   r  rC   rhseltsrL   rF   sr  rF  r   edgelens               r>   _analyze_edgezChartView._analyze_edge  s    dH%% 	((**CGxxzz . .c;// .NN3szz||#4#45555NN499----((7##CC((**CCs 		J 		JA--114>$    C 66#;;DHHSMMMGE$++--++G AADN #D$5tAwa7H I ID		J 		Jr@   r   c                    t          |t                    rdS || j        v rdS |                     |           |                                  | j        s^| j                            |g           t          | j                  dz
  }| 	                    ||           | 
                                 dS d}	 |t          | j                  k    rF| j                            g            | 
                                 |t          | j                  k    F||k    r7|                     ||          s!| j        |                             |           n|dz  }| 	                    ||           dS )z
        Add a single edge to the ChartView:

            - Call analyze_edge to recalculate display parameters
            - Find an available level
            - Call _draw_edge
        Nr   r   )rG   r    r  ro  r#  r  r  rB   r   
_draw_edger"  rc  )r;   r   minlvlr]  s       r>   r[  zChartView._add_edge  st    dH%% 	F4>!!F4   

} 	##TF+++d&''!+COOD#&&&LLNNNF 	T-.... ''+++ T-....
 f}}T%8%8s%C%C} %,,T222 1HC	 	c"""""r@   c                 J   d }t          t          | j                            D ]}|| j        |         v r|} n|d S |dz   | j        z  }| j        dz   }| j                            dd           | j        dk    r(| j                            d||z
  | j        z             d S d S )Nr   r   movetog      ?r   )r   r   r  _chart_level_sizerk  r  r<  _chart_height)r;   r   levelrK   r4  r   s         r>   r   zChartView.view_edge  s    s4+,,-- 	 	At'*** + =FQY$00#  3///""$$XB$:L/LMMMMM #"r@   c                 f   | j         }|                                | j        z  t          j        z   }|                                | j        z  t          j        z   }||k    r|t          d| j        dz            z  }|dz   | j        z  }|                    ||||dd          }t          |t                    rg }|                                D ]n}	t          |	t                    r5|                    t          |	                                                     L|                    t!          |	                     o|                                }
ng }d}
d                    |d	|
                   }d                    ||
d	                   }|                    |dz   ||| j        d
          }|                    |          d         dz   }|                    |          d         |                    |          d         z   dz  }|                    |dz
  |dz
  |dz   |dz             }|                    |dz   ||| j        d
          }|                    ||z   dz  |t          |                                          d| j                  }|||||f| j        |<   | |fd}|                    |d|           |                    |d|           |                    |d|           |                    |d|           |                    |d|           |                     |           d	S )z6
        Draw a single edge on the ChartView.
           r   r   lastr   )r/   r   r   rV  Nre  )rp   r2   r  r|      rm  rp   r  r2   c                 2    |                     d|           d S r   r   )r   r;   r   s      r>   r   z ChartView._draw_edge.<locals>.cb<  r   r@   r  )r  r   rM  r  rN  r   r   ru  r  rG   r&   rF   r   rB   rh  r0   r  r4   ri  r  r1  rF  create_ovalrC   r0  r  r  _color_edge)r;   r   r]  r  rJ  rL  r4  linetagrF   rL   posrhs1rhs2rhstag1dotxdotydottagrhstag2lhstagr   s                       r>   rq  zChartView._draw_edge  s     ZZ\\DN*Y->>XXZZ$.(9+<<88#a!+,,,B1W..--Ar1F!-DD dH%% 
	Cxxzz * *c;// *JJs3::<<001111JJtCyy))))((**CCCCxxDSD	""xxCDD	""--Q4:d-SSvvgq!A%w"QVVG__Q%771<tax4!8TAXFF--q!$TZPT-UU"WM13txxzz??3T^  
 

 !(&'6Jt  d 	1 	1 	1 	1 	


7L"---	

7L"---	

7L"---	

6<,,,	

6<,,,r@   c                 <   || j         vrdS | j        }|||| j        v r| j        |         }| j         |         }|                    |d         |           |                    |d         |           |                    |d         ||           |                    |d         |           |                    |d         |           dS | j                                        }|| j        v r |                     | j        |                    |                                r3|                                d|fk    r|                     |d	d
           dS t          |t                    r|                     |dd           dS |                     |dd           dS )z
        Color in an edge with the given colors.
        If no colors are specified, use intelligent defaults
        (dependent on selection, etc.)
        Nr   r   r   r|   rw   r   r   ry  #084#042z#48cz#246z#00fz#008)r  r  rZ   r   rX   r  r  rH   r   rG   r    )r;   r   	linecolor	textcolorr  tagsr   s          r>   r  zChartView._color_edgeG  s    t~%%F Y%:t{"" K-	>$'DLLayL111LLayL111LLay)LDDDLLayL111LLayL111F&&((At{""  T!2333!! 7diikkaV&;&;  vv66666D(++ 7  vv66666  vv66666r@   #0dfc                 D    || j         |<   |                     |           dS )z
        Mark an edge
        N)rZ   r  r;   r   r   s      r>   r   zChartView.mark_edgef  s*     !Dr@   c                     |It          | j                                                  }i | _        |D ]}|                     |           dS | j        |= |                     |           dS )z/
        Unmark an edge (or all edges)
        N)r   rZ   r   r  )r;   r   old_marked_edgess      r>   r   zChartView.unmark_edgem  s     <#DK$4$4$6$677DK( ' '  &&&&' ' D!T"""""r@   c                 Z    |                                   |                     ||           d S r   )r   r   r  s      r>   r  zChartView.markonly_edgez  s.    tT"""""r@   c           	         d}d}| j         }| j                                        D ]}|                    ddt	          |          | j        dd          }|                    |          }|                    |           |d         t          j	        z   }t          ||          }t          ||d         |d         z
            }|| _        || _        | j        dt          j        z  z   | _        | j                                        D ]}|                     |           | j        dz  | _        dt          j        | j        z   z  | _        |                                  d	S )
z
        Analyze the sentence string, to figure out how big a unit needs
        to be, How big the tree should be, etc.
        F   r   re  r0  rf  r|   r   r   N)r  rX   leavesr  r  r1  rF  r  r  _LEAF_SPACINGr   rM  rk  rN  rP  r   ro  ru  _TREE_LEVEL_SIZE_tree_heightr"  )	r;   unitsizetext_heightr  leafr  rF  r   r   s	            r>   r!  zChartView._analyze~  s\     K&&(( 	> 	>D--14::DJtV    C 66#;;DHHSMMMGi55E5(++Hk47T!W+<==KK!' $ 1A	8I4I I K%%'' 	% 	%Dt$$$$ "&!2Q!6 !;d>O!OP 	r@   c                    | j         }| j                                        | j        z  t          j        dz  z   }t          | j                  }|dz   | j        z  | _	        dd|| j	        f|d<   | j
        rdd|| j        f| j
        d<   dS dS )z
        Update the scroll-regions for each canvas.  This ensures that
        everything is within a scroll-region, so the user can use the
        scrollbars to view the entire display.  This does *not*
        resize the window.
        r|   r   rW  N)r  rX   r  rM  r  rN  r   r  ru  rv  r   r  )r;   r  r   levelss       r>   r"  zChartView._resize  s      &&((4>9I<MPQ<QQT%&&$qjD,BB5$*<=.  	Q12Aud>O0PDn---	Q 	Qr@   c                    d}| j         }| j        }| j        }t          j        }g | _        t          d| j                                        dz             D ]}|| j	        z  |z   }|r-|
                    |d||          }|                    |           |r2|
                    |d|| j                  }	|                    |	           |
                    |d||          }
|                    |
           |                    |dz   dt          |          d| j                  }|                    |           |dz  dk    rK|r|                    |d           |r|                    |	d           |                    |
d           8|r|                    |d	           |r|                    |	d	           |                    |
d	           d
S )zv
        Draw location lines.  These are vertical gridlines used to
        show where each location unit is.
        iP  r   r   r|   re  r|  gray60r   gray80N)r   r  r  r  rN  	_loclinesr   rX   r  rM  r  r  rP  r  r  r1  r   )r;   BOTTOMc1c2c3marginrK   r-  t1t2t3t4s               r>   _draw_loclineszChartView._draw_loclines  s   
 ""q$+0022Q677 	1 	1ADN"V+A !^^Aq!V44R    !^^Aq!T-BCCR   1a00BLLAqtAwwt$*UUBLL
 1uzz 5MM"8M444 5MM"8M444bx0000 5MM"8M444 5MM"8M444bx00009	1 	1r@   c           	      `   | j                                         dk    rdS | j        }t          j        }t          j        }t          | j                                                   D ]\  }}|| j        z  |z   }|| j        z   }||z   dz  }|                    ||t          |          | j
        dd          }	|                    |	          }
|                    |dz   |
d         t          j        dz  z
  |dz
  |
d         t          j        dz  z   d	d	
          }|                    |           dS )zDraw the sentence string.r   Nr|   r  r0  rf  r   r   z#f0f0f0r  )rX   r  r  r  rN  rE   r  rM  r  r  r1  rF  r  r  r  )r;   r  r  r4  rK   r  rJ  rL  r-  r  rF  rts               r>   _draw_sentencezChartView._draw_sentence  s<   ;!!##q((F!" !3!3!5!566 	 	GAtT^#f,Bdn$BbAA--14::DJsF    C 66#;;D##QQ92Q67QQ92Q67! $  B KKOOOO!	 	r@   c                 x    | j         D ]}| j                            |           g | _        d | _        d| _        d S r   )r  r   r  r  r  r  )r;   r  s     r>   rZ  zChartView.erase_tree  sJ    ? 	* 	*C$$S))))" r@   c                    |	| j         d S || j         }| j         |k    r7d | j                            |          D             | _        || _         d| _        t          | j                  dk    rd S | j        D ]}| j                            |           | j        | j                 }| 	                    ||
                                           |                                  | j                                        | j        z  dt          j        z  z   }|                                t          j        | j        z   z  }dd||f| j        d<   d S )Nc                 <    g | ]}t          |t                    |S rR   )rG   r'   )r   r!  s     r>   r   z'ChartView.draw_tree.<locals>.<listcomp>
  s(    XXXAJqRVDWDWXaXXXr@   r   r|   rW  )r  rX   treesr  r  r   r  r   r  _draw_treetokr   _draw_treecycler  rM  r  rN  r   r  rk  )r;   r   r  treewhs         r>   r  zChartView.draw_tree  sS   <D/7F<&D $&&XX):):4)@)@XXXDN"&D#$D  t~!##F ? 	* 	*C$$S)))) ~d234... 	 K""$$t~5I<M8MMKKMMY7$:KKL-.1aL.)))r@   c                     | j         dz   t          | j                  z  | _         |                     | j                   d S r   )r  r   r  r  r  r   s    r>   
cycle_treezChartView.cycle_tree"  s<     $ 4q 8C<O<OOt*+++++r@   c                    t          | j                  dk    rd S dt          | j                  z  }| j        }t          j        }| j                                        | j        z  |z   dz
  }|                    |dd|| j	                  }| j
                            |           |                    |          \  }}}}t          t          | j                            D ]}|dt          | j                  |z
  dz
  z  z
  }	|| j        k    rd}
nd}
|                    |	|d	z   |	d
z
  ||	d	z
  |d	z   |
d          }| j
                            |           | |fd}|                    |d|           d S )Nr   z%d Treesr|   ne)r  rp   r2   r   r  z#fffr   r   r   r  c                 <    ||_         |                                 d S r   )r  r  )r   r;   rK   s      r>   r   z%ChartView._draw_treecycle.<locals>.cbA  s     '($     r@   r  )r   r  r   r  rN  rX   r  rM  r  r0  r  rB   rF  r   r  create_polygonr  )r;   rO  r  r  r.  r  _r4  rK   r-  rw   r   s               r>   r  zChartView._draw_treecycle&  s   t~!##F S000"&&((4>9FBQFmmE1TDNmSSs###VVC[[
1a s4>**++ 	. 	.Ac$.11A59::AD(((""1r61q5!QVQV$ #  C O""3'''  $q ! ! ! ! JJsL"----#	. 	.r@   c           
         | j         }t          j        }g }|D ]x}t          |t                    r3|                     |||dz             \  }}|                    |           J|                    d|z  dz   | j        z  dz  |z              |dz  }y|r t          |          t          |          z  }	nd|z  dz   | j        z  dz  |z   }	|dz  }|t          j
        | j        z   z  }
|                    |	|
ddt          |                                          d| j                  }| j                            |           |
t          j
        z   | j        z   }t#          ||          D ]\  }}t          |t                    r?|r=|                    |	|
| j        z   ||dd          }| j                            |           t          |t                    r@|s>|                    |	|
| j        z   ||dd	d
          }| j                            |           t          |t                    s=|                    |	|
| j        z   |ddd          }| j                            |           |	|fS )z
        :param index: The index of the first leaf in the tree.
        :return: The index of the first leaf after the tree.
        r   r|   r  centerr  )r  rg  rp   rw   r2   r  )r   rw   z#048z2 3)r   rw   r	  i'  )r   r  rN  rG   r'   r  rB   rM  sumr   r  rk  r  rh  rO  r0  r  zipr  )r;   treetokindexdepthr  r  child_xsrR  child_xnodexnodeyr  childychildxs                 r>   r  zChartView._draw_treetokG  s   
 "  	 	E%&& !%!3!3E5%!)!L!L((((UQ$. @1 Dv MNNN
  	MMCMM1EE Y]dn4q86AEQJE 3d6GGHmmW]]__%%  
 
 	s### 33d6GG 733 "	, "	,MFE%&& 
,5 
,mmD-- $   &&s+++%&& ,u ,mmD-- $   &&s+++eT** 
,mmD-- $   &&s+++e|r@   c                    | j         r.| j                             d           |                                  | j        r.| j                            d           |                                  | j                            d           i | _        t          t          | j	                            D ](}| j	        |         D ]}| 
                    ||           )| j        D ]}|                     |           |                                  dS )z1
        Draw everything (from scratch).
        r  N)r   r  r  r  r  r  r  r   r   r  rq  rX   r[  r  )r;   r]  r   s      r>   rg   zChartView.draw  s     	$$U+++NN  	"!((///!!!!!%((( T-..// 	+ 	+C(- + +c****+ K 	! 	!DNN4    r@   c                 B    d| j                             |i           |<   d S r   r   r   s      r>   r   zChartView.add_callback  r   r@   c                 L    |
| j         |= d S 	 | j         |         |= d S #  Y d S xY wr   r   r   s      r>   r   zChartView.remove_callback  r   r   c                     || j         vrd S t          | j         |                                                   D ]} ||  d S r   r   r   s       r>   r   zChartView._fire_callbacks  r   r@   r   )r4  r   rr   r   )NN)r  )*rN   rO   rP   r)  r  rN  r  _CHART_LEVEL_SIZErl   r  r  rB  rE  rI  rK  r#  rU  rW  r$  r   rc  ro  r[  r   rq  r  r   r   r  r!  r"  r  r  rZ  r  r  r  r  rg   r   r   r   rR   r@   r>   r  r    s       , ,\ MGW@ W@ W@ W@r0 0 0   &8 8 87 7 78 8 87 7 7D D D*  # # #	 	 	   2   J  J  JD)# )# )# )#VN N N3 3 3j7 7 7 7>   # # # ## # # #$ $ $LQ Q Q('1 '1 '1R  4! ! !9 9 9 9@, , ,. . .BN N N N`  28 8 8       r@   r  c                   6     e Zd ZdZ fdZ fdZ fdZ xZS )EdgeRulez
    To create an edge rule, make an empty base class that uses
    EdgeRule as the first base class, and the basic rule as the
    second base class.  (Order matters!)
    c                 X    | j         j        d         }|| _        |j        dz
  | _        d S r   )	__class__	__bases___edge	NUM_EDGES)r;   r   superr  s      r>   rl   zEdgeRule.__init__  s+    (+
1,r@   c              '   r   K   | j         j        d         }|| j        fz  } |j        | ||g|R  E d {V  d S r   )r  r  r  apply)r;   ri   r;  r   r  r  s        r>   r  zEdgeRule.apply  sZ      (+$*5;tUG<e<<<<<<<<<<<<r@   c                 R    | j         j        d         }|                    |           S r   )r  r  __str__)r;   r  r  s     r>   r  zEdgeRule.__str__  s$    (+}}T"""r@   )rN   rO   rP   r)  rl   r  r  __classcell__)r  s   @r>   r  r    st         - - - - -
= = = = =
# # # # # # # # #r@   r  c                       e Zd ZdS )TopDownPredictEdgeRuleNrN   rO   rP   rR   r@   r>   r  r            Dr@   r  c                       e Zd ZdS )BottomUpEdgeRuleNr  rR   r@   r>   r  r    r  r@   r  c                       e Zd ZdS )BottomUpLeftCornerEdgeRuleNr  rR   r@   r>   r  r    r  r@   r  c                       e Zd ZdS )FundamentalEdgeRuleNr  rR   r@   r>   r  r    r  r@   r  c                      e Zd Zd5dZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddgZg dZd Zd Zd Zd Zd Zd Zd Zd Zd  Z d! Z!d" Z"d# Z#d$ Z$d% Z%d6d'Z&d( Z'd7d*Z(d+ Z)d, Z* e+            gZ, e-            gZ. e/            gZ0 e1            gZ2 e3            gZ4e,e.z   e4z   Z5e0e4z   Z6e2e4z   Z7d- Z8d. Z9d/ Z:d0 Z;d1 Z<d2 Z=d3 Z>d4 Z?d&S )8ChartParserAppChart Parser Applicationc                 x   |                      ||           d | _        	 t                      | _        | j                            |           | j                            d| j                   t          | j                  }t          | j                  }t          | j                  }|                    dd           |                    dd           |                    ddd           |                     | j                   | 	                                 | 
                    |           |                     |           |                     |           |                                  d | _        d | _        |                                  d S #  t#          d	           |                                   xY w)
NrW   rr   rs   r8  r-  r   r   r:  zError creating Tree View)_init_parserr\   r   r]   r^   r_   r   rx   r  _init_animation_init_chartview_init_rulelabelry  rv  _matrix_resultsrz  print)r;   r;  r  r]   frame3frame2frame1s          r>   rl   zChartParserApp.__init__  s   '6***
	DJJU###JOOM4<888 4:&&F4:&&F4:&&FKKXFK333KKXCK000KKXF1K===TZ(((  """  (((  (((v&&&   DL DM !!!!!	,---LLNNNs   E2F &F9c                 X    | j         d S | j                                          d | _         d S r   r   r;   r   s     r>   r_   zChartParserApp.destroy  s.    :F



r@   c                 J    t                      rdS  | j        j        |i | dS )z
        Enter the Tkinter mainloop.  This function must be called if
        this demo is created from a non-interactive program (e.g.
        from a secript); otherwise, the demo will close as soon as
        the script completes.
        N)r(   r\   r  r&  s      r>   r  zChartParserApp.mainloop!  s5     99 	F
T,V,,,,,r@   c                 J    || _         || _        |                                  d S r   )r2  _tokens_reset_parser)r;   r;  r  s      r>   r  zChartParserApp._init_parser0  s(    r@   c                 Z   t          | j                  | _        | j                            | j                   | j                                        | _        t                                          | j        | j                  D ]}| j        	                                | _
        d | _        d S r   )r#   r2  _cp
initializer  ri   rX   r!   r  step_cpstepr6  )r;   	_new_edges     r>   r  zChartParserApp._reset_parser5  s    &t}55DL)))hnn&& &--dk4=II 	 	I x}} r@   c                    t          t                      d                   | _        |                    d| j                   t	          |          | _        | j                            | j                            d                     t          dd| j                                                  | _	        t          d| j                                                  | _
        d S )	Nr2   r.  r/  r,  r7   r9   r)  r-  )r   r   r2  r3  r   _sizer   cgetr  r0  r1  r   s     r>   r  zChartParserApp._init_fontsD  s    &((6"2333/// D\\

t}))&11222[djnnFVFVWWW4:>>3C3CDDD


r@   c                     t          | j                  | _        | j                            d           t          | j                  | _        | j                            d           d| _        d S )Nr   r   r   )r   r\   _stepr   _animate
_animatingr   s    r>   r  zChartParserApp._init_animationP  s]    DJ''

q tz**! r@   c                     t          | j        |dd          | _        | j                            d| j                   d S )Nr   )r  r  r   )r  rX   _cvr   _click_cv_edge)r;   rh   s     r>   r  zChartParserApp._init_chartview\  s=    T[&AQOOOh(;<<<<<r@   c                 D   d}t          ||| j                  | _        t          |ddd| j                  | _        | j                            d           | j                            d           t          || j        d	
          }|                    d           d S )NzLast edge generated by:)rp   r2   r   r  r  )r   r   r  r2   r0  r/  Step)variablerp   r.  )r   r0  _rulelabel1_rulelabel2rx   r   r
  )r;   rh   ruletxtr  s       r>   r  zChartParserApp._init_rulelabel`  s    + gDNKKK "Xc
 
 
 	6***6***6DJVDDD		w	r@   c                    t          |          }t          |          }|                    dd           |                    dd           t          |ddd| j        	                              d
           t          |ddd| j        	                              d           t          |ddd| j        	                              d           t          |ddd| j        	                              d           t          |ddd| j        	                              d           t          |ddd| j        	                              d           t          |d                              d           t          |ddd| j	        	                              d           t          |d                              d           t          |ddd| j
        	                              d           t          |d                              d           t          |ddd| j        	                              d           d S )Nrr   r-  r8  r   rs   zReset
Parserz#90c0d0r   )rp   r   r.   rq   r.  r/  zTop Down
Strategyr0  zBottom Up
StrategyzBottom Up
Left-Corner StrategyzTop Down Init
Rulez#90f090zTop Down Predict
Ruler   r
  zBottom Up Predict
Rulez"Bottom Up Left-Corner
Predict RulezFundamental
Rule)r   rx   r   resettop_down_strategybottom_up_strategybottom_up_leftcorner_strategytop_down_inittop_down_predict	bottom_upbottom_up_leftcornerfundamental)r;   rh   r  r  s       r>   ry  zChartParserApp._init_buttonsl  s   vv,,,V,,,  J	
 	
 	
 $G$



 	% *	
 	
 	
 $F$


& +	
 	
 	
 $F$


2 6	
 	
 	
 $F$


& &	
 	
 	
 $F$


) )	
 	
 	
 $F$


fB$$&$111* N	
 	
 	
 $F$


fB$$&$1116 -	
 	
 	
 $F$


fB$$&$111$ $	
 	
 	
 $F$




r@   c                 F   | j                             d| j        j                   | j                             d| j        j                   | j                             d| j        j                   | j                             d| j        j                   | j                             d| j                   | j                             d| j                   | j                             d| j                   | j                             d| j	                   | j                             d	| j
                   | j                             d
| j                   | j                             d| j                   | j                             d| j                   | j                             d| j                   | j                             d| j                   | j                             d| j                   | j                             d| j                   | j                             d| j        fd           | j                             d| j        fd           | j                             d| j        fd           | j                             d| j        fd           d S )Nz<Up>z<Down>z<Prior>z<Next>rW   rm  z<F1>z<Control-s>r  z<Control-r>r!  r&  r  z<space>z<Control-g>z<Control-t>rd  c                 ,    |                     d          S r   r   r   as     r>   <lambda>z/ChartParserApp._init_bindings.<locals>.<lambda>      a r@   r  c                 ,    |                     d          S )Nr|   r"  r#  s     r>   r%  z/ChartParserApp._init_bindings.<locals>.<lambda>  r&  r@   r  c                 ,    |                     d          S )Nr   r"  r#  s     r>   r%  z/ChartParserApp._init_bindings.<locals>.<lambda>  r&  r@   rm  c                 R    |                     |                                           S r   )r   r  )r   rm  s     r>   r%  z/ChartParserApp._init_bindings.<locals>.<lambda>  s    QUUquuww;5G5G r@   )r\   r^   r  rB  rE  rI  rK  r_   help
save_chartr{  r  r  r  r  _stop_animationedit_grammaredit_sentencer  r
  r   s    r>   rz  zChartParserApp._init_bindings  s"   
 2333
$("6777
	48#3444
$("4555
t|444
t|444
	***
t777
t777
tz222
T3444
T4555
T?@@@
	4#7888
t'8999
t'9::: 	
@@@AAA
@@@AAA
@@@AAA 	
GGGHHHHHr@   c                 j
   t          | j                  }t          |d          }|                    dd| j        d           |                    dd| j        d           |                    dd| j        d	           |                                 |                    d
| j                   |                    d| j                   |                                 |                    dd| j	        d           |
                    dd|           t          |d          }|                    dd| j        d           |                    dd| j        d           |
                    dd|           t          |d          }|                    dd| j                   |                    dd| j                   |
                    dd|           t          |d          }|                    dd| j        d           |                    dd| j        d            |                    d!d| j        d"           |                                 |                    d#| j                   |                    d$| j                   |                    d%| j                   |                    d&| j                   |                    d'| j                   |
                    d(d|           t          |d          }|                    d)d| j        d*+           |                                 |                    d,d| j        d-           |                    d.d| j        dd/0           |                    d1d| j        d2d30           |                    d4d| j        d5d60           |
                    d7d|           t          |d          }|                    d8| j        dd9| j        :           |                    d;| j        dd<| j        :           |                    d=| j        dd>| j        :           |                    d?| j        dd@| j        :           |                    dA| j        ddB| j        :           |
                    dCd|           t          |d          }|                    dDd| j                   |                    dEd| j        dF           |
                    dGd|           | j                            |H           d S )INr   r  z
Save Chartr  r  r  r  zReset ChartzCtrl-rzSave Grammarr  zLoad Grammarr  r   r  r  r  zEdit Grammarr   zCtrl-g	Edit TextzCtrl-tEditrU   r{  )rO  r3   rq   ResultsViewzTop Down Strategyr!  zBottom Up Strategyr&  zBottom Up Left-Corner Strategyr  zBottom Up RulezBottom Up Left-Corner RulezTop Down Init RulezTop Down Predict RulezFundamental RuleApplyr  rm  )rO  r3   r  r  zNo Animation)rO  r3   r  valuezSlow Animationrd  )rO  r3   r  r5  r  zNormal Animationr|   r  zFast Animationr   r  AnimateTinyr   )rO  r  r3   r5  rq   Smallr  Medium   Large   Huge   ZoomAboutInstructionsF1Helpr  ) r	   r\   r  r+  r{  r  r  save_grammarload_grammarr_   r  r-  r.  view_matrixview_resultsr  r  r  r  r  r  r  r  add_checkbuttonr
  add_radiobuttonr  r  resizeaboutr*  r  )	r;   r  r  editmenuviewmenurulemenuanimatemenuzoommenuhelpmenus	            r>   rv  zChartParserApp._init_menubar  s   tz""+++O 	 	 	
 	
 	
 	O 	 	 	
 	
 	
 	1djh 	 	
 	
 	
 	   >4;LMMM>4;LMMM   At| 	 	
 	
 	
 	&AHEEE+++ % 	 	 	
 	
 	
 	& 	 	 	
 	
 	
 	&AHEEE+++ At7G 	 	
 	
 	
 	94CTUUU&AHEEE+++%*	 	 	
 	
 	
 	&+	 	 	
 	
 	
 	26	 	 	
 	
 	
 	   #3T^LLL.8Q 	 	
 	
 	
 	#7ASTTT)43H 	 	
 	
 	
 	#5t?OPPP'QXFFF7A...##A
 	$ 	
 	
 	
 	!!##### AQ 	$ 	
 	
 	
 	##"] 	$ 	
 	
 	
 	##$] 	$ 	
 	
 	
 	##"] 	$ 	
 	
 	
 	)q{KKK+++  ZK 	! 	
 	
 	
 	  ZK 	! 	
 	
 	
 	  ZK 	! 	
 	
 	
 	  ZK 	! 	
 	
 	
 	  ZK 	! 	
 	
 	
 	&AHEEE+++7aLLL Atyd 	 	
 	
 	
 	&AHEEE
w'''''r@   c                 |    || j         k    r|                     |           d S | j                                         d S r   )r6  _select_edger  r  r   s     r>   r  zChartParserApp._click_cv_edge}  sE    4?""d##### H!!!!!r@   c                 d    |                      |           | j                            |           d S r   )rS  r  r   r   s     r>   _select_matrix_edgez"ChartParserApp._select_matrix_edge  s2    $4     r@   c                    || _         | j                            |d           | j                            |           | j        r| j                            |           | j        r| j                            |           d S d S )Nz#f00)r6  r  r  r  r  r   r   s     r>   rS  zChartParserApp._select_edge  s    tV,,,4   < 	-L&&t,,,< 	)L""4(((((	) 	)r@   c                     d | _         | j                                         | j                                         | j        r| j                                         d S d S r   )r6  r  r   rZ  r  r   s    r>   _deselect_edgezChartParserApp._deselect_edge  s_    < 	'L$$&&&&&	' 	'r@   c                 8   |                      | j                                                   | j                                         | j                            |           | j                            |d           | j                            |           | j        r| j                                         | j        r| j                            |           | j        r| j                            |           | j	        r| j	                            |           d S d S )Nr  )
_display_ruler  current_chartruler  r   r  r  r   r  r  r   s     r>   _show_new_edgezChartParserApp._show_new_edge  s   4855778884   tV,,,4   < 	"L!!!< 	-L&&t,,,< 	)L""4(((= 	'M  &&&&&	' 	'r@   c                     d| _         	 t          | j        dt          pd                                dd           d S #  t          | j        dt          pd                                d           Y d S xY w)Nr   zHelp: Chart Parser Applicationrj  K   fixed)r   r2   r
  )r  r   r\   r)  stripr   s     r>   r*  zChartParserApp.help  s    	
0B%%''     	
0B%%''	      s	   2= 3A3c                 *    d}t          d|           d S )Nz5NLTK Chart Parser Application
Written by Edward LoperzAbout: Chart Parser Application)r   )r;   r   ABOUTs      r>   rK  zChartParserApp.about  s    M2E:::::r@   r  r  ))zPlaintext grammar file.cfgr  r  c                    t          | j        d          }|sdS 	 t          |d          5 }t          j        |          }ddd           n# 1 swxY w Y   || _        | j                            |           | j        r| j        	                    |           | j        r| j        
                                 | j        r| j        	                    |           | j        	                    |           dS # t          $ r} d}~ww xY w)zLoad a chart from a pickle filer  r  Nr  )r   r  r  r  r  rX   r  r   r  r   r   r  r  r  r   )r;   r   r~  r  ri   r   s         r>   r{  zChartParserApp.load_chart  s_   "+i
 
 
  	F	Sh%% ,F++, , , , , , , , , , , , , , ,DKHOOE"""| .&&u---| -**,,,} /''...Hu%%%%% 	S 	S 	S	Ss;   C7 AC7 AC7 AB C7 7
DDDc                     t          | j        d          }|sdS 	 t          |d          5 }t          j        | j        |           ddd           dS # 1 swxY w Y   dS # t          $ r} d}~ww xY w)zSave a chart to a pickle filer  r  Nr  )r   r  r  r  r  rX   r  r   r  s        r>   r+  zChartParserApp.save_chart  s    $+i
 
 
  	F	Rh%% 2DK1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 	R 	R 	R	Rs:   A! AA! AA! AA! !
A1+A,,A1c                    t          | j        d          }|sdS 	 |                    d          r=t          |d          5 }t	          j        |          }ddd           n# 1 swxY w Y   nMt          |          5 }t          j        |                                          }ddd           n# 1 swxY w Y   | 	                    |           dS # t          $ r}t          dd|z             Y d}~dS d}~ww xY w)z!Load a grammar from a pickle filerc  r  Nr  r  zError Loading GrammarUnable to open file: %r)r   GRAMMAR_FILE_TYPESr  r  r  r  r   
fromstringreadr_  r  r   )r;   r   r~  r  r;  r   s         r>   rE  zChartParserApp.load_grammar  s   "-
 
 
  	F		U  ++ <(D)) 2V$k&11G2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 (^^ <v!nV[[]];;G< < < < < < < < < < < < < < <W%%%%% 	U 	U 	U-/H8/STTTTTTTTT	Us_   %C A"C "A&&C )A&*C ='B0$C 0B44C 7B48C 
C:C55C:c                     t           j        d          }|sd S 	 |                    d          rLt          |d          5 }t	          j         j         j        f|           d d d            d S # 1 swxY w Y   d S t          |d          5 } j        	                                } fd|D             } fd|D             }|D ]}|
                    d|z             |D ]}|
                    d|z             	 d d d            d S # 1 swxY w Y   d S # t          $ r}t          d	d
|z             Y d }~d S d }~ww xY w)Nrc  r  r  r  r  c                 r    g | ]3}|                                 j                                        k    1|4S rR   rC   r2  r   r   pr;   s     r>   r   z/ChartParserApp.save_grammar.<locals>.<listcomp>	  s9    RRR1DM<O<O<Q<Q1Q1QQ1Q1Q1Qr@   c                 r    g | ]3}|                                 j                                        k    1|4S rR   rm  rn  s     r>   r   z/ChartParserApp.save_grammar.<locals>.<listcomp>	  s9    QQQ!4=;N;N;P;P0P0PA0P0P0Pr@   z%s
zError Saving Grammarrg  )r   rh  r  r  r  r  rX   r  r2  productionswriter  r   )	r;   r   r~  r  prodsr   restprodr   s	   `        r>   rD  zChartParserApp.save_grammar	  sD   $-
 
 
  	F	T  ++ 5(D)) FWKdl ;WEEEF F F F F F F F F F F F F F F F F F (C(( 5G M5577ERRRRRRREQQQQuQQQD % 5 5ftm4444 $ 5 5ftm444455 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5  	T 	T 	T,.G(.RSSSSSSSSS	Tsf   %D "A1$D 1A55D 8A59D >D A0D?D DD DD 
E#D<<Ec                 V   d| _         |                                  | j                            | j                   | j        r| j                            | j                   | j        r| j                                         | j        r!| j                            | j                   d S d S r   )	r  r  r  r   rX   r  r   r   r  r  s     r>   r  zChartParserApp.reset$	  s    $$$< 	0L""4;///< 	)L&&(((= 	1M##DK00000	1 	1r@   c                 F    t          | j        | j        | j                   d S r   )r   r\   r2  r_  r   s     r>   r-  zChartParserApp.edit_grammar3	  s!    $*dmT-=>>>>>r@   c                     || _         | j                            |           | j        r| j                            |           d S d S r   )r2  r  r_  r  r^  s     r>   r_  zChartParserApp.set_grammar6	  sO    W%%%= 	/M%%g.....	/ 	/r@   c                 |    d                     | j                  }d}d}t          | j        ||| j        |           d S )NrV  r0  zEnter a new sentence to parse.)ri  r  r   r\   set_sentence)r;   r   sentencer]   instrs        r>   r.  zChartParserApp.edit_sentence<	  s@    88DL))0DJ%1BEJJJJJr@   c                 z    t          |                                          | _        |                                  d S r   )r   splitr  r  )r;   r{  s     r>   rz  zChartParserApp.set_sentenceB	  s,    HNN,,--

r@   c                     | j         | j                                          t          | j        | j                  | _         | j                             d| j                   d S r   )r  r_   rT   r\   rX   r   rU  r   s     r>   rF  zChartParserApp.view_matrixJ	  sT    <#L  """&tz4;??!!(D,DEEEEEr@   c                     | j         | j                                          t          | j        | j        | j                  | _         d S r   )r  r_   r+  r\   rX   r2  r   s     r>   rG  zChartParserApp.view_resultsP	  s;    =$M!!###(T[$-PPr@   c                 l    d| _         |                     | j                                                   d S r   )r  rU  r  r  r   s    r>   rJ  zChartParserApp.resizeY	  s/    4:>>++,,,,,r@   c                 0   | j                             |           | j                            t	          |                      | j                            t	          |                      | j                            t	          |                      d S rR  )r  rU  r1  rO  rS  r0  r2  rT  s     r>   rU  zChartParserApp.set_font_size]	  s    t$$$
3t99*---  s4yyj 111c$iiZ00000r@   c                 N    t          | j                                                  S r   )rS  r  r  r   s    r>   rW  zChartParserApp.get_font_sizec	  s    4:>>##$$$r@   Nc                 &   | j         r	d| _         d S |                     d            | j                                        r| j        }|`|^| j                             ||          g           |                                 }|"| j        	                                 d | _        d S d S | j                            |           |                                  d S | j                            |           | j
                                        rd| _         |                                  d S | j        D ]}| n| j                                         | j        r| j                                         | j        r| j                                         d S d S )Nr   r   )r  rZ  r
  r  r6  r  set_strategy_apply_strategyr  r   r  _animate_strategyr  r   r  r  )r;   strategyedge_strategy	selectionnewedger   s         r>   apply_strategyzChartParserApp.apply_strategyj	  s   ? 	DOF 	4    :>> 	+I%M,E%%}}Y'?'?&@AAA..00 ?H((***&*DOOO #? %%h///$$&&&&& H!!(+++}  "" +"#&&((((( L  D| $!!!< *L'')))= +M((*****+ +r@   c                     d| _         d S r   )r  r   s     r>   r,  zChartParserApp._stop_animation	  s    r@   r   c                     | j         dk    rd S |                                 | j                                        dk    s| j                                        dk    rd S | j                                        dk    r"| j                            d| j                   d S | j                                        dk    r"| j                            d| j                   d S | j                            d| j                   d S d S )Nr   r   i  r|   i  r   )r  r  r  r  r
  r\   afterr  )r;   speeds     r>   r  z ChartParserApp._animate_strategy	  s    ?aF!!-}  ""a''4:>>+;+;q+@+@}  ""a''
  t'=>>>>>""$$))
  t'=>>>>>
  T%;<<<<< .-r@   c                 \    t          | j                  }||                     |           |S r   )nextr  r\  )r;   new_edges     r>   r  zChartParserApp._apply_strategy	  s0    %%)))r@   c                     |d| j         d<   d S t          |          }|| j         d<   | j                                        }d S )Nrj  rp   )r  rh  r  rW  )r;   ruler  r,  s       r>   rZ  zChartParserApp._display_rule	  sI    <')DV$$$t99D'+DV$8))++DDDr@   c                 <    |                      | j        d            d S r   )r  _TD_INITr   s     r>   r  zChartParserApp.top_down_init	  s     DM400000r@   c                 F    |                      | j        t                     d S r   )r  _TD_PREDICTr  r   s     r>   r  zChartParserApp.top_down_predict	  s"    D,.DEEEEEr@   c                 F    |                      | j        t                     d S r   )r  _BU_RULEr  r   s     r>   r  zChartParserApp.bottom_up	  s!    DM+;<<<<<r@   c                 F    |                      | j        t                     d S r   )r  _BU_LC_RULEr  r   s     r>   r  z#ChartParserApp.bottom_up_leftcorner	  s"    D,.HIIIIIr@   c                 F    |                      | j        t                     d S r   )r  _FUNDAMENTALr  r   s     r>   r  zChartParserApp.fundamental	  s"    D-/BCCCCCr@   c                 F    |                      | j        t                     d S r   )r  _BU_STRATEGYr  r   s     r>   r  z!ChartParserApp.bottom_up_strategy	  s"    D-/?@@@@@r@   c                 F    |                      | j        t                     d S r   )r  _BU_LC_STRATEGYr  r   s     r>   r  z,ChartParserApp.bottom_up_leftcorner_strategy	  s"    D02LMMMMMr@   c                 F    |                      | j        t                     d S r   )r  _TD_STRATEGYr  r   s     r>   r  z ChartParserApp.top_down_strategy	  s"    D-/EFFFFFr@   )r  r   )r   )@rN   rO   rP   rl   r_   r  r  r  r  r  r  r  ry  rz  rv  r  rU  rS  rX  r\  r*  rK  r  rh  r{  r+  rE  rD  r  r-  r_  r.  rz  rF  rG  rJ  rU  rW  r  r,  r  r  rZ  r$   r  r%   r  r   r  r   r  r"   r  r  r  r  r  r  r  r  r  r  r  r  rR   r@   r>   r  r    s       # # # #J  	- 	- 	-  
  
E 
E 
E
 
 
= = =
  
  
 O O ObI I I:]( ]( ](F" " "! ! !	) 	) 	)' ' '' ' ',  &; ; ; 34FG  S S S.R R RU U U$T T T,	1 	1 	1? ? ?/ / /K K K  F F FQ Q Q- - -1 1 1% % %&+ &+ &+ &+P  = = = =  , , ,  !!"H%%''(K##%%&H--//0K--//0L k)L8Ll*L!L0O1 1 1F F F= = =J J JD D DA A AN N NG G G G Gr@   r  c                     t          j        d          } d}d}t          |                                          }t	          d           |                                 D ]#}t	          dt          |          dz   f           $t	          d           t	          d|z             t	          d	           t          | |                                           d S )
NaW  
    # Grammatical productions.
        S -> NP VP
        VP -> VP PP | V NP | V
        NP -> Det N | NP PP
        PP -> P NP
    # Lexical productions.
        NP -> 'John' | 'I'
        Det -> 'the' | 'my' | 'a'
        N -> 'dog' | 'cookie' | 'table' | 'cake' | 'fork'
        V -> 'ate' | 'saw'
        P -> 'on' | 'under' | 'with'
    z*John ate the cake on the table with a forkzJohn ate the cake on the tablez
grammar= (z    ,)ztokens = %rz,Calling "ChartParserApp(grammar, tokens)"...)	r   ri  r   r~  r  rq  r  r  r  )r;  sentr  r  s       r>   appr  	  s    n	 G  8D+D$**,,F	,##%% * *vtDzzC'())))	#JJJ	-&
 !!!	
89997F##,,.....r@   __main__r  )Br)  os.pathr  r  tkinterr   r   r   r   r   r   r	   r
   r   r   tkinter.filedialogr   r   tkinter.fontr   tkinter.messageboxr   r   	nltk.drawr   r   r   nltk.draw.utilr   r   r   r   r   r   nltk.grammarr   r   nltk.parse.chartr   r   r   r    r!   r"   r#   r$   r%   r&   	nltk.treer'   	nltk.utilr(   r*   rT   r+  rc  r  r  r  r  r  r  r  r  rN   __all__rR   r@   r>   <module>r     sF   <                          B A A A A A A A       2 2 2 2 2 2 2 2 G G G G G G G G G G                * ) ) ) ) ) ) )                                       }   @I) I) I) I) I) I) I) I)bL) L) L) L) L) L) L) L)hJT JT JT JT JT JT JT JTdN N N N N N N Np# # # # # # # #,	 	 	 	 	X'9 	 	 		 	 	 	 	x!4 	 	 		 	 	 	 	+E 	 	 		 	 	 	 	($= 	 	 	cG cG cG cG cG cG cG cGL/ / /< zCEEE 'r@   