package Ġcom . cb rew . chart Ċ Ċ import Ġcom . cb rew . un ify .* Ċ Ċ class ĠFeature Grammar Ġ: ĠChart Grammar Ġ{ ĊĊĠĠĠ Ġval Ġgrammar : ĠGram mar ĊĊĠĠĠ Ġprivate Ġval Ġleft Corner : ĠMutable Map < String , ĠMutable Set < Rule >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġconstructor ( g : ĠGram mar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgrammar Ġ= Ġg ĊĠĠĠĠĠĠĠ Ġgrammar . rules . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġit . first Needed (). key () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Corner [ k ]?. add ( it ) Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Corner [ k ] Ġ= Ġmutable Set Of ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun ĠRule . lhs (): ĠUn ifiable Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC fg Rule Ġ-> Ġlhs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM cfg Rule Ġ-> Ġlhs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" all Ġmembers Ġof Ġrules Ġshould Ġbe Ġrules ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠRule . first Needed (): ĠUn ifiable Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC fg Rule Ġ-> Ġrhs . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM cfg Rule Ġ-> Ġrhs . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" all Ġmembers Ġof Ġrules Ġshould Ġbe Ġrules ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠRule . rhs (): ĠList < Un ifiable > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC fg Rule Ġ-> Ġrhs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM cfg Rule Ġ-> Ġrhs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" all Ġmembers Ġof Ġrules Ġshould Ġbe Ġrules ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġspawn ( lc : ĠComplete ): ĠList < Edge > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcat Ġ= Ġlc . category ĊĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġcat . key () ĊĠĠĠĠĠĠĠ Ġval Ġrules Ġ= Ġleft Corner [ k ]?. filter Ġ{ Ġr : ĠRule Ġ-> Ġcat . un ify ( r . first Needed ()) Ġ!= Ġnull Ġ} Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠ Ġreturn Ġrules . map Ġ{ Ġr Ġ-> Ġempty Edge ( r . lhs (), Ġlc . start , Ġr . rhs ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlookup ( word : ĠString , Ġstart : ĠInt ): ĠList < Edge > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrammar . lex icon [ word ]?. map Ġ{ Ġe Ġ-> ĠComplete ( e , Ġstart , Ġstart Ġ+ Ġ 1 ) Ġ} Ġ?: ĠlistOf () ĊĊĊĠĠĠ Ġoverride Ġfun Ġlookup ( words : ĠList < String >, Ġstart : ĠInt , Ġend : ĠInt ): ĠList < Edge > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrammar . lex icon [ words . join ToString (" Ġ" )] ?. map Ġ{ Ġe Ġ-> ĠComplete ( e , Ġstart , Ġend ) Ġ} Ġ?: ĠlistOf () ĊĊ Ċ }