403Webshell
Server IP : 54.37.205.81  /  Your IP : 216.73.216.76
Web Server : nginx/1.22.1
System : Linux vps-249481fa 6.1.0-50-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.176-1 (2026-07-02) x86_64
User : debian ( 1000)
PHP Version : 8.2.32
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /lib/python3/dist-packages/nltk/app/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /lib/python3/dist-packages/nltk/app/__pycache__/chartparser_app.cpython-311.pyc
�

 T�czN��^�dZddlZddlZddlmZmZmZmZm	Z	m
Z
mZmZm
Z
mZddlmZmZddlmZddlmZmZddlmZmZmZddlmZmZmZmZm Z m!Z!dd	l"m#Z#m$Z$dd
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddl0m1Z1ddl2m3Z3Gd
�de��Z4Gd�d��Z5Gd�d��Z6Gd�d��Z7Gd�d��Z8Gd�d��Z9Gd�de9e.��Z:Gd�de9e'��Z;Gd�de9e&��Z<Gd�d e9e+��Z=Gd!�d"��Z>d#�Z?e@d$kr
e?��d%gZAdS)&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�eZdZejdZd�Zd�ZdS)�EdgeList�
rightarrowc���|�dd���|�ddd���|�dd	���|�d
dd�
��dS)N�terminalz#006000)�
foreground�arrow�symbol�0)�font�	underline�dotz#000000�nonterminal�blue)�	helvetica���bold)r.r2)�
tag_config)�self�
textwidget�optionss   �:/usr/lib/python3/dist-packages/nltk/app/chartparser_app.py�_init_colortagszEdgeList._init_colortags^s~�����j�Y��?�?�?����g�H���D�D�D����e�	��:�:�:�����f�3M�	�	
�	
�	
�	
�	
�c�L�g}|�d|���zdf��|�|jdf��t|�����D]�\}}||���kr|�d��t
|t��r-|�d|���zdf���t|�d|zdf����|�	��r|�d��|S)Nz%s	r5r/)z *r4z %sz %rr-)
�append�lhs�ARROW�	enumerate�rhsr4�
isinstancerr0�is_complete)r;�item�contents�i�elts     r>�
_item_reprzEdgeList._item_reprfs��������$�(�(�*�*�,�m�<�=�=�=������W�-�.�.�.�����
�
�+�+�	;�	;�F�A�s��D�H�H�J�J������
�.�.�.��#�{�+�+�
;����������!5�}� E�F�F�F�F�������j� 9�:�:�:�:������	+��O�O�M�*�*�*��r@N)�__name__�
__module__�__qualname__r�SYMBOLSrDr?rM�r@r>r*r*[s?������� ��.�E�
�
�
�
�
�
�
�
r@r*c��eZdZdZ	dd�Zd�Zd�Zd�Zd	�Zd
�Z	d�Z
d�Zd
�Zd�Z
d�Zdd�Zd�Zd�Zd�Zd�Zd�Zd�Zdd�Zd�Zd�Zd�ZdS)�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��nt|��|_|�|j��|�|j��|r|�
|j��nd|_i|_d|_|���dS)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__zChartMatrixView.__init__�s������������"����	'�!�&�)�)�D�J��J���U�#�#�#��J�O�O�M�4�<�8�8�8��O�O�D�J�'�'�'�'��v���D�J����$�*�%�%�%�����
�#�#�#��	(�����
�+�+�+�+�#'�D� ��������	�	�����r@c�d�t|d|j���}|�ddd���dS)N�Quit��text�command�bottomr�none��side�expand�fill)rr_�pack)r;�root�quits   r>r`zChartMatrixView._init_quit�s6���d����>�>�>���	�	�x���	�7�7�7�7�7r@c���t|dd���}|�ddddd�	��t|d
d
d���|_|j�dd�
��dS)N��sunken��border�reliefrrs���top)rvrw�padx�padyru���white)�width�height�
background)rvrw)rrxr�_canvas)r;ry�cframes   r>razChartMatrixView._init_matrix�sk���t�A�h�7�7�7�����1�6�����F�F�F��f�C���P�P�P����������0�0�0�0�0r@c�l�t|d���|_|j�ddd���dS)Nz0 edges�rprrsr�)rvrwru)rrdrx�r;rys  r>rczChartMatrixView._init_numedges�s;��$�T�	�:�:�:�����!�!���e�!�D�D�D�D�Dr@c���t|gdd���|_|j�dddd���|fd	�}|j�d
|��|j���dS)N��)r�r�r�r��bothr�)rurvrwr�c�2�|�d|��dS�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;ryr�s   r>rbzChartMatrixView._init_list�s����d�B�b��;�;�;��
��
���U�1�6���B�B�B��	1�	1�	1�	1�	
�
����"�-�-�-��
�������r@c�j�|j�dS	|j���n#YnxYwd|_dS�N�r\r_�r;�es  r>r_zChartMatrixView.destroy��D���:���F�	��J��� � � � ��	��D������
�
�
��%�)c�`�||jur$||_d|_|���dSdS�Nr)rXrfrg�r;ris  r>�	set_chartzChartMatrixView.set_chart�s6�����#�#��D�K��D�O��I�I�K�K�K�K�K�$�#r@c�V��|j�dSt|j����fd�t���D��}|jD]<}||���|���xxdz
cc<�=t���D�]}t|���D�]}|||dkrd}n\d�tddd|||zd	zz��tddd|||zd	zz
����}|j||}|j
�||�
��||f|jkr8|j
�|dd�
��|j
�
|����|j
�|dd�
������t|j�|j�����}|j�|��|j���|_|j�d|jz|jd<dSdS)Nc�B��g|]}d�t���D����S)c��g|]}d��S�rrR��.0rKs  r>�
<listcomp>z5ChartMatrixView.update.<locals>.<listcomp>.<listcomp>�s��+�+�+�Q�q�+�+�+r@��range�r��j�Ns  �r>r�z*ChartMatrixView.update.<locals>.<listcomp>�s.���>�>�>��+�+�%��(�(�+�+�+�>�>�>r@r�r�gray20z#00{:02x}{:02x}��2��
�rwz#00ffffr�)�outliner��black)�spanz%d edgesrp)r\�lenrYr�rX�start�end�format�min�maxr��
itemconfigr[�	tag_raise�listr�r��set�	num_edgesrfrd)	r;�
cell_edgesr�rKr��color�cell_tag�edgesr�s	        @r>�updatezChartMatrixView.update�sG����:���F�
������>�>�>�>�U�1�X�X�>�>�>�
��K�	6�	6�D��t�z�z�|�|�$�T�X�X�Z�Z�0�0�0�A�5�0�0�0�0��q���	P�	P�A��1�a�[�[�
P�
P���a�=��#�q�(�(�$�E�E�-�4�4��C��c�J�q�M�!�,<�&<�r�&A�!A�B�B��A�s�S�:�a�=��+;�%;�b�%@�@�A�A���E� �;�q�>�!�,����'�'��u�'�=�=�=��q�6�T�0�0�0��L�+�+�H�i�q�+�Q�Q�Q��L�*�*�8�4�4�4�4��L�+�+�H�g�Q�+�O�O�O�O�
P�"�T�[�'�'�T�-@�'�A�A�B�B���
���u�����+�/�/�1�1�����+�+5���+G�D� ��(�(�(�,�+r@c�f�|j�dd���|���dS)N�inactivebox�hidden��state�r�r�r��r;s r>�activatezChartMatrixView.activate��.������
�X��>�>�>����
�
�
�
�
r@c�f�|j�dd���|���dS)Nr��normalr�r�r�s r>�
inactivatezChartMatrixView.inactivate�r�r@c�B�d|j�|i��|<dS�Nr��re�
setdefault�r;�event�funcs   r>r�zChartMatrixView.add_callback��$��67���"�"�5�"�-�-�d�3�3�3r@Nc�L�|�
|j|=dS	|j||=dS#YdSxYwr��rer�s   r>�remove_callbackzChartMatrixView.remove_callback��A���<����&�&�&�
��O�E�*�4�0�0�0��
���������#c��||jvrdSt|j|�����D]}||��dSr��rer��keys�r;r��args�cb_funcs    r>r�zChartMatrixView._fire_callbacks��U�����'�'��F��D�O�E�2�7�7�9�9�:�:�	�	�G��G�T�N�N�N�	�	r@c���|j�dS||f|jkr$|j���|jkrdS||f|_|���|�d||��dS)N�select_cell)r\r[rXr�rfr�r��r;rKr�s   r>r�zChartMatrixView.select_cells{���:���F�
�q�6�T�(�(�(�T�[�-B�-B�-D�-D���-W�-W��F� �!�f������
�
�
�	
���]�A�q�1�1�1�1�1r@c��|j�dSd|_|j�g��|���dSr�)r\r[r�r�r�r�s r>�
deselect_cellzChartMatrixView.deselect_cells<���:���F�"����
���r�������
�
�
�
�
r@c�x�|j||fkr|���dS|�||��dSr�)r[r�r�r�s   r>�_click_cellzChartMatrixView._click_cellsH����1�a�&�(�(���� � � � � ����Q��"�"�"�"�"r@c�r�|j|����|j�|��dSr�)r�r�r��view�r;r�s  r>�	view_edgezChartMatrixView.view_edge s4�����$�)�)�+�+�&�&��
��������r@c��|j�dS|j|����|j�|��dSr�)r\r�r�r��markr�s  r>�	mark_edgezChartMatrixView.mark_edge$sA���:���F����$�)�)�+�+�&�&��
��������r@c�L�|j�dS|j�|��dSr�)r\r��unmarkr�s  r>�unmark_edgezChartMatrixView.unmark_edge*s+���:���F��
���$�����r@c��|j�dS|j|����|j�|��dSr�)r\r�r�r��markonlyr�s  r>�
markonly_edgezChartMatrixView.markonly_edge/sC���:���F����$�)�)�+�+�&�&��
���D�!�!�!�!�!r@c	�~�
�|j�dSdx}}d}|j}|�d��|j���dz�
t|d��|z
�
z}t|d��|z
|z
�
z}|�d��t
�
��D]�}|�|dz
||z|dzz|zt|��d�	��|�||z|dzz|z�
|z|zdzt|��d
�	��|�	|||dzz|z|�
z|z||dzz|zd���|�	||z|z|||z|z|�
z|zd�����|�
||||�
zz|�
z|zd�
���
fd�t
�
��D��|_t
�
��D]{}t
|�
��D]h}|�
||z|z||z|z|dz|z|z|dz|z|zd���}	|	|j||<|||fd�}
|�|	d|
���i�|t|d��t|d��}}|�
dd|dz|dzddd���}	|�
|	��|���dS)N�r��allr�r�r�r|r�)rp�anchor�n�.)�dash�r�c�B��g|]}d�t���D����S)c��g|]}d��Sr�rRr�s  r>r�z3ChartMatrixView.draw.<locals>.<listcomp>.<listcomp>bs��/�/�/���/�/�/r@r�r�s  �r>r�z(ChartMatrixView.draw.<locals>.<listcomp>bs.���B�B�B�A�/�/�e�A�h�h�/�/�/�B�B�Br@r�r�c�2�|�||��dSr�)r�)r�r;rKr�s    r>r�z ChartMatrixView.draw.<locals>.cbns���$�$�Q��*�*�*�*�*r@�
<Button-1>i�����d�gray50r�r�)rwr��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�dyrKr��tr��xmax�ymaxr�s             @r>rgzChartMatrixView.draw5s�����:���F�#%�%��j��
��L��	��������K�"�"�$�$�q�(���!�G�*�o�o��+�q�
0���!�H�+����+�j�8�A�
=��	��������q���	�	�A�
�M�M��a���R��"�q�&��:�!=�D��G�G�TW�
�
�
�
�
�M�M��B���a���+�-��B���#�a�'��!�W�W��	
�
�
�
�
�M�M���a�!�e��z�)��Q���$��a�!�e��z�)��
�
�
�
�
�M�M��Q���$���Q���$��Q���#��
�
�
�
�
�	
�����[�2��6�%9�2��6�J�;N�VW�	�	
�	
�	
�
C�B�B�B��q���B�B�B����q���	0�	0�A��1�a�[�[�

0�

0���&�&���F�[�(���F�Z�'���U�b�L�;�.���U�b�L�:�-�!�'����%&���A��q�!�#'�1��+�+�+�+��
�
�1�l�B�/�/�/�/�

0� ��7��_�_�c�!�H�+�&6�&6�d��
������3�J��3�J����
�
�
��	
���A����	
���
�
�
�
�
r@c�*�|jj|i|��dSr��r\rx�r;r��kwargss   r>rxzChartMatrixView.pack��!����
���(��(�(�(�(�(r@)TrUFr�)rNrOrP�__doc__rlr`rarcrbr_r�r�r�r�r�r�r�r�r�r�r�r�r�rrgrxrRr@r>rTrT{s���������
QV�����<8�8�8�1�1�1�E�E�E����������#H�#H�#H�J������8�8�8��������
2�
2�
2����#�#�#������� � � � �
"�"�"�L�L�L�\)�)�)�)�)r@rTc�Z�eZdZdd�Zdd�Zd�Zd�Zd�Zd�Zd	�Z	d
�Z
d�Zd�Zd
�Z
d�ZdS)�ChartResultsViewTc�(�||_||_g|_d|_g|_d|_d|_|rOt|��|_|j�	d��|j�
d|j��nt|��|_|r�t|j��}|�
ddd���t|d|j�	���
d
���t|d|j�	���
d
���t|d|j�	���
d
���t#|jd���|_|j�
ddd���|���dS)Nr�z!Chart Parser Application: ResultsrWrrr�xrtrnro�right�ruz	Print All�leftzPrint Selectionr�)�closeenoughr�r�r�)rX�_grammar�_trees�_y�_treewidgets�
_selection�
_selectboxrr\r]r^r_rrxr�	print_all�print_selectionr�_cframer�)r;rhri�grammarrj�buttonss      r>rlzChartResultsView.__init__�s��������
�����������������	'�!�&�)�)�D�J��J���@�A�A�A��J�O�O�M�4�<�8�8�8�8��v���D�J��	��D�J�'�'�G��L�L�h�q�s�L�;�;�;��7����>�>�>�C�C��C�Q�Q�Q��7��d�n�E�E�E�J�J�PV�J�W�W�W��7�!2�D�<P�Q�Q�Q�V�V��
W�
�
�
�
#�4�:�2�>�>�>�������u�Q�V��<�<�<�	
���
�
�
�
�
r@Nc��|j�dS|�d|���|j���krdS|���d|j���fkrdS|j�|j�����D] }||jvr|�	|���!dSr�)
r\rCr2r�r�rXr�parsesr3�_add)r;r��parses   r>r�zChartResultsView.update�s����:���F����x�x�z�z�T�]�0�0�2�2�2�2����y�y�{�{�q�$�+�"8�"8�":�":�;�;�;����[�'�'��
�(;�(;�(=�(=�>�>�	!�	!�E��D�K�'�'��	�	�%� � � ��	!�	!r@c�z�|j�|��|j���}t	||��}|j�|��|j�|d|j��|�|j	��|�
��ddz|_dS)Nr�r�)r3rBr:�canvasrr5�
add_widgetr4�
bind_click�_click�bbox)r;r@r�
treewidgets    r>r?zChartResultsView._add�s�������5�!�!�!�
�L���!�!��(��E�2�2�
�	
�� � ��,�,�,�����
�B���8�8�8�	���d�k�*�*�*��/�/�#�#�A�&��+����r@c��|j���}|j�|�|j��||_|���\}}}}|�||||dd���|_dS)Nr|z#088)r�r�)r:rBr6rr7rFr)r;�widgetr�x1�y1�x2�y2s       r>rEzChartResultsView._click�st���L���!�!���?�&�
�H�H�T�_�%�%�%� ���!�;�;�=�=���R��R��,�,�R��R��1�f�,�U�U����r@c���||���d<|���D]3}t|t��r|�||���.||d<�4dS)Nr�)�label�subtreesrGr�_color)r;rGr��childs    r>rQzChartResultsView._color�sr��&+�
�����7�#��(�(�*�*�	'�	'�E��%�!2�3�3�
'����E�5�)�)�)�)�!&��g���		'�	'r@c�J�|j�dS|j���dSr�)r\r:�
print_to_filer�s  r>r8zChartResultsView.print_all�s)���:���F���"�"�$�$�$�$�$r@c�R�|j�dS|j�tdd��dS|j���}|jD]%}||jur|j�|���&|�|j��|j�	��\}}}}|j�
d|z
d|z
��d||z
dz�d||z
dz��|d<|j���|jg|_|���|�
��dS)NzPrint ErrorzNo tree selectedr�z0 0 r�� �scrollregion)r\r6rr:rBr5�destroy_widgetrr7rF�moverT�clearr�)r;r�rrIrJrKrLrMs        r>r9z ChartResultsView.print_selection�s2���:���F��?�"��m�%7�8�8�8�8�8���#�#�%�%�A��+�
8�
8�����0�0��L�/�/��7�7�7��
�H�H�T�_�%�%�%�#��3�3�5�5��R��R���O� � ��b��"�r�'�2�2�2� D�r�B�w��|� D� D�b�2�g��l� D� D�A�n���L�&�&�(�(�(�"&�� 1�D���J�J�L�L�L��K�K�M�M�M�M�Mr@c��|j�dS|jD]}|j�|���g|_g|_|j�1|j����|j��d|_d|_	dS)Nr�)
r\r5r:rXr3r6rBrr7r4)r;rGs  r>rZzChartResultsView.clear�s����:���F��+�	4�	4�J��L�'�'�
�3�3�3�3��������?�&��L���!�!�(�(���9�9�9��������r@c�d�|���||_|���dSr�)rZrXr�r�s  r>r�zChartResultsView.set_charts'���
�
����������
�
�
�
�
r@c�d�|���||_|���dSr�)rZr2r��r;r;s  r>�set_grammarzChartResultsView.set_grammar	s'���
�
������
����
�
�
�
�
r@c�j�|j�dS	|j���n#YnxYwd|_dSr�r�r�s  r>r_zChartResultsView.destroyr�r�c�*�|jj|i|��dSr�r%r&s   r>rxzChartResultsView.packr(r@)Tr�)rNrOrPrlr�r?rErQr8r9rZr�r_r_rxrRr@r>r+r+�s�����������B!�!�!�!�,�,�,�$V�V�V�'�'�'�%�%�%�
���*
�
�
����
���
���)�)�)�)�)r@r+c���eZdZdZdejdejdd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�Zd�Zd�ZddgZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd �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���dgdz}t|��|_d|_d|_|j|_|j|_d|ji|_|j|_d|_t��|_
|j
�d��|j
�d|j
��|j
�d|j
��|�|j
��|�|j
��|�|j
��|�|j
��|�|j
��|D]}|�|���dS)N���NonezChart ComparisonrW�<Control-x>)r�_emptychart�
_left_name�_right_name�_left_chart�_right_chart�_charts�
_out_chart�	_operatorrr\r]r^r_�
_init_menubar�_init_chartviews�
_init_divider�
_init_buttons�_init_bindings�
load_chart)r;�chart_filenames�faketok�filenames    r>rlzChartComparer.__init__Bs^���$��(�� ��>�>���!���!����+��� �,����� 0�1����*�������T�T��
��
���+�,�,�,��
���
�t�|�4�4�4��
���
�t�|�4�4�4�	
���4�:�&�&�&����d�j�)�)�)����4�:�&�&�&����4�:�&�&�&����D�J�'�'�'�(�	&�	&�H��O�O�H�%�%�%�%�	&�	&r@c�j�|j�dS	|j���n#YnxYwd|_dSr�r�r�s  r>r_zChartComparer.destroyhr�r�c��dSr�)r\�mainloopr&s   r>r�zChartComparer.mainloopqs���r@c���t|��}t|d���}|�ddd|j���|�ddd|j���|���|�dd	|jd
���|�dd|�
��t|d���}|�d|jd���|�d|jd���|�d|j	d���|���|�d|j
���|�dd|�
��|j�|���dS)Nr��tearoff�
Load Chart�Ctrl-o)rO�acceleratorr3rqzSave Output�Ctrl-s�Exitr��Ctrl-x�rOr3rqr��File�rOr3�menu�Intersection�+)rOrqr��Union�*�
Differencerd�Swap Charts�rOrq�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>rvzChartComparer._init_menubarys����t�*�*�����+�+�+������ ���*�		�	
�	
�	
�	���� ���*�		�	
�	
�	
�	��� � � �����A�t�|��	�	
�	
�	
�	���&�A�H��E�E�E��g�q�)�)�)����� �$�*<�#�	�	
�	
�	
�	����$�+�3��O�O�O������(8�c�	�	
�	
�	
�	�����������8H��I�I�I����)�q�v��F�F�F�	
�
���w��'�'�'�'�'r@c�Z�t|dd���}|�ddd���dS)Nr|r}r~r�r-)rurw�ipady)rrx)r;ry�dividers   r>rxzChartComparer._init_divider�s4����Q�x�8�8�8�����%�c���3�3�3�3�3r@c�~�d}d}t|d���}|�ddd���t|d	d
���}|�dd
ddd���t|t|j�����|j���|_|j�ddd���t||j	dd���|_
|j
�ddddd���|j
�d|j��|j
�d|j
��|j
���t|dd	d|���|_|j�ddd���t|d	d
���}|�dd
ddd���t|t|j�����|j���|_|j�ddd���t||j	dd���|_|j�ddddd���|j�d|j��|j�d|j
��|j���t|dd	d|����ddd���t|d	d
���}|�dd
ddd���t|d���|_|j�dd �!��t||j	dd���|_|j�ddddd���|j�d|j��|j�d|j
��|j���dS)"N)r0����)r7r�z#c0c0c0�r�r�r�r�rtr��groover~r0rk�)rur�r�rvrw)rqr�r-)rur�rwFT)rjrkrrr�r�rV)rpr�r�r2)rur�r��=�Outputr��	)rur�)rrxrr�rsr��_select_left�_left_selectorrTrn�_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>rwzChartComparer._init_chartviews�s��� ��#���d�y�1�1�1��
�
�
��a�f�
�5�5�5��%��(�;�;�;�	����F���1�6��J�J�J�/��t�D�L�-�-�/�/�0�0�$�:K�
�
�
���	
�� � �e�!�#� �>�>�>�+��t�'�%�t�
�
�
���	
����H�1�1�Q�V��T�T�T���&�&�x��1A�B�B�B���&�&�}�d�6F�G�G�G���$�$�&�&�&����1���
�
�
���	
�����a�a��8�8�8��%��(�;�;�;�	����F���1�6��J�J�J�0��t�D�L�-�-�/�/�0�0�$�:L� 
� 
� 
���	
��!�!�u�1�3�!�?�?�?�,��t�'�%�t�
�
�
���	
����X�A�A�a�f��U�U�U���'�'��$�2B�C�C�C���'�'�
�t�7G�H�H�H���%�%�'�'�'�	�e�#�Q�9�6�J�J�J�O�O��a�a�	P�	
�	
�	
�
�%��(�;�;�;�	����F���1�6��J�J�J��	��9�9�9�������%�a��0�0�0�*��t�'�%�t�
�
�
���	
����8�!�!�A�F��S�S�S���%�%�h��0@�A�A�A���%�%�m�T�5E�F�F�F���#�#�%�%�%�%�%r@c�N�t|��}|�dddd���t|d|j����d�	��t|d
|j����d�	��t|d|j����d�	��t|d�
���d�	��t|d|j����d�	��t|d|j����d�	��dS)Nrrr�r-r)rur�rwrvr�ror0r/r�r�r�r
r�z
Detach Outputr.)rrxrr�r�r�r��_detach_out)r;ryr<s   r>ryzChartComparer._init_buttons�s8����+�+�����(���Q��?�?�?��w�^�T�5G�H�H�H�M�M��	N�	
�	
�	
�	�w�W�d�k�:�:�:�?�?�V�?�L�L�L��w�\�4�3C�D�D�D�I�I�v�I�V�V�V�
�g�R� � � �%�%�6�%�2�2�2��w�]�D�4D�E�E�E�J�J�PV�J�W�W�W��w�_�d�6F�G�G�G�L�L��	M�	
�	
�	
�	
�	
r@c�<�|�d|j��dS)N�<Control-o>)r^r�r�s  r>rzzChartComparer._init_bindings�s���	�	�-��!7�8�8�8�8�8r@c���||_|j||_|j�|j��|dkr|j���|���dS�Nrl)rorsrqr�r�r��	_apply_op�r;�names  r>r�zChartComparer._select_left�sf������<��-�����#�#�D�$4�5�5�5��6�>�>���(�(�*�*�*��������r@c���||_|j||_|j�|j��|dkr|j���|���dSr�)rprsrrr�r�r�r�r�s  r>r�zChartComparer._select_rightsg����� �L��.�����$�$�T�%6�7�7�7��6�>�>���)�)�+�+�+��������r@c���|jdkr|���dS|jdkr|���dS|jdkr|���dSdS)Nrdrhrg)rur�r�r�r�s r>r�zChartComparer._apply_op	sr���>�S� � ���������
�^�t�
#�
#��K�K�M�M�M�M�M�
�^�u�
$�
$���� � � � � �%�
$r@�zPickle file�.pickle�z	All filesr�c��t|jd���}|sdS	t|d��5}tj|j|��ddd��dS#1swxYwYdS#t$r!}tdd|�d|����Yd}~dSd}~wwxYw)Nr���	filetypes�defaultextension�wbzError Saving Chart�Unable to open file: �
)r�CHART_FILE_TYPES�open�pickle�dumprt�	Exceptionr�r;r�r~�outfiler�s     r>r�zChartComparer.save_chart_dialogs��$��+�i�
�
�
���	��F�	W��h��%�%�
6����D�O�W�5�5�5�
6�
6�
6�
6�
6�
6�
6�
6�
6�
6�
6�
6����
6�
6�
6�
6�
6�
6���	W�	W�	W��*�,U�H�,U�,U�RS�,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|jd���}|sdS	|�|��dS#t$r!}t	dd|�d|����Yd}~dSd}~wwxYw)Nr�r�zError Loading Chartr�r�)r
r�r{r�r)r;r�r~r�s    r>r�zChartComparer.load_chart_dialog"s���"��+�i�
�
�
���	��F�	X��O�O�H�%�%�%�%�%���	X�	X�	X��+�-V�X�-V�-V�ST�-V�-V�W�W�W�W�W�W�W�W�W�����	X���s�3�
A�A�Ac�\�t|d��5}tj|��}ddd��n#1swxYwYtj�|��}|�d��r
|dd�}|�d��r
|dd�}||j|<|j�	|��|j
�	|��|j|jur|j�
|��dS|j|jur|j
�
|��dSdS)N�rbr�i����z.charti����)r�r��load�os�path�basename�endswithrsr��addr�rqrnr�rr)r;r~�infilerir�s     r>r{zChartComparer.load_chart-sj��
�(�D�
!�
!�	(�V��K��'�'�E�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(�	(����	(�	(�	(�	(��w����)�)���=�=��#�#�	�����9�D��=�=��"�"�	�����9�D�"���T�������%�%�%��� � ��&�&�&���t�/�/�/���#�#�D�)�)�)�)�)�
�
�$�"2�
2�
2�� �$�$�T�*�*�*�*�*�3�
2s�2�6�6c��|j���|j���|j���dSr�)r�r�r�r�r�s r>�_update_chartviewsz ChartComparer._update_chartviews@sG���� � �"�"�"���!�!�#�#�#�����!�!�!�!�!r@c�v�||jvr|j�|��n|j���||jvr|j�|��n|j���||jvr|j�|��dS|j���dSr�)rqr�rr�rrr�rtr�r�s  r>r�zChartComparer.select_edgeIs����4�#�#�#���+�+�D�1�1�1�1���)�)�+�+�+��4�$�$�$���,�,�T�2�2�2�2���*�*�,�,�,��4�?�"�"���*�*�4�0�0�0�0�0���(�(�*�*�*�*�*r@c��|j�||��|j�||��|j�||��dSr�)r�r�r�r�r�s   r>r�zChartComparer.select_cellWsS����%�%�a��+�+�+���&�&�q�!�,�,�,���$�$�Q��*�*�*�*�*r@c��|���sdSt|j�����}|jD]!}||jvr|�|g���"|�d|��dS)Nrd��_checkcompatrrq�tokensrr�insert�_update�r;�	out_chartr�s   r>r�zChartComparer._difference`s���� � �"�"�	��F��$�*�1�1�3�3�4�4�	��$�	+�	+�D��4�,�,�,�� � ��r�*�*�*�����S�)�$�$�$�$�$r@c��|���sdSt|j�����}|jD]!}||jvr|�|g���"|�d|��dS)Nrgr�r�s   r>r�zChartComparer._intersectionks���� � �"�"�	��F��$�*�1�1�3�3�4�4�	��$�	+�	+�D��t�(�(�(�� � ��r�*�*�*�����U�I�&�&�&�&�&r@c�*�|���sdSt|j�����}|jD]}|�|g���|jD]}|�|g���|�d|��dS)Nrh)r�rrqr�r�rrr�r�s   r>r�zChartComparer._unionvs���� � �"�"�	��F��$�*�1�1�3�3�4�4�	��$�	'�	'�D����T�2�&�&�&�&��%�	'�	'�D����T�2�&�&�&�&����T�9�%�%�%�%�%r@c��|j|j}}|j�|��|j�|��dSr�)rorpr�r�r�)r;r0r.s   r>r�zChartComparer._swapcharts�sD���o�t�'7�e�������&�&�&��� � ��&�&�&�&�&r@c��|j���|j���ksT|j���|j���ks |j|jks|j|jkrP|j|_|j�|j��|j���d|j	d<dSdS)Nr�rpFT)
rqr�rr�property_namesrnrtr�r�r�r�r�s r>r�zChartComparer._checkcompat�s�����#�#�%�%��):�)A�)A�)C�)C�C�C���.�.�0�0�D�4E�4T�4T�4V�4V�V�V���4�#3�3�3�� �D�$4�4�4�#�.�D�O���&�&�t��7�7�7���'�'�)�)�)�&.�D�O�F�#��5��4r@c���||_|j||jd<||_|j�|��d�|j|j|j��|j	d<dS)Nrpz{} {} {})
ru�	_OPSYMBOLr�rtr�r�r�rorpr�)r;�operatorr�s   r>r�zChartComparer._update�sl��!���!%���!9���v��#�����"�"�9�-�-�-�",�"3�"3��O��N���#
�#
������r@c��|j|_|j�|j��d|jd<|j���dS)NrVrp)rnrtr�r�r�r�r�s r>�_clear_out_chartzChartComparer._clear_out_chart�sL���*�����"�"�4�?�3�3�3�!$���v����#�#�%�%�%�%�%r@c�T�t|j|j|jd���dS)Nrp)r])rTr\rtr�r�s r>r�zChartComparer._detach_out�s(����
�D�O�4�?�6�;R�S�S�S�S�S�Sr@N)!rNrOrPr)rrQr�rlr_r�rvrxrwryrzr�r�r�r�r�r�r{r�r�r�r�r�r�r�r�r�r�r�rRr@r>rcrc s���������8��#�N�3��"�7�+���I�$&�$&�$&�L���-�-�-�%(�%(�%(�N4�4�4�;&�;&�;&�z

�

�

�9�9�9�������!�!�!�3�4F�G��
W�
W�
W�	X�	X�	X�+�+�+�&"�"�"�+�+�+�+�+�+�	%�	%�	%�	'�	'�	'�
&�
&�
&�'�'�'�
���"	
�	
�	
�&�&�&�T�T�T�T�Tr@rcc��eZdZdZdZdZdZdZd-d�Zd�Z	d.d�Z
d�Zd
�Zd�Z
d�Zd�Zd�Zd�Zd�Zd-d�Zd�Zd�Zd/d�Zd�Zd�Zd0d�Zd1d�Zd-d�Zd1d�Zd �Zd!�Zd"�Zd#�Z d$�Z!d-d%�Z"d&�Z#d'�Z$d/d(�Z%d)�Z&d*�Z'd-d+�Z(d,�Z)dS)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��|�dd��}|�dd��}|�dd��|_||_i|_g|_i|_i|_g|_d|_d|_	g|_
d|_|�st��}|�
d��|fd	�}|fd
�}|�d|��t|d|�
��}	|	�d���||_n||_|�|��|�|j��\|_|_d|jd<d|jd<|rjt-|jdd���}
|
�dd���t/|
d���|_d|jd<|j�d���nd|_|r9|�|jdd��\}}||c|_|_d |jd<nd|_|���|���|���|���|j�d!|j��dS)"z4
        Construct a new ``Chart`` display.
        �	draw_treer�
draw_sentencer��fontsizer8Nz
Chart Viewc�.�|���dSr��r_)r�r�s  r>�destroy1z$ChartView.__init__.<locals>.destroy1
������
�
�
�
�
r@c�.�|���dSr�r)r�s r>�destroy2z$ChartView.__init__.<locals>.destroy2rr@�q�Donerorrr/i,r�rr1�sunkr|�r�rr�)rwrur��r��#e0e0e0r�r�rr-r�z<Configure>) �get�	_fontsizerXre�_edgelevels�	_edgetagsrZ�	_treetoks�_treetoks_edge�_treetoks_index�
_tree_tags�_compactrr]r^rrxr\�_init_fonts�
_sb_canvas�	_chart_sb�
_chart_canvasrr�_sentence_canvas�_tree_sb�_tree_canvas�_analyzerg�_resize�_grow�
_configure)
r;riry�kwrrr�rr
�br��sbrBs
             r>rlzChartView.__init__�s���
�F�F�;��*�*�	������2�2�
����
�C�0�0���������������������"��� ��������
��<��$�$�C��I�I�l�#�#�#� #�
�
�
�
�!�
�
�
�
�
�H�H�S�(�#�#�#��s���:�:�:�A�
�F�F��F�!�!�!��D�J�J��D�J�	
�������04���t�z�/J�/J�,����+�'*���8�$�,.���=�)��	)��4�:�f�Q�?�?�?�F��K�K�V�(�K�3�3�3�$*�6�"�$=�$=�$=�D�!�2;�D�!�,�/��!�&�&�F�&�3�3�3�3�%)�D�!��	%��?�?�4�:�s�C�@�@�L�R��24�f�.�T�]�D�-�*-�D��h�'�'� $�D��	
�
�
�����	�	�����������
�
����	
����
�t��?�?�?�?�?r@c��tdd|j���|_td|j���|_tt	��d���|_|�d|j��dS)Nr7r9��family�weight�size�r*r,r2�r2�*Font)rr�	_boldfont�_fontr�_sysfont�
option_addr�s  r>rzChartView._init_fonts?sg���[��d�n�U�U�U�����4�>�B�B�B��
��&�(�(�6�"2�3�3�3��
�������/�/�/�/�/r@�yr�rrc�(�t|dd���}|�|||���t|d���}t|d���}|�d	d
���|�d|d
���|j|d<|j|d<||fS)zK
        Helper for __init__: construct a canvas with a scrollbar.
        r
r|r)rwrvrurr��vertical)�orientr.r4�rurwr0�yes�rurwrvrq�yscrollcommand)rrxrr
�yviewr�)r;ryrvrwrur�rBr's        r>rzChartView._sb_canvasFs����t�F�1�5�5�5������f�4��8�8�8���9�5�5�5���v�j�
1�
1�
1��
���W�3��'�'�'�����d�5��9�9�9����9�
�#%�6��� ��F�|�r@c�>�|j�ddd��dS)N�scroll����units�rr<r�s  r>�	scroll_upzChartView.scroll_upY�#���� � ��2�w�7�7�7�7�7r@c�>�|j�ddd��dS)Nr>r�r@rAr�s  r>�scroll_downzChartView.scroll_down\�#���� � ��1�g�6�6�6�6�6r@c�>�|j�ddd��dS)Nr>r?�pagesrAr�s  r>�page_upzChartView.page_up_rCr@c�>�|j�ddd��dS)Nr>r�rHrAr�s  r>�	page_downzChartView.page_downbrFr@c��|j���}tt|jd��||jztjdzz��}|j�|���|j�|jd���|dtjzz
|z|_|j	�|j
|j	d<dSdS)z/
        Grow the window, if necessary
        r�r|r
r�rN)rXrr�rr�	_unitsizer��_MARGIN�	configurer�_sentence_height)r;r�r�s   r>r#zChartView._growes���

�K�"�"�$�$�����"�7�+�,�,�a�$�.�.@�9�CT�WX�CX�.X�
�
��	
��$�$�5�$�1�1�1���$�$�D�,>�x�,H�$�I�I�I��!�i�&7�"7�7�1�<���� �,�.2�.C�D�!�(�+�+�+�-�,r@c�t�|j�t|�����|j�t|�����|j�t|�����|���|���|���dS�N)r,)r1rO�absr0r2r!r#rg�r;r,s  r>�
set_font_sizezChartView.set_font_sizezs����
���3�t�9�9�*��-�-�-��� � �s�4�y�y�j� �1�1�1��
���c�$�i�i�Z��0�0�0��
�
�����
�
�����	�	�����r@c�*�t|j��Sr�)rSrr�s r>�
get_font_sizezChartView.get_font_size�s���4�>�"�"�"r@c��|j���}|jdtjzz
|z|_|���dS)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)rXrr�r�rNrMrg)r;r�r�s   r>r$zChartView._configure�sC��
�K�"�"�$�$���'�A�	�(9�$9�9�Q�>����	�	�����r@c�x�|�{||_g|_i|_|���|���|���|���|���dS|jD] }||jvr|�	|���!|���dS)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)
rXrrZr!r#rg�
erase_treer"r�	_add_edge)r;rir�s   r>r�zChartView.update�s������D�K�!�D���D�K��M�M�O�O�O��J�J�L�L�L��I�I�K�K�K��O�O�����L�L�N�N�N�N�N���
)�
)���t�~�-�-��N�N�4�(�(�(���L�L�N�N�N�N�Nr@c���|���\}}|j|D]Q}|���\}}||cxkr|ks(n||cxkr|ksn||cxkr
|cxkr|krn�NdS�RdS)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_conflictzChartView._edge_conflict�s����9�9�;�;���R��)�#�.�	�	�I� �~�~�'�'�H�R���b�
�
�
�
�2�
�
�
�
�2��=�=�=�=�b�=�=�=�=�b�B�6J�6J�6J�6J�"�6J�6J�6J�6J��6J�6J�6J�6J�6J��t�t�7K��ur@c	�J�|j}t|t��r�|���}g}|���D]n}t|t
��r5|�t|��������L|�t|�����od�
|��}n|���}d}||fD]�}|�dd||jdd���}|�
|��}	|�|��|	d}
t|���d��}t|j|
|z��|_t|j|	d	|	dz
��|_��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)
        rVrjr�nwr0�rpr2r�justifyr|r�r�N)rrGr&rCrFrrB�strr0r�joinrr0rFrr��lengthrM�_text_height)r;r�rrC�rhseltsrLrF�srrFr��edgelens            r>�
_analyze_edgezChartView._analyze_edge�s���
����d�H�%�%�	��(�(�*�*�C��G��x�x�z�z�
.�
.���c�;�/�/�.��N�N�3�s�z�z�|�|�#4�#4�5�5�5�5��N�N�4��9�9�-�-�-�-��(�(�7�#�#�C�C��(�(�*�*�C��C��s��		J�		J�A��-�-��1�1�4�>�$�� ���C��6�6�#�;�;�D�
�H�H�S�M�M�M���G�E��$�+�+�-�-��+�+�G� ������A�A�D�N� #�D�$5�t�A�w��a��7H� I� I�D���		J�		Jr@rc���t|t��rdS||jvrdS|�|��|���|js^|j�|g��t|j��dz
}|�	||��|�
��dSd}	|t|j��krF|j�g��|�
��|t|j��k�F||kr7|�||��s!|j|�|��n|dz
}��|�	||��dS)z�
        Add a single edge to the ChartView:

            - Call analyze_edge to recalculate display parameters
            - Find an available level
            - Call _draw_edge
        Nr�r)rGr rror#rrrBr��
_draw_edger"rc)r;r��minlvlr]s    r>r[zChartView._add_edge�st���d�H�%�%�	��F��4�>�!�!��F����4� � � ��
�
�����}�	���#�#�T�F�+�+�+��d�&�'�'�!�+�C��O�O�D�#�&�&�&��L�L�N�N�N��F���
	���T�-�.�.�.�.�� �'�'��+�+�+���������T�-�.�.�.�.�
�f�}�}�T�%8�%8��s�%C�%C�}�� ��%�,�,�T�2�2�2��
�1�H�C�
	�	
����c�"�"�"�"�"r@c�J�d}tt|j����D]}||j|vr|}n�|�dS|dz|jz}|jdz}|j�dd��|jdkr(|j�d||z
|jz��dSdS)Nr�r��movetog�?r)r�r�r�_chart_level_sizerkrr<�
_chart_height)r;r��levelrKr4r s      r>r�zChartView.view_edges������s�4�+�,�,�-�-�	�	�A��t�'��*�*�*�����+��=��F�
�Q�Y�$�0�0��
�
��
#���� � ��3�/�/�/����"�"���$�$�X��B��$�:L�/L�M�M�M�M�M�#�"r@c�f�|j}|���|jztjz}|���|jztjz}||kr|t
d|jdz��z
}|dz|jz}|�||||dd���}t|t��r�g}|���D]n}	t|	t��r5|�
t|	��������L|�
t!|	�����o|���}
ng}d}
d�|d	|
���}d�||
d	���}|�|dz|||jd
���}
|�|
��dd
z}|�|
��d|�|
��dzdz}|�|dz
|dz
|dz|dz��}|�|d
z|||jd
���}|�||zdz|t|�����d|j���}||
|||f|j|<||fd�}|�|
d|��|�|d|��|�|d|��|�|d|��|�|d|��|�|��d	S)z6
        Draw a single edge on the ChartView.
        �r�r��lastr�)r/r�rrVNre)rpr2rr|�rm�rprr2c�2�|�d|��dSr�r�)r�r;r�s   r>r�z ChartView._draw_edge.<locals>.cb<r�r@r)rr�rMr�rNr�r�rurrGr&rFrrBrhr0rr4rirr1rF�create_ovalrCr0rr�_color_edge)r;r�r]rrJrLr4�linetagrFrL�pos�rhs1�rhs2�rhstag1�dotx�doty�dottag�rhstag2�lhstagr�s                    r>rqzChartView._draw_edges��
����Z�Z�\�\�D�N�
*�Y�->�
>��
�X�X�Z�Z�$�.�
(�9�+<�
<��
��8�8��#�a���!�+�,�,�,�B�
�1�W��.�.���-�-��A�r�1�F�!�-�D�D���d�H�%�%�
	��C��x�x�z�z�
*�
*���c�;�/�/�*��J�J�s�3�:�:�<�<�0�0�1�1�1�1��J�J�t�C�y�y�)�)�)�)��(�(�*�*�C�C��C��C��x�x��D�S�D�	�"�"���x�x��C�D�D�	�"�"���-�-��Q����4�:�d�-�S�S���v�v�g���q�!�A�%�����w����"�Q�V�V�G�_�_�Q�%7�7�1�<�����t�a�x����4�!�8�T�A�X�F�F���-�-��q��!�$�T�Z�PT�-�U�U�����
�"�W��M�1�3�t�x�x�z�z�?�?�3�T�^��
�
��
!(��&�'�6�J���t�� �d�	1�	1�	1�	1�	
�
�
�7�L�"�-�-�-�	�
�
�7�L�"�-�-�-�	�
�
�7�L�"�-�-�-�	�
�
�6�<��,�,�,�	�
�
�6�<��,�,�,���������r@c�<�||jvrdS|j}|��|��||jvr
|j|}|j|}|�|d|���|�|d|���|�|d||���|�|d|���|�|d|���dS|j���}||jvr |�|j|��|���r3|���d|fkr|�|d	d
��dSt|t��r|�|dd��dS|�|d
d��dS)z�
        Color in an edge with the given colors.
        If no colors are specified, use intelligent defaults
        (dependent on selection, etc.)
        Nrr�r�r|�rwr�r�ry�#084�#042z#48cz#246z#00fz#008)rrrZr�rXrrrHr�rGr )r;r��	linecolor�	textcolorr�tagsr�s       r>rzChartView._color_edgeGs����t�~�%�%��F����� �Y�%:��t�{�"�"� �K��-�	��>�$�'�D�
�L�L��a��y�L�1�1�1�
�L�L��a��y�L�1�1�1�
�L�L��a��y�)�L�D�D�D�
�L�L��a��y�L�1�1�1�
�L�L��a��y�L�1�1�1��F���&�&�(�(�A��t�{�"�"�� � ���T�!2�3�3�3����!�!�
7�d�i�i�k�k�a��V�&;�&;�� � ��v�v�6�6�6�6�6��D�(�+�+�
7�� � ��v�v�6�6�6�6�6�� � ��v�v�6�6�6�6�6r@�#0dfc�D�||j|<|�|��dS)z
        Mark an edge
        N)rZr�r;r�r�s   r>r�zChartView.mark_edgefs*��!���D����������r@c���|�It|j�����}i|_|D]}|�|���dS|j|=|�|��dS)z/
        Unmark an edge (or all edges)
        N)r�rZr�r)r;r��old_marked_edgess   r>r�zChartView.unmark_edgems����<�#�D�K�$4�$4�$6�$6�7�7���D�K�(�
'�
'��� � ��&�&�&�&�
'�
'���D�!����T�"�"�"�"�"r@c�Z�|���|�||��dSr�)r�r�r�s   r>rzChartView.markonly_edgezs.�����������t�T�"�"�"�"�"r@c	��d}d}|j}|j���D]�}|�ddt	|��|jdd���}|�|��}|�|��|dtj	z}t||��}t||d|dz
��}��||_||_|jdtj
zz|_|j���D]}|�|���|jdz|_dtj|jzz|_|���d	S)
z�
        Analyze the sentence string, to figure out how big a unit needs
        to be, How big the tree should be, etc.
        �Frrer0rfr|r�r�N)rrX�leavesrrr1rFrr��
_LEAF_SPACINGr�rMrkrNrPr�roru�_TREE_LEVEL_SIZE�_tree_heightr")	r;�unitsize�text_heightr�leafrrFr�r�s	         r>r!zChartView._analyze~s\����������K�&�&�(�(�	>�	>�D��-�-��1�4��:�:�D�J�t�V� ���C��6�6�#�;�;�D�
�H�H�S�M�M�M���G�i�5�5�E��5�(�+�+�H��k�4��7�T�!�W�+<�=�=�K�K�!���'��� $� 1�A�	�8I�4I� I����K�%�%�'�'�	%�	%�D����t�$�$�$�$�"&�!2�Q�!6�����!;�d�>O�!O�P���	
�������r@c��|j}|j���|jztjdzz}t
|j��}|dz|jz|_	dd||j	f|d<|j
rdd||jf|j
d<dSdS)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|rrWN)rrXrrMr�rNr�rrurvr r�)r;rr��levelss    r>r"zChartView._resize�s���
�����&�&�(�(�4�>�9�I�<M�PQ�<Q�Q���T�%�&�&��$�q�j�D�,B�B�����5�$�*<�=��.����	Q�12�A�u�d�>O�0P�D��n�-�-�-�	Q�	Qr@c��d}|j}|j}|j}tj}g|_t
d|j���dz��D�]�}||j	z|z}|r-|�
|d||��}|�|��|r2|�
|d||j��}	|�|	��|�
|d||��}
|�|
��|�
|dzdt|��d|j���}|�|��|dzdkrK|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�rr�r|rer|�gray60r��gray80N)r rrr�rN�	_loclinesr�rXrrMrrrPrrr1r�)r;�BOTTOM�c1�c2�c3�marginrKr-�t1�t2�t3�t4s            r>�_draw_loclineszChartView._draw_loclines�s���
��
�
��
�
"��
�
���"������q�$�+�0�0�2�2�Q�6�7�7�	1�	1�A��D�N�"�V�+�A��
!��^�^�A�q�!�V�4�4�����R� � � ��
!��^�^�A�q�!�T�-B�C�C�����R� � � �����1�a��0�0�B��L�L���������A��q�t�A�w�w�t�$�*��U�U�B��L�L�����
�1�u��z�z��5��M�M�"�8�M�4�4�4��5��M�M�"�8�M�4�4�4��
�
�b�x�
�0�0�0�0��5��M�M�"�8�M�4�4�4��5��M�M�"�8�M�4�4�4��
�
�b�x�
�0�0�0�0�9	1�	1r@c	�`�|j���dkrdS|j}tj}tj}t|j�����D]�\}}||jz|z}||jz}||zdz}|�||t|��|j
dd���}	|�|	��}
|�|dz|
dtj
dzz
|dz
|
dtj
dzzd	d	�
��}|�|����dS)zDraw the sentence string.rNr|rr0rfr�r�z#f0f0f0r�)rXrrr�rNrEr�rMrrr1rFrr�r)r;rr�r4rKr�rJrLr-rrF�rts            r>�_draw_sentencezChartView._draw_sentence�s<���;�!�!�#�#�q�(�(��F��!���"����� ���!3�!3�!5�!5�6�6�	�	�G�A�t��T�^�#�f�,�B��d�n�$�B��b��A�
�A��-�-��1�4��:�:�D�J�s�F� ���C��6�6�#�;�;�D��#�#��Q���Q��9�2�Q�6�7��Q���Q��9�2�Q�6�7��!�
$���B�
�K�K��O�O�O�O�!	�	r@c�x�|jD]}|j�|���g|_d|_d|_dSr�)rr rrrr)r;rs  r>rZzChartView.erase_tree�sJ���?�	*�	*�C���$�$�S�)�)�)�)����"��� ����r@c��|�	|j�dS|�|j}|j|kr7d�|j�|��D��|_||_d|_t|j��dkrdS|jD]}|j�|���|j|j}|�	||�
����|���|j���|j
zdtjzz}|���tj|jzz}dd||f|jd<dS)Nc�<�g|]}t|t���|��SrR)rGr')r�r!s  r>r�z'ChartView.draw_tree.<locals>.<listcomp>
s(��X�X�X�A�J�q�RV�DW�DW�X�a�X�X�Xr@rr|rW)rrX�treesrrr�rr r�
_draw_treetokr��_draw_treecyclerrMr�rNr�r�rk)r;r�r�tree�w�hs      r>rzChartView.draw_treesS���<�D�/�7��F��<��&�D���$�&�&�X�X���):�):�4�)@�)@�X�X�X�D�N�"&�D��#$�D� ��t�~���!�#�#��F��?�	*�	*�C���$�$�S�)�)�)�)��~�d�2�3�����4������.�.�.�	
������
�K�"�"�$�$�t�~�5��I�<M�8M�M���K�K�M�M�Y�7�$�:K�K�L��-.��1�a�L���.�)�)�)r@c��|jdzt|j��z|_|�|j��dSr�)rr�rrrr�s r>�
cycle_treezChartView.cycle_tree"s<�� $� 4�q� 8�C���<O�<O�O������t�*�+�+�+�+�+r@c���t|j��dkrdSdt|j��z}|j}tj}|j���|jz|zdz
}|�|dd||j	���}|j
�|��|�|��\}}}}tt|j����D]�}|dt|j��|z
dz
zz
}	||jkrd}
nd}
|�|	|d	z|	d
z
||	d	z
|d	z|
d���}|j
�|��||fd
�}|�|d|����dS)Nr�z%d Treesr|�ne)rrpr2r�r�z#fffr�r�r�r�c�<�||_|���dSr�)rr)r�r;rKs   r>r�z%ChartView._draw_treecycle.<locals>.cbAs ��'(��$���� � � � � r@r)r�rr r�rNrXrrMrr0rrBrFr�r�create_polygonr)r;rOrr�r.r�_r4rKr-rwr�s            r>r�zChartView._draw_treecycle&s����t�~���!�#�#��F��S���0�0�0������"����&�&�(�(�4�>�9�F�B�Q�F���m�m�E�1�T��D�N�m�S�S������s�#�#�#��V�V�C�[�[�
��1�a���s�4�>�*�*�+�+�	.�	.�A���c�$�.�1�1�A�5��9�:�:�A��D�(�(�(�������"�"��1�r�6�1�q�5�!�Q��V�Q��V�$��#���C�
�O�"�"�3�'�'�'� $�q�
!�
!�
!�
!�
�J�J�s�L�"�-�-�-�-�#	.�	.r@c
���|j}tj}g}|D]x}t|t��r3|�|||dz��\}}|�|���J|�d|zdz|jzdz|z��|dz
}�y|r t|��t|��z}	nd|zdz|jzdz|z}	|dz
}|tj
|jzz}
|�|	|
ddt|�����d|j���}|j�|��|
tj
z|jz}t#||��D�]\}
}t|t��r?|r=|�|	|
|jz|
|dd���}|j�|��t|t��r@|s>|�|	|
|jz|
|dd	d
���}|j�|��t|t��s=|�|	|
|jz|
ddd���}|j�|����|	|fS)
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�)rrgrprwr2r�)r�rwz#048z2 3)r�rwr	i')r r�rNrGr'r�rBrM�sumr�r�rkrrhrOr0r�zipr)r;�treetok�index�depthrr��child_xsrR�child_x�nodex�nodeyr�childy�childxs              r>r�zChartView._draw_treetokGs���

����"�����	�	�E��%��&�&�
�!%�!3�!3�E�5�%�!�)�!L�!L��������(�(�(�(�����U��Q��$�.� @�1� D�v� M�N�N�N���
����	���M�M�C��M�M�1�E�E���Y��]�d�n�4�q�8�6�A�E��Q�J�E���3�d�6G�G�H���m�m������W�]�]�_�_�%�%�����
�
��	
����s�#�#�#���3�3�d�6G�G�� ��7�3�3�"	,�"	,�M�F�E��%��&�&�

,�5�

,��m�m���D�-�-�����
$������&�&�s�+�+�+��%��&�&�
,�u�
,��m�m���D�-�-������$������&�&�s�+�+�+��e�T�*�*�

,��m�m���D�-�-�����
$������&�&�s�+�+�+���e�|�r@c��|jr.|j�d��|���|jr.|j�d��|���|j�d��i|_tt|j	����D](}|j	|D]}|�
||����)|jD]}|�|���|�
��dS)z1
        Draw everything (from scratch).
        rN)r rrrr�rrr�r�rrqrXr[r�)r;r]r�s   r>rgzChartView.draw�s����	���$�$�U�+�+�+��N�N����� �	"��!�(�(��/�/�/����!�!�!���!�!�%�(�(�(������T�-�.�.�/�/�	+�	+�C��(��-�
+�
+������c�*�*�*�*�
+��K�	!�	!�D��N�N�4� � � � ��������r@c�B�d|j�|i��|<dSr�r�r�s   r>r�zChartView.add_callback�r�r@c�L�|�
|j|=dS	|j||=dS#YdSxYwr�r�r�s   r>r�zChartView.remove_callback�r�r�c��||jvrdSt|j|�����D]}||��dSr�r�r�s    r>r�zChartView._fire_callbacks�r�r@r�)r4r�rrr�)NN)r�)*rNrOrPr)r�rNr��_CHART_LEVEL_SIZErlrrrBrErIrKr#rUrWr$r�rcror[r�rqrr�r�rr!r"r�r�rZrr�r�r�rgr�r�r�rRr@r>r�r��s�������,�,�\�M��G�����W@�W@�W@�W@�r0�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�j7�7�7�7�>����#�#�#�#�#�#�#�#�$�$�$�LQ�Q�Q�('1�'1�'1�R���4!�!�!�9�9�9�9�@,�,�,�.�.�.�BN�N�N�N�`���28�8�8���������r@r�c�6��eZdZdZ�fd�Z�fd�Z�fd�Z�xZS)�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��|jjd}||_|jdz
|_dSr�)�	__class__�	__bases__�_edge�	NUM_EDGES)r;r��superr�s   �r>rlzEdgeRule.__init__�s+�����(��+����
���1�,����r@c'�r�K�|jjd}||jfz
}|j|||g|�R�Ed{V��dSr�)r�r�r��apply)r;rir;r�r�r�s     �r>r�zEdgeRule.apply�sZ�������(��+��
�$�*�����5�;�t�U�G�<�e�<�<�<�<�<�<�<�<�<�<�<�<r@c�R��|jjd}|�|��Sr�)r�r��__str__)r;r�r�s  �r>r�zEdgeRule.__str__�s$�����(��+���}�}�T�"�"�"r@)rNrOrPr)rlr�r��
__classcell__)r�s@r>r�r��st���������-�-�-�-�-�
=�=�=�=�=�
#�#�#�#�#�#�#�#�#r@r�c��eZdZdS)�TopDownPredictEdgeRuleN�rNrOrPrRr@r>r�r����������Dr@r�c��eZdZdS)�BottomUpEdgeRuleNr�rRr@r>r�r��r�r@r�c��eZdZdS)�BottomUpLeftCornerEdgeRuleNr�rRr@r>r�r��r�r@r�c��eZdZdS)�FundamentalEdgeRuleNr�rRr@r>r�r��r�r@r�c���eZdZd5d�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZddgZgd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd �Z d!�Z!d"�Z"d#�Z#d$�Z$d%�Z%d6d'�Z&d(�Z'd7d*�Z(d+�Z)d,�Z*e+��gZ,e-��gZ.e/��gZ0e1��gZ2e3��gZ4e,e.ze4zZ5e0e4zZ6e2e4zZ7d-�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��}|�dd���|�dd���|�ddd���|�|j��|�	��|�
|��|�|��|�|��|�
��d|_d|_|���dS#t#d	��|����xYw)
NrWrrrsr8r-r�r�r:zError creating Tree View)�_init_parserr\rr]r^r_rrxr�_init_animation�_init_chartview�_init_rulelabelryrv�_matrix�_resultsrz�print)r;r;r�r]�frame3�frame2�frame1s       r>rlzChartParserApp.__init__�s������'�6�*�*�*���
�	����D�J��J���U�#�#�#��J�O�O�M�4�<�8�8�8��4�:�&�&�F��4�:�&�&�F��4�:�&�&�F��K�K�X�F�K�3�3�3��K�K�X�C�K�0�0�0��K�K�X�F�1�K�=�=�=����T�Z�(�(�(�� � �"�"�"�� � ��(�(�(�� � ��(�(�(����v�&�&�&���� � � ��D�L� �D�M�
���!�!�!�!�!��	��,�-�-�-��L�L�N�N�N����s�E2F�&F9c�X�|j�dS|j���d|_dSr�r��r;r�s  r>r_zChartParserApp.destroys.���:���F��
��������
�
�
r@c�J�t��rdS|jj|i|��dS)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�zChartParserApp.mainloop!s5���9�9�	��F���
��T�,�V�,�,�,�,�,r@c�J�||_||_|���dSr�)r2�_tokens�
_reset_parser)r;r;r�s   r>r�zChartParserApp._init_parser0s(����
�����������r@c�Z�t|j��|_|j�|j��|j���|_t���|j|j��D]}�|j�	��|_
d|_dSr�)r#r2�_cp�
initializer�rirXr!r��step�_cpstepr6)r;�	_new_edges  r>r�zChartParserApp._reset_parser5s���&�t�}�5�5�������D�L�)�)�)��h�n�n�&�&���&���-�-�d�k�4�=�I�I�	�	�I���x�}�}���������r@c���tt��d���|_|�d|j��t	|��|_|j�|j�d����tdd|j������|_	td|j������|_
dS)	Nr2r.r/r,r7r9r)r-)rrr2r3r�_sizer��cgetrr0r1r�s  r>rzChartParserApp._init_fontsDs����&�(�(�6�"2�3�3�3��
�������/�/�/��D�\�\��
��
���t�}�)�)�&�1�1�2�2�2��[��d�j�n�n�FV�FV�W�W�W�����4�:�>�>�3C�3C�D�D�D��
�
�
r@c���t|j��|_|j�d��t|j��|_|j�d��d|_dS)Nr�r�r)rr\�_stepr��_animate�
_animatingr�s r>r�zChartParserApp._init_animationPs]���D�J�'�'��
��
���q�����t�z�*�*��
��
���!��������r@c��t|j|dd���|_|j�d|j��dS)Nr�)rrr�)r�rX�_cvr��_click_cv_edge)r;rhs  r>r�zChartParserApp._init_chartview\s=���T�[�&�A�Q�O�O�O�������h��(;�<�<�<�<�<r@c�D�d}t|||j���|_t|ddd|j���|_|j�d���|j�d���t||jd	�
��}|�d���dS)NzLast edge generated by:)rpr2rr�r�)r�r�rr2r0r/�Step)�variablerpr.)rr0�_rulelabel1�_rulelabel2rxrr
)r;rh�ruletxtrs    r>r�zChartParserApp._init_rulelabel`s���+�� ��g�D�N�K�K�K��� ��"�X�c���
�
�
���	
����6��*�*�*�����6��*�*�*��6�D�J�V�D�D�D���	�	�w�	�����r@c��t|��}t|��}|�dd���|�dd���t|ddd|j�	���d
���t|ddd|j�	���d
���t|ddd|j�	���d
���t|ddd|j�	���d
���t|ddd|j�	���d
���t|ddd|j�	���d
���t|d����d
���t|ddd|j	�	���d
���t|d����d
���t|ddd|j
�	���d
���t|d����d
���t|ddd|j�	���d
���dS)Nrrr-r8r�rszReset
Parserz#90c0d0r�)rpr�r.rqr.r/zTop Down
Strategyr0zBottom Up
StrategyzBottom Up
Left-Corner StrategyzTop Down Init
Rulez#90f090zTop Down Predict
Ruler�r
zBottom Up Predict
Rulez"Bottom Up Left-Corner
Predict RulezFundamental
Rule)rrxr�reset�top_down_strategy�bottom_up_strategy�bottom_up_leftcorner_strategy�
top_down_init�top_down_predict�	bottom_up�bottom_up_leftcorner�fundamental)r;rhr�r�s    r>ryzChartParserApp._init_buttonsls����v�����v����������,�,�,�����V��,�,�,��� � ���J�	
�	
�	
��$�G�$�
�
�
�
	��%� ���*�	
�	
�	
��$�F�$�
�
�
���&� ���+�	
�	
�	
��$�F�$�
�
�
���2� ���6�	
�	
�	
��$�F�$�
�
�
���&� ���&�	
�	
�	
��$�F�$�
�
�
���)� ���)�	
�	
�	
��$�F�$�
�
�
�
�f�B����$�$�&�$�1�1�1���*� ���N�	
�	
�	
��$�F�$�
�
�
�
�f�B����$�$�&�$�1�1�1���6� ���-�	
�	
�	
��$�F�$�
�
�
�
�f�B����$�$�&�$�1�1�1���$� ���$�	
�	
�	
��$�F�$�
�
�
�
�
r@c�F�|j�d|jj��|j�d|jj��|j�d|jj��|j�d|jj��|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|jfd���|j�d|jfd���|j�d|jfd���|j�d|jfd���dS)Nz<Up>z<Down>z<Prior>z<Next>rWrmz<F1>z<Control-s>r�z<Control-r>r!r&rz<space>z<Control-g>z<Control-t>rdc�,�|�d��Sr��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@rmc�R�|�|�����Sr�)r�r)r�rms  r>r%z/ChartParserApp._init_bindings.<locals>.<lambda>�s��Q�U�U�q�u�u�w�w�;�5G�5G�r@)r\r^rrBrErIrKr_�help�
save_chartr{rrrr�_stop_animation�edit_grammar�
edit_sentencerr
r�s r>rzzChartParserApp._init_bindings�s"���
������ 2�3�3�3��
����$�(�"6�7�7�7��
���	�4�8�#3�4�4�4��
����$�(�"4�5�5�5��
���
�t�|�4�4�4��
���
�t�|�4�4�4��
�����	�*�*�*��
���
�t��7�7�7��
���
�t��7�7�7��
���
�t�z�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���}|�dd|jd���|�dd|jd���|�dd|jd	���|���|�d
|j���|�d|j���|���|�d
d|j	d���|�
dd|���t|d���}|�dd|jd���|�dd|jd���|�
dd|���t|d���}|�dd|j
���|�dd|j���|�
dd|���t|d���}|�dd|jd���|�dd|jd ���|�d!d|jd"���|���|�d#|j���|�d$|j���|�d%|j���|�d&|j���|�d'|j���|�
d(d|���t|d���}|�d)d|jd*�+��|���|�d,d|jd�-��|�d.d|jdd/�0��|�d1d|jd2d3�0��|�d4d|jd5d6�0��|�
d7d|���t|d���}|�d8|jdd9|j�:��|�d;|jdd<|j�:��|�d=|jdd>|j�:��|�d?|jdd@|j�:��|�dA|jddB|j�:��|�
dCd|���t|d���}|�dDd|j���|�dEd|jdF���|�
dGd|���|j�|�H��dS)INrr�z
Save Chartr�r�r�r�zReset ChartzCtrl-rzSave Grammarr�zLoad Grammarr�r�r�r�r�zEdit Grammarr�zCtrl-g�	Edit TextzCtrl-t�EditrUr{)rOr3rq�Results�ViewzTop Down Strategyr!zBottom Up Strategyr&zBottom Up Left-Corner StrategyrzBottom Up RulezBottom Up Left-Corner RulezTop Down Init RulezTop Down Predict RulezFundamental Rule�Applyrrm)rOr3rr�zNo Animation)rOr3r�valuezSlow Animationrd)rOr3rr5r�zNormal Animationr|r�zFast Animationr�r��Animate�Tinyr�)rOrr3r5rq�Smallr��Medium��Large��Huge��Zoom�About�Instructions�F1�Helpr�) r	r\r�r+r{rr��save_grammar�load_grammarr_r�r-r.�view_matrix�view_resultsrrrrrrrr�add_checkbuttonr
�add_radiobuttonrr�resize�aboutr*r�)	r;r�r��editmenu�viewmenu�rulemenu�animatemenu�zoommenu�helpmenus	         r>rvzChartParserApp._init_menubar�s����t�z�"�"�����+�+�+��������O� �		�	
�	
�	
�	������O� �		�	
�	
�	
�	����1�d�j�h�	�	
�	
�	
�	��� � � ����>�4�;L��M�M�M����>�4�;L��M�M�M���� � � �����A�t�|��	�	
�	
�	
�	���&�A�H��E�E�E����+�+�+����� ���%� �		�	
�	
�	
�	������&� �		�	
�	
�	
�	���&�A�H��E�E�E����+�+�+����� �A�t�7G�	�	
�	
�	
�	���9��4�CT��U�U�U����&�A�H��E�E�E����+�+�+�����%���*��		�	
�	
�	
�	���&���+��		�	
�	
�	
�	���2���6��		�	
�	
�	
�	��� � � ����#3�T�^��L�L�L����.��8Q�	�	
�	
�	
�	���#7��AS��T�T�T����)�4�3H�	�	
�	
�	
�	���#5�t�?O��P�P�P����'�Q�X��F�F�F��7�A�.�.�.���#�#��A��
��	$�	
�	
�	
�	�!�!�#�#�#��#�#� �A��
�Q�	$�	
�	
�	
�	�#�#�"���]���	$�	
�	
�	
�	�#�#�$���]���	$�	
�	
�	
�	�#�#�"���]���	$�	
�	
�	
�	���)�q�{��K�K�K����+�+�+��� � ���Z����K�	!�	
�	
�	
�	� � ���Z����K�	!�	
�	
�	
�	� � ���Z����K�	!�	
�	
�	
�	� � ���Z����K�	!�	
�	
�	
�	� � ���Z����K�	!�	
�	
�	
�	���&�A�H��E�E�E����+�+�+�����7�a����L�L�L���� �A�t�y�d�	�	
�	
�	
�	���&�A�H��E�E�E��
���w��'�'�'�'�'r@c�|�||jkr|�|��dS|j���dSr�)r6�_select_edgerr�r�s  r>rzChartParserApp._click_cv_edge}sE���4�?�"�"����d�#�#�#�#�#�
�H���!�!�!�!�!r@c�d�|�|��|j�|��dSr�)rSrr�r�s  r>�_select_matrix_edgez"ChartParserApp._select_matrix_edge�s2�����$��������4� � � � � r@c��||_|j�|d��|j�|��|jr|j�|��|jr|j�|��dSdS)Nz#f00)r6rrrr�r�r�s  r>rSzChartParserApp._select_edge�s����������t�V�,�,�,�����4� � � ��<�	-��L�&�&�t�,�,�,��<�	)��L�"�"�4�(�(�(�(�(�	)�	)r@c��d|_|j���|j���|jr|j���dSdSr�)r6rr�rZr�r�s r>�_deselect_edgezChartParserApp._deselect_edge�s_��������������������<�	'��L�$�$�&�&�&�&�&�	'�	'r@c�8�|�|j�����|j���|j�|��|j�|d��|j�|��|jr|j���|jr|j�|��|jr|j�|��|j	r|j	�|��dSdS)Nr�)
�
_display_ruler�current_chartrulerr�rrr�r�r�r�s  r>�_show_new_edgezChartParserApp._show_new_edge�s�����4�8�5�5�7�7�8�8�8������������4� � � �����t�V�,�,�,�����4� � � ��<�	"��L���!�!�!��<�	-��L�&�&�t�,�,�,��<�	)��L�"�"�4�(�(�(��=�	'��M� � ��&�&�&�&�&�	'�	'r@c���d|_	t|jdtpd���dd���dS#t|jdtpd���d���YdSxYw)NrzHelp: Chart Parser Applicationrj�K�fixed)r�r2r
)rrr\r)�stripr�s  r>r*zChartParserApp.help�s������	���
�0���B�%�%�'�'���
�
�
�
�
�
��	���
�0���B�%�%�'�'��	
�
�
�
�
�
�
���s	�2=�3A3c�*�d}td|��dS)Nz5NLTK Chart Parser Application
Written by Edward LoperzAbout: Chart Parser Application)r)r;r��ABOUTs   r>rKzChartParserApp.about�s��M���2�E�:�:�:�:�:r@r�r�))zPlaintext grammar file�.cfgr�r�c��t|jd���}|sdS	t|d��5}tj|��}ddd��n#1swxYwY||_|j�|��|jr|j�	|��|jr|j�
��|jr|j�	|��|j�	|��dS#t$r}�d}~wwxYw)zLoad a chart from a pickle filer�r�Nr�)r
r�r�r�r�rXrr�r�r�r�r�rr�r)r;r�r~r�rir�s      r>r{zChartParserApp.load_chart�s_��"��+�i�
�
�
���	��F�	S��h��%�%�
,����F�+�+��
,�
,�
,�
,�
,�
,�
,�
,�
,�
,�
,����
,�
,�
,�
,��D�K��H�O�O�E�"�"�"��|�
.���&�&�u�-�-�-��|�
-���*�*�,�,�,��}�
/��
�'�'��.�.�.��H���u�%�%�%�%�%���	S�	S�	S������	S���s;�C7�A
�C7�
A�C7�A�B C7�7
D�D�Dc���t|jd���}|sdS	t|d��5}tj|j|��ddd��dS#1swxYwYdS#t$r}�d}~wwxYw)zSave a chart to a pickle filer�r�Nr�)rr�r�r�r�rXr�rr�s     r>r+zChartParserApp.save_chart�s���$��+�i�
�
�
���	��F�	R��h��%�%�
2����D�K��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,�,A1c��t|jd���}|sdS	|�d��r=t|d��5}t	j|��}ddd��n#1swxYwYnMt|��5}t
j|�����}ddd��n#1swxYwY|�	|��dS#t$r}tdd|z��Yd}~dSd}~wwxYw)z!Load a grammar from a pickle filercr�Nr�r�zError 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>rEzChartParserApp.load_grammar�s���"��-��
�
�
���	��F�		U�� � ��+�+�
<��(�D�)�)�2�V�$�k�&�1�1�G�2�2�2�2�2�2�2�2�2�2�2����2�2�2�2���(�^�^�<�v�!�n�V�[�[�]�]�;�;�G�<�<�<�<�<�<�<�<�<�<�<����<�<�<�<����W�%�%�%�%�%���	U�	U�	U��-�/H�8�/S�T�T�T�T�T�T�T�T�T�����	U���s_�%C�A"�C�"A&�&C�)A&�*C�='B0�$C�0B4�4C�7B4�8C�
C:�C5�5C:c���t�jd���}|sdS	|�d��rLt|d��5}t	j�j�jf|��ddd��dS#1swxYwYdSt|d��5}�j�	��}�fd�|D��}�fd�|D��}|D]}|�
d|z���|D]}|�
d|z���	ddd��dS#1swxYwYdS#t$r}td	d
|z��Yd}~dSd}~wwxYw)Nrcr�r�r�r�c�r��g|]3}|����j���k�1|��4SrR�rCr2r��r��pr;s  �r>r�z/ChartParserApp.save_grammar.<locals>.<listcomp>	s9���R�R�R�1������D�M�<O�<O�<Q�<Q�1Q�1Q�Q�1Q�1Q�1Qr@c�r��g|]3}|����j���k�1|��4SrRrmrns  �r>r�z/ChartParserApp.save_grammar.<locals>.<listcomp>	s9���Q�Q�Q�!������4�=�;N�;N�;P�;P�0P�0P�A�0P�0P�0Pr@z%s
zError Saving Grammarrg)
rrhr�r�r�r�rXr�r2�productions�writer�r)	r;r�r~r��prodsr��rest�prodr�s	`        r>rDzChartParserApp.save_grammar	sD���$��-��
�
�
���	��F�	T�� � ��+�+�
5��(�D�)�)�F�W��K���d�l� ;�W�E�E�E�F�F�F�F�F�F�F�F�F�F�F�F����F�F�F�F�F�F��(�C�(�(�5�G� �M�5�5�7�7�E�R�R�R�R��R�R�R�E�Q�Q�Q�Q�u�Q�Q�Q�D� %�5�5���
�
�f�t�m�4�4�4�4� $�5�5���
�
�f�t�m�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�1A5�5D�8A5�9D�>D�A0D�?D�D�D�D�D�
E�#D<�<Ec�V�d|_|���|j�|j��|jr|j�|j��|jr|j���|jr!|j�|j��dSdSr�)	rr�rr�rXr�r�r�r�r�s  r>rzChartParserApp.reset$	s������������������$�$�$��<�	0��L�"�"�4�;�/�/�/��<�	)��L�&�&�(�(�(��=�	1��M�#�#�D�K�0�0�0�0�0�	1�	1r@c�F�t|j|j|j��dSr�)rr\r2r_r�s  r>r-zChartParserApp.edit_grammar3	s!���$�*�d�m�T�-=�>�>�>�>�>r@c��||_|j�|��|jr|j�|��dSdSr�)r2rr_r�r^s  r>r_zChartParserApp.set_grammar6	sO����
�����W�%�%�%��=�	/��M�%�%�g�.�.�.�.�.�	/�	/r@c�|�d�|j��}d}d}t|j|||j|��dS)NrVr0zEnter a new sentence to parse.)rir�rr\�set_sentence)r;r��sentencer]�instrs     r>r.zChartParserApp.edit_sentence<	s@���8�8�D�L�)�)����0���D�J��%��1B�E�J�J�J�J�Jr@c�z�t|�����|_|���dSr�)r��splitr�r)r;r{s  r>rzzChartParserApp.set_sentenceB	s,���H�N�N�,�,�-�-����
�
�����r@c���|j�|j���t|j|j��|_|j�d|j��dSr�)r�r_rTr\rXr�rUr�s  r>rFzChartParserApp.view_matrixJ	sT���<�#��L� � �"�"�"�&�t�z�4�;�?�?�����!�!�(�D�,D�E�E�E�E�Er@c��|j�|j���t|j|j|j��|_dSr�)r�r_r+r\rXr2r�s  r>rGzChartParserApp.view_resultsP	s;���=�$��M�!�!�#�#�#�(���T�[�$�-�P�P��
�
�
r@c�l�d|_|�|j�����dSr�)rrUrrr�s r>rJzChartParserApp.resizeY	s/��������4�:�>�>�+�+�,�,�,�,�,r@c�0�|j�|��|j�t	|�����|j�t	|�����|j�t	|�����dSrR)rrUr1rOrSr0r2rTs  r>rUzChartParserApp.set_font_size]	s�������t�$�$�$��
���3�t�9�9�*��-�-�-��� � �s�4�y�y�j� �1�1�1��
���c�$�i�i�Z��0�0�0�0�0r@c�N�t|j�����Sr�)rSrrr�s r>rWzChartParserApp.get_font_sizec	s���4�:�>�>�#�#�$�$�$r@Nc�&�|jr	d|_dS|�d��|j���r�|j}|�`|�^|j�||��g��|���}|�"|j�	��d|_dSdS|j�|��|���dS|j�|��|j
���rd|_|���dS|jD]}|�n�|j�
��|jr|j�
��|jr|j�
��dSdS)Nrr�)rrZr
rr6r�set_strategy�_apply_strategyrr�r�_animate_strategyrr�r�r�)r;�strategy�
edge_strategy�	selection�newedger�s      r>�apply_strategyzChartParserApp.apply_strategyj	s����?�	��D�O��F�	
���4� � � ��:�>�>���	+���I��%�M�,E���%�%�}�}�Y�'?�'?�&@�A�A�A��.�.�0�0���?��H�(�(�*�*�*�&*�D�O�O�O�#�?���%�%�h�/�/�/��$�$�&�&�&�&�&�
�H�!�!�(�+�+�+��}� � �"�"�
+�"#����&�&�(�(�(�(�(� �L���D��|���$�����!�!�!��<�*��L�'�'�)�)�)��=�+��M�(�(�*�*�*�*�*�+�+r@c��d|_dSr�)rr�s  r>r,zChartParserApp._stop_animation�	s
������r@r�c��|jdkrdS|�����|j���dks|j���dkrdS|j���dkr"|j�d|j��dS|j���dkr"|j�d|j��dS|j�d|j��dSdS)Nrr�i�r|i�r�)rr�rrr
r\�afterr�)r;�speeds  r>r�z ChartParserApp._animate_strategy�	s����?�a����F����!�!�-��}� � �"�"�a�'�'�4�:�>�>�+;�+;�q�+@�+@����}� � �"�"�a�'�'��
� � ��t�'=�>�>�>�>�>���"�"�$�$��)�)��
� � ��t�'=�>�>�>�>�>��
� � ��T�%;�<�<�<�<�<�.�-r@c�\�t|j��}|�|�|��|Sr�)�nextrr\)r;�new_edges  r>r�zChartParserApp._apply_strategy�	s0�����%�%��������)�)�)��r@c��|�d|jd<dSt|��}||jd<|j���}dS)Nrjrp)rrhrrW)r;�ruler�r,s    r>rZzChartParserApp._display_rule�	sI���<�')�D��V�$�$�$��t�9�9�D�'+�D��V�$��8�)�)�+�+�D�D�Dr@c�<�|�|jd��dSr�)r��_TD_INITr�s  r>rzChartParserApp.top_down_init�	s �����D�M�4�0�0�0�0�0r@c�F�|�|jt��dSr�)r��_TD_PREDICTr�r�s  r>rzChartParserApp.top_down_predict�	s"�����D�,�.D�E�E�E�E�Er@c�F�|�|jt��dSr�)r��_BU_RULEr�r�s  r>rzChartParserApp.bottom_up�	s!�����D�M�+;�<�<�<�<�<r@c�F�|�|jt��dSr�)r��_BU_LC_RULEr�r�s  r>rz#ChartParserApp.bottom_up_leftcorner�	s"�����D�,�.H�I�I�I�I�Ir@c�F�|�|jt��dSr�)r��_FUNDAMENTALr�r�s  r>rzChartParserApp.fundamental�	s"�����D�-�/B�C�C�C�C�Cr@c�F�|�|jt��dSr�)r��_BU_STRATEGYr�r�s  r>rz!ChartParserApp.bottom_up_strategy�	s"�����D�-�/?�@�@�@�@�@r@c�F�|�|jt��dSr�)r��_BU_LC_STRATEGYr�r�s  r>rz,ChartParserApp.bottom_up_leftcorner_strategy�	s"�����D�0�2L�M�M�M�M�Mr@c�F�|�|jt��dSr�)r��_TD_STRATEGYr�r�s  r>rz ChartParserApp.top_down_strategy�	s"�����D�-�/E�F�F�F�F�Fr@)r�r�)r�)@rNrOrPrlr_r�r�r�rr�r�r�ryrzrvrrUrSrXr\r*rKr�rhr{r+rErDrr-r_r.rzrFrGrJrUrWr�r,r�r�rZr$r�r%r�rr�rr�r"r�r�r�r�rrrrrrrrrRr@r>r�r��s�������#�#�#�#�J���	-�	-�	-����

�
�
�
E�
E�
E�
�
�
�=�=�=�
 �
 �
 �O�O�O�bI�I�I�:](�](�](�F"�"�"�!�!�!�	)�	)�	)�'�'�'�'�'�'�,���&;�;�;�3�4F�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�-�-�/�/�0�K�-�-�/�/�0�L��k�)�L�8�L��l�*�L�!�L�0�O�1�1�1�F�F�F�=�=�=�J�J�J�D�D�D�A�A�A�N�N�N�G�G�G�G�Gr@r�c��tjd��}d}d}t|�����}t	d��|���D]#}t	dt
|��dzf���$t	d��t	d|z��t	d	��t||�����dS)
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 forkzJohn ate the cake on the tablez
grammar= (z    �,�)ztokens = %rz,Calling "ChartParserApp(grammar, tokens)"...)	rrir�r~r�rqrr�r�)r;�sentr�r�s    r>�appr��	s����n�	���G� 8�D�+�D�
�$�*�*�,�,�
�
�F�	�,�����#�#�%�%�*�*��
�v�t�D�z�z�C�'�(�)�)�)�)�	�#�J�J�J�	�-�&�
 �!�!�!�	�
8�9�9�9��7�F�#�#�,�,�.�.�.�.�.r@�__main__r�)Br)�os.pathr�r��tkinterrrrrrrr	r
rr�tkinter.filedialogr
r�tkinter.fontr�tkinter.messageboxrr�	nltk.drawrrr�nltk.draw.utilrrrrrr�nltk.grammarrr�nltk.parse.chartrrrr r!r"r#r$r%r&�	nltk.treer'�	nltk.utilr(r*rTr+rcr�r�r�r�r�r�r�r�rN�__all__rRr@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)�bL)�L)�L)�L)�L)�L)�L)�L)�hJT�JT�JT�JT�JT�JT�JT�JT�dN�N�N�N�N�N�N�N�p#�#�#�#�#�#�#�#�,	�	�	�	�	�X�'9�	�	�	�	�	�	�	�	�x�!4�	�	�	�	�	�	�	�	��+E�	�	�	�	�	�	�	�	�(�$=�	�	�	�cG�cG�cG�cG�cG�cG�cG�cG�L/�/�/�<�z����C�E�E�E��'���r@

Youez - 2016 - github.com/yon3zu
LinuXploit