RHS," where LHS is a single nonterminal, and RHS is a list of nonterminals and terminals. Nonterminals must be a single word, such as S or NP or NP_subj. Currently, nonterminals must consists of alphanumeric characters and underscores (_). Nonterminals are colored blue. If you place the mouse over any nonterminal, then all occurrences of that nonterminal will be highlighted. Termianals must be surrounded by single quotes (') or double quotes("). For example, "dog" and "New York" are terminals. Currently, the string within the quotes must consist of alphanumeric characters, underscores, and spaces. To enter a new production, go to a blank line, and type a nonterminal, followed by an arrow (->), followed by a sequence of terminals and nonterminals. Note that "->" (dash + greater-than) is automatically converted to an arrow symbol. When you move your cursor to a different line, your production will automatically be colorized. If there are any errors, they will be highlighted in red. Note that the order of the productions is significant for some algorithms. To re-order the productions, use cut and paste to move them. Use the buttons at the bottom of the window when you are done editing the CFG: - Ok: apply the new CFG, and exit the editor. - Apply: apply the new CFG, and do not exit the editor. - Reset: revert to the original CFG, and do not exit the editor. - Cancel: revert to the original CFG, and exit the editor. t CFGEditorcBs>eZdZejdZejdedZejdedZ ejd#eddZ ejd ed Z d$Z d%d%dZdZdZdZdZdZdZdZdZddZdZdZdZdZdZdZdZd Zd!Z d"Z!RS(&s* A dialog window for creating and editing context free grammars. ``CFGEditor`` imposes the following restrictions: - All nonterminals must be strings consisting of word characters. - All terminals must be strings consisting of word characters and space characters. Rs(^\s*\w+\s*)(->|(s))s\s*(->|(s))\s*s (^\s*\w+\s*)s(->|(s#((\w+|'[\w ]*'|\"[\w ]*\"|\|)\s*)*$s\w+|->|'[\w ]+'|"[\w ]+"|(t)R"iR#cCs||_|dk r!||_nttdg|_||_d|_t||_|j |j |j j dddddd|j |jj dddd dd|j|jj dd dddd|jjdS( NtSitsidettoptfilltxtexpanditbothtbottom(t_parenttNonet_cfgR R t_set_cfg_callbackt _highlight_matching_nonterminalsR t_topt_init_bindingst_init_startframet _startframetpackt_init_prodframet _prodframet _init_buttonst _buttonframet _textwidgettfocus(R%tparenttcfgtset_cfg_callback((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyt__init__s        cCst|j}|_t||_|jjddt|ddjddt|ddjdd|jjd|jj j dS(NR8trightttexts Start Symbol:s Productions:tlefti( RRDRGRt_startRHRtinsertRAtstartR(R%tframe((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRFs c Cst|j}|_t|ddd|jddddjddt|dd d|jddddjddt|dd d|jddddjddt|dd d|jddddjddt|dd d|j ddddjdd dS(NRTtOktcommandRit takefocusR8RUtApplytResettCanceltHelpRS( RRDRLRt_okRHt_applyt_resett_cancelt_help(R%RY((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRKscCs^|jjd|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j|jjd |j|jjd |j|jjd |j|jjd |j|jjd |j|jjd|j|jjd|j|jjd|jdS(Ns CFG Editors ss ssss ss ss ss ss(RDttitletbindRdRaRbRcRe(R%((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyREs c Cs1t|j|_t|jdddd|_t|jdddd|_|jjd |jj|jjd |jj |jj d d d d|jj ddd dd d|jj ddd|jj ddd|jj dddd|_ |jj d|j|jj d|j|jj d|j|jj d|j|jd}|jj d|g|jjD]!}|j|jgf^q}xtt|ddd D]}||d||ddkrd(||dkrqnd)||ddkr/qn||ddGH||dGH||ddj||d||=qqWx|D]\}}||fGHd!|}xW|D]O}x<|D]4} t| tr|d"| 7}q|d#| 7}qW|d$7}qW|d% d&}|jjd'|qW|jdS(*Nt backgrounds#e0e0e0texportselectioniR\itorienttverticaltyscrollcommandR[R8RSR:tyR<R=RURRs#006000RRRterrortredt>s <>s s cSs|jjdS(N(t tk_focusNextRN(teR&((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pytcyclessis%s ->s %ss %rs |is tend(((RRDRJRRMRt _textscrolltconfigtsettyviewRHR$t_linenumRgt_replace_arrowst_analyzet_check_analyzeRAt productionsR*R,trangetlentextendR-R RW( R%Rstpt prod_tuplestiR*trhsstsR,R0((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRIsT   7#  !    cCsWd|}d|}x<|jjD]+}|dkr$|jj|||q$q$WdS(s Remove all tags (except ``arrow`` and ``sel``) from the given line of the text widget used for editing the productions. s%d.0s%d.endRtselN(sarrowssel(RMt tag_namest tag_remove(R%tlinenumRXRtttag((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyt _clear_tags0s    cGsat|jjdjdd}||jkr]|j||j|j||_ndS(s Check if we've moved to a new line. If we have, then remove all colorization from the line we moved to, and re-colorize the line that we moved from. RWt.iN(tintRMtindextsplitRyRt _analyze_line(R%RrR((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR|;s % cGsd}xutr}|jjd|d}|dkr7Pn|jj||d|jj||jd|jj|dq Wd}xStr|jj|j|dd}|dkrPn|jjd||dqWd S( s Replace any ``'->'`` text strings with arrows (char \256, in symbol font). This searches the whole buffer, but is fast enough to be done anytime they press '>'. s1.0s->s end+1charts+2charRs s+1charN(tTrueRMtsearchtdeleteRWR+ttag_add(R%RrR((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRzGs     cCs|jddkrd}nY|jd|jfkrCd}n5d|j}||jjkrx|j|nd||jf}d||jf}|jj|||dS( s Given a line number and a regexp match for a token on that line, colorize the token. Note that the regexp match gives us the token's text, start index (on the line), and end index (on the line). is'"Rs->Rt nonterminal_s%d.%dN(tgroupR+RMRt_init_nonterminal_tagRXRtR(R%tmatchRRRXRt((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyt_analyze_token\s  R!cCs|jj|d|dtj|js,dS|j|d}|j|d}|jj|d||jj|d|dS(NRRcSs|j|dddS(NRhs#80ff80(R$(RrR&R((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pytenterwscSs|j|dddS(NRhR(R$(RrR&R((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pytleaveysss(RMR$R5t_BOLDRCttag_bind(R%RRRR((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRrs  cCs|j||jjt|dt|d}tjj|rm||d}tjj||n%|j dkr|j ||ndS(s( Colorize a given line. s.0s.endcSs|j||dS(NR(R(RR%R((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyt analyze_tokensRN( RRMtgettreprR5t_PRODUCTION_RERt _TOKEN_REtsubtstript _mark_error(R%RtlineR((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR~s )cCstjj|}|s/d|}d|}nUtjj|sdd|}d||jf}n d||jf}d|}|jj|d|rd|}d|}n|jj d||dS(s: Mark the location of an error in a line. s%d.0s%d.ends%d.%ds==RnN( R5t _ARROW_RERt_LHS_RERRXRtRMtcompareR(R%RRt arrowmatchRXRt((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRs      cGs^|jt|jjdjdd}x(td|dD]}|j|qCWdS(sM Replace ``->`` with arrows, and colorize the entire buffer. RtRiiN(RzRRMRRR~R(R%RrtnumlinesR((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR{s %cCsg}|jjdd}tj|jd|}tjdd|}|jd}x<|D]4}|j}|dkrq^n|t|7}q^W|S(so Parse the current contents of the textwidget buffer, to create a list of productions. s1.0Rts->s t s R(RMRtreRR+RRR (R%R}RTtlinesR((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyt_parse_productionss   cGs-|jdkrdS|jjd|_dS(N(RDR@tdestroy(R%Rr((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyt_destroys cGs|j|jdS(N(RbR(R%Rr((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRas cGsS|j}t|jj}t||}|jdk rO|j|ndS(N(RR RVRR RBR@(R%RrR}RXRP((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRbs  cGst|jjddx.|jjD]}|jjdd|q#W|j|jdk rp|j|jndS(Ns1.0Rts%s (RMRRAR}RWR{RBR@(R%Rrt production((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRcs  cGs&y|jWnnX|jdS(N(RcR(R%Rr((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRds cGsVy)t|jdtjddddWn&t|jdtjddnXdS(NsHelp: Chart Parser DemotwidthiKRtfixed(RR?t_CFGEditor_HELPR(R%Rr((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRes   s(^\s*\w+\s*)(->|((s helveticaisboldN("R2R3t__doc__RR4R+RtcompileRRRRRR@RRRFRKRERIRR|RzRRRRR{RRRaRbRcRdRe(((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR5s:       T     $     tCFGDemocBseZdZdZdZdZdZdZdZdZ dZ d d Z d Z d Zd ZRS(cCs||_||_t|_|jjdt|j|_|jjd|j|jt |j}|j dddddd|j |j|j |j|j ||j||j|jdS( NsContext Free Grammar Demoi R8RUR:RmR<i(t_grammart_textRRDRfRt_sizeRwRERRHt _init_menubarRKt _init_grammart _init_treelett_init_workspace(R%tgrammarRTtframe1((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRRs     cCs|jd|jdS(Ns (RgR(R%R9((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRE scCsdS(N((R%RO((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR#scCsdS(N((R%RO((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRK%scCswt||jdd|_|jjdddddd|jj|jjd |j|jjd |jdS( NRiR8R9R:R=R<itselecttmove(RRt _prodlistRHRNt add_callbackt_selectprod_cb(R%RO((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR's  cCs;t|dd|_|jjddddd|_dS(NRhtwhiteR8R>R:R;(Rt_treelet_canvasRHR@t_treelet(R%RO((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR.scCsKt|dd|_|jjddddddd|_|jdS( NRhRR8RSR:R=R<i(Rt _workspaceRHR@t_treetreset_workspace(R%RO((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR3s c Cs-|jj}t|jj}d|d df}d|d f}|jdk rn|jj|jn|jj j }t ||d|dd}g}x3|j D](}|j t ||d|ddqWt|||dd |_|jj|jx|D]} | jd d qWdS( NR"iR#iRt draggableitcolorRiid(RtcanvasRRRRR@t remove_widgetRRXRRRR)Rt add_widgetR( R%tctfontsizet node_fontt leaf_fontRXtrootnodetleavestwordtleaf((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR=s &  cCsdS(N((R%R((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pytworkspace_markprod]scCs$|dkr|j}nxtt|jt|jD]}|d|fdkrg|jnxt|jD]\}}|j||}t|t rt|t r|j |j j krqzt|tjr t|tr ||j kr qzPqzWd|fGHqAWdS(NRRsMATCH AT(R@RR~RtsubtreesR,t_markproductiont enumerateR-R RRtlabelRTRt string_typesR(R%tprodttreeRtjtnodetwidget((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyR`s" / cCsw|j}|jj||jdk r8|jjn|j}x8t|D]*\}}t|t rQt |}qQqQWt |j j |}t |jj}d|d df}d|d f} t||d|d| |_d|jd<|jj\} } } } t |d t |d }}|jj|| | d|| | d|j|dS( NR"iR#iRRiRRtheight(RRt highlightRR@RR,RR-R RR*RRRRRtbboxRR(R%RRR,RR0RRRRtx1ty1tx2ty2twth((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRys(     !+cGs|jjdS(N(RDR(R%targs((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRscOs|jj||dS(N(RDtmainloop(R%Rtkwargs((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRsN(R2R3RRRERRKRRRRRR@RRRR(((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRs          cCsddlm}m}m}d}g|jD]}||^q/\ }}}}} } } } } ||||g||| | g||||g||||g||| ||g||| |g||| |g||g||dd|g||dg|| dg|| dg|| d g|| d g|| d g|| d g|| d g|| dg|| dg|| dgf}|||}dj}t||}|jdS(Ni(R t ProductionR sS VP NP PP P N Name V DettuptovertItthetatmantsawtintwithtparktdogtstatuetmysI saw a man in the park(tnltkR RR RRR(R RR R RR7tVPtNPtPPtPtNtNametVtDetR}RRTtd((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pytdemo2s.=  c Csddlm}m}d}g|jD]}||^q)\ }}}}}} } } } |jd} d}t}t|| |}t|ddjt |ddd |j j|j dS( Ni(R R sS VP NP PP P N Name V Dets+ S -> NP VP PP -> P NP NP -> Det N NP -> NP PP VP -> V NP VP -> VP PP Det -> 'a' Det -> 'the' Det -> 'my' NP -> 'I' N -> 'dog' N -> 'man' N -> 'park' N -> 'statue' V -> 'saw' P -> 'in' P -> 'up' P -> 'over' P -> 'with' cSs |GHdS(N((R((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pytcbsRTs Testing CFG Editor tQuitR[( RR R Rt fromstringRR5RRHRRR(R R R RR7RRRRRRRRRR R9teditor((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pytdemos=   cCs$ddlm}td\ }}}}}}}}} ||||g||| |g||||g||||g|||||g||||g||||g||g||dd|g||dg|| dg|| dg||d g||d g||d g||d g||d g||dg||dg|| dgf} t} | d} | jd| t| | } | jdddd| jd| j| jd| j| j | j | d| j | ddS(Ni(Rs!S, VP, NP, PP, P, N, Name, V, DetRRRRRRRRRRRRRcSs|jdS(N(R(Rrtt((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyRstqR<iR:R=RRii( RRR RRgRRHRtmarkonlyRNtmark(RR7RRRRRRRRR}RRR((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pytdemo3s6'    t__main__()Rt nltk.compatRRttkinterRRRRRRRRRR t nltk.grammarR R R R t nltk.treeRtnltk.draw.treeRRtnltk.draw.utilRRRRRRRRtobjectR5RR RRR2(((s_/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/draw/cfg.pyt s$)  F"(A| $ # &