o
    rZhy                     @   s   d Z ddlmZmZmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZmZ ddlmZmZmZmZ ddlmZ ddlmZ ddlmZ G d	d
 d
Zdd ZedkrVe  dgZdS )a	  
A graphical tool for exploring the recursive descent parser.

The recursive descent parser maintains a tree, which records the
structure of the portion of the text that has been parsed.  It uses
CFG productions to expand the fringe of the tree, and matches its
leaves against the text.  Initially, the tree contains the start
symbol ("S").  It is shown in the main canvas, to the right of the
list of available expansions.

The parser builds up a tree structure for the text using three
operations:

  - "expand" uses a CFG production to add children to a node on the
    fringe of the tree.
  - "match" compares a leaf in the tree to a text token.
  - "backtrack" returns the tree to its state before the most recent
    expand or match operation.

The parser maintains a list of tree locations called a "frontier" to
remember which nodes have not yet been expanded and which leaves have
not yet been matched against the text.  The leftmost frontier node is
shown in green, and the other frontier nodes are shown in blue.  The
parser always performs expand and match operations on the leftmost
element of the frontier.

You can control the parser's operation by using the "expand," "match,"
and "backtrack" buttons; or you can use the "step" button to let the
parser automatically decide which operation to apply.  The parser uses
the following rules to decide which operation to apply:

  - If the leftmost frontier element is a token, try matching it.
  - If the leftmost frontier element is a node, try expanding it with
    the first untried expansion.
  - Otherwise, backtrack.

The "expand" button applies the untried expansion whose CFG production
is listed earliest in the grammar.  To manually choose which expansion
to apply, click on a CFG production from the list of available
expansions, on the left side of the main window.

The "autostep" button will let the parser continue applying
applications to the tree until it reaches a complete parse.  You can
cancel an autostep in progress at any time by clicking on the
"autostep" button again.

Keyboard Shortcuts::
      [Space]	 Perform the next expand, match, or backtrack operation
      [a]	 Step through operations until the next complete parse
      [e]	 Perform an expand operation
      [m]	 Perform a match operation
      [b]	 Perform a backtrack operation
      [Delete]	 Reset the parser
      [g]	 Show/hide available expansions list
      [h]	 Help
      [Ctrl-p]	 Print
      [q]	 Quit
    )ButtonFrameIntVarLabelListboxMenu	ScrollbarTk)Font)	CFGEditorTreeSegmentWidgettree_to_treesegment)CanvasFrameEntryDialogShowText
TextWidget)SteppingRecursiveDescentParser)Tree)in_idlec                   @   s  e Zd ZdZddddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zded"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dedDdEZ$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0d^d_ Z1d`da Z2dbdc Z3d!S )fRecursiveDescentAppa  
    A graphical tool for exploring the recursive descent parser.  The tool
    displays the parser's tree and the remaining text, and allows the
    user to control the parser's operation.  In particular, the user
    can expand subtrees on the frontier, match tokens on the frontier
    against the text, and backtrack.  A "step" button simply steps
    through the parsing process, performing the operations that
    ``RecursiveDescentParser`` would use.
    r   c                 C   s   || _ t||| _t | _| jd |   | | j t| j| _	| j	
d d| _d| _t| j| _| j
d | | j | | j | | j | | j | | j | j| j  | jd| j d S )Nz$Recursive Descent Parser Application   r      z<Configure>)_sentr   _parserr	   _toptitle_init_bindings_init_fontsr   _animation_framesset_animating_lock	_autostep_show_grammar_init_menubar_init_buttons_init_feedback_init_grammar_init_canvas
initialize_canvasbind
_configure)selfgrammarsenttrace r0   D/var/www/auris/lib/python3.10/site-packages/nltk/app/rdparser_app.py__init__X   s&   zRecursiveDescentApp.__init__c                 C   s   t t d d| _|d| j t|| _| j| jd t dd| j d| _	t d| j d| _
| j d	k rC| j d
 }n| j d
 }t dd|d| _d S )Nfontr3   z*Fontsize	helveticabold)familyweightr5   )r8   r5   r      )r
   r   _sysfontZ
option_addr   _sizer   Zcgetget	_boldfont_font_bigfont)r,   rootbigr0   r0   r1   r      s   
zRecursiveDescentApp._init_fontsc              
   C   s  t | | _}| jjdddd t| j| jdd| _| j  t| jddd	d
| jddd| _| jjdddd t	| j
  | _| jD ]}| jdd|  qD| jjtt| jdd t| jdkrt| jdd}| jj|jd |j| jjd |jddd | jd| j d S )Nbothleftr:   )fillsidepadxzAvailable Expansions)r3   textsingleZgroovewhitez#909090#004040z#c0f0c0)Z
selectmoderelief
background
foregroundr3   ZselectforegroundZselectbackgroundrightr   rF   rE   expandendz  %s   )heightvertical)Zorient)Zyscrollcommand)commandy)rF   rE   z<<ListboxSelect>>)r   
_prodframepackr   r>   Z_prodlist_labelr   r?   	_prodlistlistr   r-   productions_productionsinsertconfigminlenr   r   Zyviewr*   _prodlist_select)r,   parentZ	listframe
productionZ
listscrollr0   r0   r1   r&      s6   


z!RecursiveDescentApp._init_grammarc                 C   sd  | 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 | 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 d S )Nz<Control-q>z<Control-x>z<Escape>emz<Alt-m>z<Control-m>bz<Alt-b>z<Control-b>z<Control-z>z<BackSpace>az<Control-space>z<Control-c>z<space>z<Delete>z<Control-p>z<Control-h>z<F1>z<Control-g>z<Control-t>)r   r*   destroyrQ   match	backtrackautostepcancel_autostepstepreset
postscripthelpedit_grammaredit_sentencer,   r0   r0   r1   r      s,   z"RecursiveDescentApp._init_bindingsc                 C   s   t | | _}|jddddd t|ddd| jd	jd
d t|ddd| jd	jd
d t|dddd| jdjd
d t|dddd| jdjd
d t|dddd| jdjd
d d S )Nnonebottom   r:   rE   rF   rG   padyStepz#90c0d0black)rH   rM   rN   rV   rD   rF   ZAutostepExpandr   z#90f090)rH   	underlinerM   rN   rV   Match	Backtrackz#f0a0a0)	r   Z_buttonframerY   r   rn   rl   rQ   rj   rk   )r,   rc   Zbuttonframer0   r0   r1   r$      sd   
z!RecursiveDescentApp._init_buttonsc                 C   sD   d| _ | j \}}}}|jd }d||||f | jd< |   d S )Nr      z%d %d %d %dscrollregion)r!   _cframer   rT   r)   _redraw)r,   eventx1y1Zx2y2r0   r0   r1   r+     s
   
zRecursiveDescentApp._configurec                 C   s   t | | _}|jddddd t|d| jd| _| jjdd t |d	d
d}|jddd
dd t|dd| jd| _t|dddd| jd| _| jjdd | jjddd
d d S )Nxrv   rw   rx   zLast Operation:)rH   r3   rD   r|   sunkenr   )rL   borderrO   r   )rE   rF   rQ   rG   z#007070z#f0f0f0)rN   rM   r3   w   rK   )anchorwidthrN   rM   r3   rP   )r   _feedbackframerY   r   r?   Z_lastoper_label
_lastoper1
_lastoper2)r,   rc   ZfeedbackframeZlastoperframer0   r0   r1   r%     s*   
z"RecursiveDescentApp._init_feedbackc                 C   sN   t |ddddd| _| jjddddd	 | j  }| _d | _g | _d | _d S )
NrJ   
   r:   r   )rM   Zcloseenoughr   rL   r   rC   top)rQ   rE   rF   ry   )r   r   rY   canvasr)   _tree_textwidgets	_textline)r,   rc   r   r0   r0   r1   r'   &  s   
z RecursiveDescentApp._init_canvasc           	      C   s  t |}t |dd}|jdd| jdd |jdd| jdd |j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d|d t |dd}|jdd	| jdd |	  |jdd| j
dd |jdd| jdd |	  |jdd| jdd |jdd|d t |dd}|jdd| j| jd |	  |jd| jdd| jd  |jd!| jdd"| jd  |jd#| jdd$| jd  |jd%| jdd&| jd  |jd'| jdd(| jd  |jd)d|d t |dd}|jd*d| jdd+ |jd,d| jdd-d. |jd/d| jdd0d. |jd1d| jd2d3d. |jd4d	|d t |dd}|jd5d| jd6 |jd7d| jd8d |jd9d|d |j|d: d S );Nr   )ZtearoffzReset ParserDel)labelr~   rV   acceleratorzPrint to PostscriptzCtrl-pZExitr   zCtrl-xFile)r   r~   menuzEdit Grammarr   zCtrl-g	Edit TextzCtrl-tZEditrz   ZSpacer   zCtrl-mr}   zCtrl-er   zCtrl-bZApplyShow Grammar)r   r~   variablerV   ZTinyr   )r   r   r~   valuerV   ZSmall   ZMedium   ZLarge   ZHuge   ZViewzNo Animation)r   r~   r   r   zSlow Animation-)r   r~   r   r   r   zNormal Animation=zFast Animationr:   +ZAnimateZAbout)r   r~   rV   ZInstructionsZF1ZHelp)r   )r   Zadd_commandro   rp   ri   Zadd_cascaderr   rs   rn   Zadd_separatorrj   rQ   rk   Zadd_checkbuttonr"   _toggle_grammarZadd_radiobuttonr<   resizer   aboutrq   r_   )	r,   rc   ZmenubarZfilemenuZeditmenuZrulemenuZviewmenuZanimatemenuZhelpmenur0   r0   r1   r#   7  s   







z!RecursiveDescentApp._init_menubarc                 C   s,   |D ]}|  | }qt|tr| }|S N)subtrees
isinstancer   r   )r,   widgettreelocir0   r0   r1   _get  s
   
zRecursiveDescentApp._getc                    sl  j  jd urjj jD ]}j| qjd ur'j j dj  f}dj  df}dd||d}j	
 }t |fi |_jjdd dj  f}j d  }} fd	d
jD _jD ]!}j|dd |d|| d  d  t|| d }qw jd|d d|d dd_      d S )Nr6   r7   #000000r:   )
tree_color
tree_width	node_font	leaf_fontr   r   rw   c                    s   g | ]
}t  |jd qS )r4   )r   r?   ).0wordr   r,   r0   r1   
<listcomp>  s    z/RecursiveDescentApp._redraw.<locals>.<listcomp>r   r   ixi  .)dash)r)   r   r   destroy_widgetr   r   deleter<   r=   r   treer   
add_widgetr   r   movebboxr`   Zcreate_line_highlight_nodes_highlight_prodlist_position_text)r,   twidgetZhelvr7   attribsr   rv   rW   r0   r   r1   r     s<   




zRecursiveDescentApp._redrawc                 C   s   |    |   |   d S r   )r   r   r   rt   r0   r0   r1   _redraw_quick  s   z!RecursiveDescentApp._redraw_quickc                 C   s|   d| j   df}| j d d D ]}d| | j|d< || | j|d< q| j dd  D ]}d| | j|d< q0d S )Nr6   r7   r   #20a050colorr3   z#008080)r<   r=   r   frontierr   r   )r,   r7   r   r0   r0   r1   r     s   z$RecursiveDescentApp._highlight_nodesc                 C   s   | j dd | j }| j }| j}tt|D ]7}|| |v rF|| |v r4| j |d||   n| j |d||   | j 	| q| j |d||   qd S )Nr   rR    %sz %s (TRIED))
rZ   r   r   expandable_productionsZuntried_expandable_productionsr]   rangera   r^   selection_set)r,   
expandableZuntriedr\   indexr0   r0   r1   r     s   

z'RecursiveDescentApp._highlight_prodlistc           
      C   s  t | j}|t | j  }|  d | }| j d }tdt |D ]+}| j| }|| }d|d< d|d< |	| d | d  d | d d }q$tt ||D ]}| j| }d|d< |	|| d  d | d d }qW| j
 r| jD ]}d|d< qtdt |D ]4}| j| }|| }| d | d	  d
 }	t|	|   d	 | d	  d }	|	d|	 qd S )Nr   #006040r   r:   r   z#a0a0a0z#00a000r   rw         $@)ra   r   r   Zremaining_text_tree_leavesr   r   r   r   r   currently_completemaxrc   r   )
r,   ZnumwordsZnum_matchedleavesZxmaxr   r   leafr   dyr0   r0   r1   r     s4   

 




*z"RecursiveDescentApp._position_textNc                 C   sB   |d u r| j }t|trg }| D ]	}|| |7 }q|S |gS r   )r   r   r   r   r   )r,   r   r   childr0   r0   r1   r   9  s   
z RecursiveDescentApp._tree_leavesc                 G   s(   d| _ | jd u r
d S | j  d | _d S Nr   )r!   r   ri   r,   re   r0   r0   r1   ri   H  s
   


zRecursiveDescentApp.destroyc                 G   s4   d| _ | j| j d| jd< d| jd< |   d S )Nr   zReset ApplicationrH    )r!   r   r(   r   r   r   r   r   r0   r0   r1   ro   O  s
   

zRecursiveDescentApp.resetc                 G   s<   | j  dkr| j d | jrd| _d S d| _|   d S )Nr   r:   r   )r   r=   r   r!   _stepr   r0   r0   r1   rl   V  s   
zRecursiveDescentApp.autostepc                 G   s
   d| _ d S r   )r!   r   r0   r0   r1   rm   _  s   
z#RecursiveDescentApp.cancel_autostepc                 G      d| _ |   d S r   )r!   r   r   r0   r0   r1   rn   d     zRecursiveDescentApp.stepc                 G   r   r   )r!   _matchr   r0   r0   r1   rj   h  r   zRecursiveDescentApp.matchc                 G   r   r   )r!   _expandr   r0   r0   r1   rQ   l  r   zRecursiveDescentApp.expandc                 G   r   r   )r!   
_backtrackr   r0   r0   r1   rk   p  r   zRecursiveDescentApp.backtrackc                 C   sv   | j rd S |  r
n| j r|  rn|  rnd| jd< d| jd< d| _| j	 r9d| _| jd  d7  < d S d S )NFinishedrH   r   r   z    [COMPLETE PARSE])
r    r   r   Zuntried_matchr   r   r   r   r!   r   rt   r0   r0   r1   r   t  s   


zRecursiveDescentApp._stepc                 G   s   | j rd S | j }| j }|d ur9d| jd< || jd< | jdd | j	|}| j
| | |d  dS d| jd< d| jd< dS )NExpand:rH   r   rR   Tz(all expansions tried)F)r    r   r   rQ   r   r   rZ   selection_clearr]   r   r   _animate_expand)r,   re   old_frontierrvr   r0   r0   r1   r     s   





zRecursiveDescentApp._expandc                 G   sd   | j rd S | j }| j }|d ur&d| jd< || jd< | |d  dS d| jd< d| jd< dS )NzMatch:rH   r   Tz(failed)F)r    r   r   rj   r   r   _animate_match)r,   re   r   r   r0   r0   r1   r     s   





zRecursiveDescentApp._matchc                 G   s   | j rd S | j rD| j }| j d D ]}|| }qd| jd< d| jd< t|tr8| 	| j d  dS | 
| j d  dS d| _d| jd< d| jd< dS )Nr   r   rH   r   Tr   F)r    r   rk   r   r   r   r   r   r   _animate_backtrack_animate_match_backtrackr!   )r,   re   eltr   r0   r0   r1   r     s"   







zRecursiveDescentApp._backtrackc                 G   sF   d}d}zddl m} |||d  W d S    t| j|| Y d S )NzANLTK Recursive Descent Parser Application
Written by Edward Loperz+About: Recursive Descent Parser Applicationr   )Message)messager   )Ztkinter.messageboxr   showr   r   )r,   re   ZABOUTZTITLEr   r0   r0   r1   r     s   zRecursiveDescentApp.aboutc              	   G   sP   d| _ zt| jdtpd ddd W d S    t| jdtpd dd Y d S )Nr   z*Help: Recursive Descent Parser Applicationr   K   fixed)r   r3   )r   )r!   r   r   __doc__stripr   r0   r0   r1   rq     s    

zRecursiveDescentApp.helpc                 G   s   d| _ | j  d S r   )r!   r   Zprint_to_filer   r0   r0   r1   rp     s   zRecursiveDescentApp.postscriptc                 O   s    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   mainloop)r,   argskwargsr0   r0   r1   r     s   zRecursiveDescentApp.mainloopc                 C   s~   |d ur
| j | | j  }| jjt| d | jjt| d | jjt| d | jjt|d  d | 	  d S )N)r5   r:   )
r<   r   r=   r?   	configureabsr>   r;   r@   r   )r,   r5   r0   r0   r1   r     s   
zRecursiveDescentApp.resizec                 G   sN   | j  r| jjddd| jd d| jd< n
| j  d| jd< d| jd< d S )	NrC   rD   r:   )rE   rF   rG   afterr   rH   zHide Grammarr   )r"   r=   rX   rY   r   r   Zpack_forgetr   r   r0   r0   r1   r     s   



z#RecursiveDescentApp._toggle_grammarc                 C   s   | j  }t|dkrd S t|d }| j }| j| j| }|rCd| jd< || j	d< | j 
dd | j | | |d  d S | j 
dd | j D ]}| j|}| j | qOd S )Nr   r   r   rH   rR   )rZ   Zcurselectionra   intr   r   rQ   r]   r   r   r   r   r   r   r   )r,   r   Z	selectionr   r   rd   prodr0   r0   r1   rb     s"   



z$RecursiveDescentApp._prodlist_selectc              
      s     j|}| }t| t } j }|D ]}|| }qt j| j	dddd j
d}d| d< |  d d \}}	|  d d \}
}|||
 |	|  |rt j|dd |d|  d  d | _n| || | r||  d  | d  d d  | d  d d  }| D ]}||d q | |r j| n|   fd	d
t j ddD }| d d  j jd  }|dkr jD ]}|d| q j jd|  || d S )NrJ   r:   )r   Z
leaf_colorr   r   Z
node_colorr   r   r   r   r   r   c                    *   g | ]}d dt d|  j    qS zgray%dr   r   r   r=   r   r   rt   r0   r1   r   \      z7RecursiveDescentApp._animate_expand.<locals>.<listcomp>rw   r   )r   r   rc   r   r   r   r   r   r)   r>   r?   r   r   r   r   r   Zreplace_childr   r   	_makeroomr   ri   r   r   r=   Zcoordsr   r   _animate_expand_frame)r,   r   Z	oldwidgetZoldtreer   r   r   r   ZoldxZoldyZnewxZnewydxsubtreecolorsr   r   r0   rt   r1   r   )  sb   




"
z#RecursiveDescentApp._animate_expandc                 C   s   |  }t|tsdS | |}| |d d }|r9| d |d  d  d }|D ]}||d q0|dkr\| |d  }td| d | d  d }||d | | dS )z@
        Make sure that no sibling tree bbox's overlap.
        Nr   r:   r   r   )	rc   r   r   r   r   r   r   r   r  )r,   Ztreesegrc   r   Z	rsiblingsr  ZsiblingZlsiblingr0   r0   r1   r  j  s   
 "zRecursiveDescentApp._makeroomc                 C   s   t |dkr:d| _|d |d< | D ]}t|tr#|d | d< q|d |d< q| jd| j||dd   d S d|d< | D ]}t|trPd| d< qBd|d< qB| 	  d| d< d| _| j
rk|   d S d S )Nr   r   r   2   r{   )ra   r    r   r   r   r   r   r   r  r   r!   r   )r,   r   r  r  r0   r0   r1   r    s&   
 

z)RecursiveDescentApp._animate_expand_framec                    s    j  dkr
g }ng d}| fddtd j  d D 7 }  j| g}|d  D ]}t|tr@|	|
  q1|	| q1 || d S )Nr   )#a00000r   r
  c                    r   r   r   r  rt   r0   r1   r     r  z:RecursiveDescentApp._animate_backtrack.<locals>.<listcomp>r   )r   r=   r   r   r   rc   r   r   r   appendr   _animate_backtrack_frame)r,   r   r  widgetsr  r0   rt   r1   r     s   
z&RecursiveDescentApp._animate_backtrackc                 C   s   t |dkr$d| _|D ]}|d |d< q| jd| j||dd   d S |d  D ]}|d | |  q*|   d| _| j	rH| 
  d S d S )Nr   r   r   r	  )ra   r    r   r   r  r   remove_childri   r   r!   r   )r,   r  r  r   r0   r0   r1   r    s    
z,RecursiveDescentApp._animate_backtrack_framec                 C   s^   |  | j|}|  }| d | d  d td| j  }| | j || d S )Nrw   r   r   )	r   r   rc   r   r   r   r   r=   _animate_match_backtrack_frame)r,   r   r   noder   r0   r0   r1   r     s   
z,RecursiveDescentApp._animate_match_backtrackc                 C   sX   |  | j|}| jd  d | d  d td| j  }| | j || d S )Nr   r   rw   r   )r   r   r   r   r   r   r=   _animate_match_frame)r,   r   r   r   r0   r0   r1   r     s
   "
z"RecursiveDescentApp._animate_matchc                 C   sd   |dkrd| _ |d| | jd| j|d || d S d|d< |   d| _ | jr0|   d S d S )Nr   r   r   r   r   )r    r   r   r   r  r   r!   r   r,   framer   r   r0   r0   r1   r    s   z(RecursiveDescentApp._animate_match_framec                 C   sj   |dkrd| _ |d| | jd| j|d || d S | | |  d| _ | jr3| 	  d S d S )Nr   r   r   )
r    r   r   r   r  rc   r  ri   r!   r   r  r0   r0   r1   r    s   z2RecursiveDescentApp._animate_match_backtrack_framec                 G   s   t | j| j | j d S r   )r   r   r   r-   set_grammarr   r0   r0   r1   rr     s   z RecursiveDescentApp.edit_grammarc                 C   sJ   | j | t| | _| jdd | jD ]}| jdd|  qd S )Nr   rR   r   )r   r  r[   r\   r]   rZ   r   r^   )r,   r-   rd   r0   r0   r1   r    s   
zRecursiveDescentApp.set_grammarc                 G   s,   d | j}d}d}t| j||| j| d S )N r   zEnter a new sentence to parse.)joinr   r   r   set_sentence)r,   re   sentencer   instrr0   r0   r1   rs     s   z!RecursiveDescentApp.edit_sentencec                 C   s   |  | _|   d S r   )splitr   ro   )r,   r  r0   r0   r1   r    s   
z RecursiveDescentApp.set_sentence)r   r   )4__name__
__module____qualname__r   r2   r   r&   r   r$   r+   r%   r'   r#   r   r   r   r   r   r   r   ri   ro   rl   rm   rn   rj   rQ   rk   r   r   r   r   r   rq   rp   r   r   r   rb   r   r  r  r   r  r   r   r  r  rr   r  rs   r  r0   r0   r0   r1   r   M   sf    

*$!0 -	
"	
Ar   c                  C   s0   ddl m}  | d}d }t||  dS )zV
    Create a recursive descent parser demo, using a simple grammar and
    text.
    r   )CFGaD  
    # Grammatical productions.
        S -> NP VP
        NP -> Det N PP | Det N
        VP -> V NP PP | V NP | V
        PP -> P NP
    # Lexical productions.
        NP -> 'I'
        Det -> 'the' | 'a'
        N -> 'man' | 'park' | 'dog' | 'telescope'
        V -> 'ate' | 'saw'
        P -> 'in' | 'under' | 'with'
    zthe dog saw a man in the parkN)Znltk.grammarr  Z
fromstringr  r   r   )r  r-   r.   r0   r0   r1   app  s   r  __main__N)r   tkinterr   r   r   r   r   r   r   r	   Ztkinter.fontr
   Z	nltk.drawr   r   r   Znltk.draw.utilr   r   r   r   Z
nltk.parser   Z	nltk.treer   Z	nltk.utilr   r   r  r  __all__r0   r0   r0   r1   <module>   s(   (;       7
