package Ġcom . b aj dcc . L AL R 1 . syntax . autom ata . ng a Ċ Ċ import Ġcom . b aj dcc . L AL R 1 . syntax . ISyntax Component Ċ import Ġcom . b aj dcc . L AL R 1 . syntax . ISyntax Component Visitor Ċ import Ġcom . b aj dcc . L AL R 1 . syntax . Syntax Ċ import Ġcom . b aj dcc . L AL R 1 . syntax . exp .* Ċ import Ġcom . b aj dcc . L AL R 1 . syntax . rule . Rule Item Ċ import Ġcom . b aj dcc . L AL R 1 . syntax . stringify . NG A ToString Ċ import Ġcom . b aj dcc . util . Visit Bag Ċ import Ġcom . b aj dcc . util . lexer . autom ata . B read th First Search Ċ Ċ /** Ċ Ġ* Ġ** éĿŀ ç¡®å®ļ æĢ§ æĸĩ æ³ķ èĩªåĬ¨ æľº ** ï¼Ī ** NG A ** ï¼ī æŀĦ æĪĲ ç®Ĺæ³ķ ï¼Ī ** AST -& gt ; NG A ** ï¼ī Ċ Ġ* Ġ* åĬŁèĥ½ ï¼ļ è¿Ľè¡Į LR é¡¹çĽ® éĽĨ çļĦ è®¡ç®Ĺ * Ċ Ġ* Ġ[ arr Non Terminal s ] Ġ éĿŀ ç»Ī ç»ĵ ç¬¦ éĽĨåĲĪ Ċ Ġ* Ġ[ arr Terminal s ] Ġ ç»Ī ç»ĵ ç¬¦ éĽĨåĲĪ Ċ Ġ* Ġ@ author Ġb aj dcc Ċ Ġ*/ Ċ open Ġclass ĠN GA ( protected Ġvar Ġarr Non Terminal s : ĠList < Rule Exp >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġvar Ġarr Terminal s : ĠList < Token Exp >) Ġ: ĠIS yntax Component Visitor Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§ĦåĪĻ åĪ° æĸĩ æ³ķ èĩªåĬ¨ æľº çĬ¶æĢģ çļĦ æĺłå°Ħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġmap NG A Ġ= Ġmutable Map Of < Rule Item , ĠN GA Status >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¿ĿåŃĺ ç»ĵæŀľ çļĦæķ°æį® åĮħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġbag Ġ= ĠNG AB ag () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĿŀ ç¡®å®ļ æĢ§ æĸĩ æ³ķ èĩªåĬ¨ æľº æııè¿° ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ éĿŀ ç¡®å®ļ æĢ§ æĸĩ æ³ķ èĩªåĬ¨ æľº æııè¿° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġn ga String : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" #### Ġ äº§çĶŁ å¼ı Ġ#### ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( System . line Separator ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( status Ġin Ġmap NG A . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( get NG A String ( status , Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( System . line Separator ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate NG A Map () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¿ŀæİ¥ ä¸¤ä¸ª çĬ¶æĢģ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbegin Ġ åĪĿ æĢģ ĊĠĠĠĠ Ġ* Ġ@ param Ġend ĠĠ Ġ ç»Ī æĢģ ĊĠĠĠĠ Ġ* Ġ@ return Ġ æĸ°çļĦ è¾¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconnect ( begin : ĠN GA Status ?, Ġend : ĠN GA Status ?): ĠN GA Edge Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġedge Ġ= ĠN GA Edge () // Ġ çĶ³è¯· ä¸ĢæĿ¡ æĸ° è¾¹ ĊĠĠĠĠĠĠĠ Ġedge . begin Ġ= Ġbegin ĊĠĠĠĠĠĠĠ Ġedge . end Ġ= Ġend ĊĠĠĠĠĠĠĠ Ġbegin !!. out Edges . add ( edge )// Ġæ·»åĬł è¿Ľ èµ· å§ĭ è¾¹ çļĦ åĩº è¾¹ ĊĠĠĠĠĠĠĠ Ġend !!. in Edges . add ( edge )// Ġæ·»åĬł è¿Ľ ç»ĵæĿŁ è¾¹ çļĦ åħ¥ è¾¹ ĊĠĠĠĠĠĠĠ Ġreturn Ġedge ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĸŃ å¼Ģ æŁĲä¸ª çĬ¶æĢģ åĴĮ æŁĲ æĿ¡ è¾¹ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstatus Ġæ Ł Ĳ çĬ¶æĢģ ĊĠĠĠĠ Ġ* Ġ@ param Ġedge ĠĠ Ġæ Ł Ĳ æĿ¡ è¾¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdisconnect ( edge : ĠN GA Edge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġedge . end !!. in Edges . remove ( edge )// Ġå½ĵåīį è¾¹ çļĦ ç»ĵæĿŁ çĬ¶æĢģ çļĦ åħ¥ è¾¹ éĽĨåĲĪ åİ» éĻ¤ å½ĵåīį è¾¹ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĸŃ å¼Ģ æŁĲä¸ª çĬ¶æĢģ åĴĮ æīĢæľī è¾¹ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstatus Ġæ Ł Ĳ çĬ¶æĢģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdisconnect ( status : ĠN GA Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġæ¸ ħ éĻ¤ æīĢæľī åħ¥ è¾¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġstatus . in Edges . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedge Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect ( edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* Ġæ¸ ħ éĻ¤ æīĢæľī åĩº è¾¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġstatus . out Edges . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedge Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect ( edge ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ äº§çĶŁ NG A æĺłå°Ħ è¡¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate NG A Map () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( exp Ġin Ġarr Non Terminal s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġitem ) Ġin Ġexp . rule . arr Rules . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ è¡¨è¾¾å¼ı è½¬æį¢ æĪĲ NG A Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag Ġ= ĠNG AB ag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . expression Ġ= Ġitem . expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . prefix Ġ= Ġexp . name Ġ+ Ġ"[" Ġ+ Ġi Ġ+ Ġ" ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . expression !!. visit ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeng a Ġ= Ġbag . ng a ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠN GA åİ» Epsilon è¾¹ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġdelete Epsilon ( eng a !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ä¿ĿåŃĺ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap NG A [ item ] Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠN GA åİ» Epsilon è¾¹ ï¼Ī ä¸İ D FA åİ» E è¾¹ ç®Ĺæ³ķ çĽ¸ ä¼¼ ï¼ī ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġeng a ĠEN GA ĊĠĠĠĠ Ġ* Ġ@ return ĠN GA çĬ¶æĢģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdelete Epsilon ( eng a : ĠEN GA ): ĠN GA Status Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġèİ·åıĸ çĬ¶æĢģ éĹŃ åĮħ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġn ga Status List Ġ= Ġget NG A Status Closure ( B read th First Search (), Ġeng a . begin !! ) ĊĠĠĠĠĠĠĠ Ġ/* Ġåı¯ åĪ° è¾¾ çĬ¶æĢģ éĽĨåĲĪ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġavailable Status Ġ= Ġmutable ListOf < NG A Status >() ĊĠĠĠĠĠĠĠ Ġ/* Ġåı¯ åĪ° è¾¾ æłĩçŃ¾ éĽĨåĲĪ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġavailable Labels Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġ/* Ġåı¯ åĪ° è¾¾ æłĩçŃ¾ éĽĨ åĵĪ å¸Į è¡¨ ï¼Ī çĶ¨äºİ æŁ¥æī¾ ï¼ī Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġavailable Labels Set Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġ/* Ġæ Ĳ ľç´¢ æīĢæľī æľīæķĪ çĬ¶æĢģ Ġ*/ ĊĠĠĠĠĠĠĠ Ġavailable Status . add ( ng a Status List [ 0 ]) ĊĠĠĠĠĠĠĠ Ġavailable Labels . add ( ng a Status List [ 0 ]. data . label ) ĊĠĠĠĠĠĠĠ Ġavailable Labels Set . add ( ng a Status List [ 0 ]. data . label ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( status Ġin Ġn ga Status List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ=== Ġn ga Status List [ 0 ]) Ġ{// Ġ æİĴ éĻ¤ ç¬¬ä¸Ģä¸ª ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġstatus . in Edges . isNotEmpty () Ġ&& Ġstatus . in Edges . any Ġ{ Ġit . data . type Ġ!= ĠN GA Edge Type . EPS ILON Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( available Ġ&& Ġ! available Labels Set . contains ( status . data . label )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Status . add ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Labels . add ( status . data . label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Labels Set . add ( status . data . label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġepsilon B FS Ġ= Ġobject Ġ: ĠB read th First Search < NG A Edge , ĠN GA Status >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtest Edge ( edge : ĠN GA Edge ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġedge . data . type Ġ== ĠN GA Edge Type . EPS ILON ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* Ġ éģįåİĨ æīĢæľī æľīæķĪ çĬ¶æĢģ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfor Ġ( status Ġin Ġavailable Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġèİ·åıĸ å½ĵåīį çĬ¶æĢģ çļĦ Epsilon éĹŃ åĮħ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġepsilon Closure Ġ= Ġget NG A Status Closure ( epsilon B FS , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ åİ» éĻ¤ èĩª èº« çĬ¶æĢģ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġepsilon Closure . remove ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ éģįåİĨ Epsilon éĹŃ åĮħ çļĦ çĬ¶æĢģ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( epsilon Status Ġin Ġepsilon Closure ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( epsilon Status . data . final ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġå¦Ĥæŀľ éĹŃ åĮħ ä¸Ń æľī ç»Ī æĢģ ï¼Į åĪĻ å½ĵåīį çĬ¶æĢģ ä¸º ç»Ī æĢģ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . data . final Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ éģįåİĨ éĹŃ åĮħ ä¸Ń æīĢæľī è¾¹ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepsilon Status . out Edges . filter Ġ{ Ġedge Ġ-> Ġedge . data . type Ġ!= ĠN GA Edge Type . EPS ILON Ġ}. forEach Ġ{ Ġedge Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ èİ·å¾Ĺ ç´¢å¼ķ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġavailable Labels . indexOf ( edge . end !!. data . label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġå¦Ĥæŀľ å½ĵåīį è¾¹ ä¸įæĺ¯ Epsilon è¾¹ ï¼Į å°± å°Ĩ éĹŃ åĮħ ä¸ŃçļĦ æľīæķĪ è¾¹ æ·»åĬł åĪ° å½ĵåīį çĬ¶æĢģ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect ( status , Ġavailable Status [ idx ]). data Ġ= Ġedge . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* ĠåĪłéĻ¤ Epsilon è¾¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfor Ġ( status Ġin Ġn ga Status List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġstatus . out Edges . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedge Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( edge . data . type Ġ== ĠN GA Edge Type . EPS ILON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect ( edge )// ĠåĪłéĻ¤ Epsilon è¾¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* ĠåĪłéĻ¤ æĹł æķĪ çĬ¶æĢģ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġun access iable Status Ġ= Ġn ga Status List . filter Ġ{ Ġ! available Status . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( status Ġin Ġun access iable Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn ga Status List . remove ( status )// ĠåĪłéĻ¤ æĹł æķĪ çĬ¶æĢģ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect ( status )// ĠåĪłéĻ¤ ä¸İ çĬ¶æĢģ æľī åħ³ çļĦæīĢæľī è¾¹ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġeng a . begin !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¼Ģå§ĭ éģįåİĨ åŃĲ ç»ĵçĤ¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbegin Ch il ren () Ġ{ ĊĠĠĠĠĠĠĠ Ġbag . stk NG A . push ( mutable ListOf ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç»ĵæĿŁ éģįåİĨ åŃĲ ç»ĵçĤ¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġend Ch il ren () Ġ{ ĊĠĠĠĠĠĠĠ Ġbag . child NG A Ġ= Ġbag . stk NG A . pop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¿ĿåŃĺ ç»ĵæŀľ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġeng a ĠE psilon NG A ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstore ( eng a : ĠEN GA ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bag . stk NG A . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeng a . end !!. data . final Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbag . ng a Ġ= Ġeng a ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbag . stk NG A . peek (). add ( eng a ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Begin ( node : ĠToken Exp , Ġbag : ĠVisit Bag ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Begin ( node : ĠRule Exp , Ġbag : ĠVisit Bag ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Begin ( node : ĠSequence Exp , Ġbag : ĠVisit Bag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbegin Ch il ren () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Begin ( node : ĠBranch Exp , Ġbag : ĠVisit Bag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbegin Ch il ren () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Begin ( node : ĠOption Exp , Ġbag : ĠVisit Bag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbegin Ch il ren () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Begin ( node : ĠProperty Exp , Ġbag : ĠVisit Bag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbegin Ch il ren () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit End ( node : ĠToken Exp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġ æĸ°å»º EN GA Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġeng a Ġ= Ġcreate EN GA ( node ) ĊĠĠĠĠĠĠĠ Ġ/* Ġ è¿ŀæİ¥ EN GA è¾¹ å¹¶ ä¿ĿåŃĺ å½ĵåīį ç»ĵçĤ¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġedge Ġ= Ġconnect ( eng a . begin , Ġeng a . end ) ĊĠĠĠĠĠĠĠ Ġedge . data . type Ġ= ĠN GA Edge Type . TOKEN ĊĠĠĠĠĠĠĠ Ġedge . data . token Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġstore ( eng a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit End ( node : ĠRule Exp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġ æĸ°å»º EN GA Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġeng a Ġ= Ġcreate EN GA ( node ) ĊĠĠĠĠĠĠĠ Ġ/* Ġ è¿ŀæİ¥ EN GA è¾¹ å¹¶ ä¿ĿåŃĺ å½ĵåīį ç»ĵçĤ¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġedge Ġ= Ġconnect ( eng a . begin , Ġeng a . end ) ĊĠĠĠĠĠĠĠ Ġedge . data . type Ġ= ĠN GA Edge Type . RULE ĊĠĠĠĠĠĠĠ Ġedge . data . rule Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġstore ( eng a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit End ( node : ĠSequence Exp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġend Ch il ren () ĊĠĠĠĠĠĠĠ Ġ/* Ġ ä¸² èģĶ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġeng a Ġ= ĠEN GA () ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġbag . child NG A ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( eng a . begin Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect ( eng a . end , Ġchild . begin )// Ġ é¦ĸ å°¾ çĽ¸ è¿ŀ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeng a . end Ġ= Ġchild . end ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeng a . begin Ġ= Ġbag . child NG A [ 0 ]. begin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeng a . end Ġ= Ġbag . child NG A [ 0 ]. end ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstore ( eng a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit End ( node : ĠBranch Exp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġend Ch il ren () ĊĠĠĠĠĠĠĠ Ġ/* Ġ æĸ°å»º EN GA Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġeng a Ġ= Ġcreate EN GA ( node ) ĊĠĠĠĠĠĠĠ Ġ/* Ġ å¹¶ èģĶ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġbag . child NG A ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ å¤įåĪ¶ æłĩçŃ¾ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . begin !!. data . label Ġ= Ġeng a . begin !!. data . label ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . end !!. data . label Ġ= Ġeng a . end !!. data . label ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ è¿ŀæİ¥ é¦ĸ å°¾ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect ( eng a . begin , Ġchild . begin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect ( child . end , Ġeng a . end ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstore ( eng a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit End ( node : ĠOption Exp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġend Ch il ren () ĊĠĠĠĠĠĠĠ Ġ/* Ġ èİ·å¾Ĺ åĶ¯ä¸Ģ çļĦä¸Ģä¸ª åŃĲ ç»ĵçĤ¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġeng a Ġ= Ġbag . child NG A [ 0 ] ĊĠĠĠĠĠĠĠ Ġeng a . begin !!. data . label Ġ= ĠSyntax . get Single String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . prefix , Ġbag . expression !! , Ġnode , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġeng a . end !!. data . label Ġ= ĠSyntax . get Single String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . prefix , Ġbag . expression !! , Ġnode , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ/* Ġæ·»åĬł åı¯ éĢī è¾¹ ï¼Į åį³ Epsilon è¾¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconnect ( eng a . begin , Ġeng a . end ) ĊĠĠĠĠĠĠĠ Ġstore ( eng a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit End ( node : ĠProperty Exp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġend Ch il ren () ĊĠĠĠĠĠĠĠ Ġ/* Ġ èİ·å¾Ĺ åĶ¯ä¸Ģ çļĦä¸Ģä¸ª åŃĲ ç»ĵçĤ¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġeng a Ġ= Ġbag . child NG A [ 0 ] ĊĠĠĠĠĠĠĠ Ġeng a . begin !!. data . label Ġ= ĠSyntax . get Single String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . prefix , Ġbag . expression !! , Ġnode , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġeng a . end !!. data . label Ġ= ĠSyntax . get Single String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . prefix , Ġbag . expression !! , Ġnode , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ/* Ġ èİ·å¾Ĺ è¯¥ ç»ĵçĤ¹ çļĦ è¾¹ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġedge Ġ= Ġeng a . begin !!. out Edges [ 0 ] ĊĠĠĠĠĠĠĠ Ġedge . data . storage Ġ= Ġnode . i Storage ĊĠĠĠĠĠĠĠ Ġedge . data . handler Ġ= Ġnode . error Handler ĊĠĠĠĠĠĠĠ Ġedge . data . action Ġ= Ġnode . action Handler ĊĠĠĠĠĠĠĠ Ġstore ( eng a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĸ°å»º EN GA ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġ ç»ĵçĤ¹ ĊĠĠĠĠ Ġ* Ġ@ return ĠEN GA è¾¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate EN GA ( node : ĠIS yntax Component ): ĠEN GA Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeng a Ġ= ĠEN GA () ĊĠĠĠĠĠĠĠ Ġeng a . begin Ġ= ĠN GA Status () ĊĠĠĠĠĠĠĠ Ġeng a . end Ġ= ĠN GA Status () ĊĠĠĠĠĠĠĠ Ġeng a . begin !!. data . label Ġ= ĠSyntax . get Single String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . prefix , Ġbag . expression !! , Ġnode , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġeng a . end !!. data . label Ġ= ĠSyntax . get Single String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbag . prefix , Ġbag . expression !! , Ġnode , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġeng a ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĿŀ ç¡®å®ļ æĢ§ æĸĩ æ³ķ èĩªåĬ¨ æľº æııè¿° ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstatus ĠN GA çĬ¶æĢģ ĊĠĠĠĠ Ġ* Ġ@ param Ġprefix Ġ åīį ç¼Ģ ĊĠĠĠĠ Ġ* Ġ@ return Ġæı ı è¿° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget NG A String ( status : ĠN GA Status , Ġprefix : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalg Ġ= ĠN GA ToString ( prefix ) ĊĠĠĠĠĠĠĠ Ġstatus . visit ( alg ) ĊĠĠĠĠĠĠĠ Ġreturn Ġalg . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġn ga String ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġèİ·åıĸ NG A çĬ¶æĢģ éĹŃ åĮħ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġb fs ĠĠĠ Ġ éģįåİĨ ç®Ĺæ³ķ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġstatus Ġ åĪĿ æĢģ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ åĪĿ æĢģ éĹŃ åĮħ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget NG A Status Closure ( b fs : ĠB read th First Search < NG A Edge , ĠN GA Status >, Ġstatus : ĠN GA Status ): ĠMutable List < NG A Status > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . visit ( b fs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġb fs . arr Status ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ