/** Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠDr . ĠDavid ĠH . ĠA keh ur st Ġ( http :// dr . david . h . ake hur st . net ) Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġnet . ake hur st . language . ag l . runtime . structure Ċ Ċ import Ġnet . ake hur st . language . api . parser . Parser Exception Ċ Ċ @ Dsl Marker Ċ internal Ġannotation Ġclass ĠRuntime Rule Set Dsl Marker Ċ Ċ internal Ġfun Ġruntime Rule Set ( init : ĠRuntime Rule Set Builder 2 . () Ġ-> ĠUnit ): ĠRuntime Rule Set Ġ{ ĊĠĠĠ Ġval Ġb Ġ= ĠRuntime Rule Set Builder 2 () ĊĠĠĠ Ġb . init () ĊĠĠĠ Ġreturn Ġb . rule Set () Ċ } Ċ Ċ @ Runtime Rule Set Dsl Marker Ċ internal Ġclass ĠRuntime Rule Set Builder 2 () Ġ{ ĊĊĠĠĠ Ġvar Ġruntime Rule Set Ġ= ĠRuntime Rule Set () ĊĊĠĠĠ Ġval Ġrule Builders : ĠMutable List < Runtime Rule Builder > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġfun Ġfind Rule Builder By Tag ( tag : ĠString ): ĠRuntime Rule Builder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . rule Builders . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . tag Ġ== Ġtag ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrule Set (): ĠRuntime Rule Set Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . runtime Rule Set . runtime Rules . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// build Ġand Ġvalidate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrules Ġ= Ġthis . rule Builders . map Indexed Ġ{ Ġindex , Ġrb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrb . build Rule ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Map Ġ= Ġmutable Map Of < String , ĠRuntime Rule >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrules . forEach Ġ{ Ġrule Map [ it . tag ] Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr bs Ġ= Ġthis . rule Builders . toList () Ġ// to Ġstop Ġconc urent Ġmodification ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr bs . forEach Ġ{ Ġrb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( rb . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime Rule Kind . GO AL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime Rule Kind . TERMIN AL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Ġ= Ġrb . rule !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġrule . rhs Opt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParser Exception (" Invalid ĠRule Ġ${ rule . tag }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime Rule Kind . NON _ TERMIN AL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Ġ= Ġrb . build R hs ( rule Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġrule . rhs Opt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParser Exception (" Invalid ĠRule Ġ${ rule . tag }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime Rule Kind . EMB ED DED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Ġ= Ġrb . rule !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġrule . embedded Runtime Rule Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParser Exception (" Invalid ĠRule Ġ${ rule . tag }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġrule . embedded Start Rule ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParser Exception (" Invalid ĠRule Ġ${ rule . tag }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . runtime Rule Set . set Rules ( rule Map . values . toList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . runtime Rule Set ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġskip ( tag : ĠString , Ġinit : ĠRuntime Rule Items Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrhs B Ġ= ĠRuntime Rule Items Builder ( this , ĠRuntime Rule R hs Items Kind . CONCAT EN ATION , ĠRuntime Rule Choice Kind . NONE , ĠRuntime Rule List Kind . NONE ,- 1 , Ġ 0 , Ġis Skip Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġrhs B . init () ĊĠĠĠĠĠĠĠ Ġval Ġrb Ġ= ĠRuntime Rule Builder ( this , Ġtag , Ġ"", ĠRuntime Rule Kind . NON _ TERMIN AL , Ġfalse , Ġtrue , Ġrhs B ) ĊĠĠĠĠĠĠĠ Ġthis . rule Builders . add ( rb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġempty ( rule That IsEmpty : ĠRuntime Rule ): ĠRuntime Rule Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" Â§ empty ." Ġ+ Ġrule That IsEmpty . tag ĊĠĠĠĠĠĠĠ Ġval Ġrhs B Ġ= ĠRuntime Rule Items Builder ( this , ĠRuntime Rule R hs Items Kind . EMPTY , ĠRuntime Rule Choice Kind . NONE , ĠRuntime Rule List Kind . NONE , Ġ- 1 , Ġ 0 , Ġfalse , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġrhs B . ref ( rule That IsEmpty . tag ) ĊĠĠĠĠĠĠĠ Ġval Ġrb Ġ= ĠRuntime Rule Builder ( this , Ġname , Ġname , ĠRuntime Rule Kind . TERMIN AL , Ġfalse , Ġfalse , Ġrhs B ) ĊĠĠĠĠĠĠĠ Ġthis . rule Builders . add ( rb ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// fun Ġempty ( name : ĠString ) Ġ{ ĊĠĠĠ Ġ// ĠĠĠ Ġval Ġrhs B Ġ= ĠRuntime Rule Items Builder ( this , ĠRuntime Rule R hs Items Kind . EMPTY , ĠRuntime Rule Choice Kind . NONE , Ġ- 1 , Ġ 0 , Ġfalse , Ġtrue ) ĊĠĠĠ Ġ// ĠĠĠ Ġval Ġrb Ġ= ĠRuntime Rule Builder ( this , Ġname , Ġname , ĠRuntime Rule Kind . TERMIN AL , Ġfalse , Ġfalse , Ġrhs B ) ĊĠĠĠ Ġ// ĠĠĠ Ġthis . rule Builders . add ( rb ) ĊĠĠĠ Ġ//} ĊĊĠĠĠ Ġfun Ġliteral ( tag : ĠString , Ġvalue : ĠString , Ġis Skip : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġthis . find Rule Builder By Tag ( tag ) ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġexisting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrb Ġ= ĠRuntime Rule Builder ( this , Ġtag , Ġvalue , ĠRuntime Rule Kind . TERMIN AL , Ġfalse , Ġis Skip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rule Builders . add ( rb ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// do Ġnothing Ġ// Ġthrow ĠRuntimeException (" Already Ġgot Ġa Ġrule Ġwith Ġtag Ġ= Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpattern ( tag : ĠString , Ġpattern : ĠString , Ġis Skip : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġthis . find Rule Builder By Tag ( tag ) ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġexisting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrb Ġ= ĠRuntime Rule Builder ( this , Ġtag , Ġpattern , ĠRuntime Rule Kind . TERMIN AL , Ġtrue , Ġis Skip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rule Builders . add ( rb ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// do Ġnothing Ġ// throw ĠRuntimeException (" Already Ġgot Ġa Ġrule Ġwith Ġtag Ġ= Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ_ rule ( ĊĠĠĠĠĠĠĠ Ġtag : ĠString , ĊĠĠĠĠĠĠĠ Ġkind : ĠRuntime Rule R hs Items Kind , ĊĠĠĠĠĠĠĠ Ġchoice Kind : ĠRuntime Rule Choice Kind , ĊĠĠĠĠĠĠĠ Ġlist Kind : ĠRuntime Rule List Kind , ĊĠĠĠĠĠĠĠ Ġmin : ĠInt Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠ Ġmax : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġinit : ĠRuntime Rule Items Builder . () Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠRuntime Rule Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrhs B Ġ= ĠRuntime Rule Items Builder ( this , Ġkind , Ġchoice Kind , Ġlist Kind , min , Ġmax ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( list Kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime Rule List Kind . MULTI Ġ-> Ġif Ġ( min Ġ== Ġ 0 ) Ġrhs B . add Empty Rule Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime Rule List Kind . SEPAR ATED _ LIST Ġ-> Ġif Ġ( min Ġ== Ġ 0 ) Ġrhs B . add Empty Rule Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrhs B . init () ĊĠĠĠĠĠĠĠ Ġval Ġrb Ġ= ĠRuntime Rule Builder ( this , Ġtag , Ġ"", ĠRuntime Rule Kind . NON _ TERMIN AL , Ġfalse , Ġfalse , Ġrhs B ) ĊĠĠĠĠĠĠĠ Ġthis . rule Builders . add ( rb ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconcat enation ( name : ĠString , Ġinit : ĠRuntime Rule Items Builder . () Ġ-> ĠUnit ): ĠRuntime Rule Builder Ġ= ĊĠĠĠĠĠĠĠ Ġ_ rule ( name , ĠRuntime Rule R hs Items Kind . CONCAT EN ATION , ĠRuntime Rule Choice Kind . NONE , ĠRuntime Rule List Kind . NONE ,- 1 , Ġ 0 , Ġinit ) ĊĊĠĠĠ Ġfun Ġchoice ( name : ĠString , Ġchoice Kind : ĠRuntime Rule Choice Kind , Ġinit : ĠRuntime Rule Items Builder . () Ġ-> ĠUnit ): ĠRuntime Rule Builder Ġ= ĊĠĠĠĠĠĠĠ Ġ_ rule ( name , ĠRuntime Rule R hs Items Kind . CHO ICE , Ġchoice Kind , ĠRuntime Rule List Kind . NONE , Ġ- 1 , Ġ 0 , Ġinit ) ĊĊĠĠĠ Ġfun Ġmulti ( name : ĠString , Ġmin : ĠInt , Ġmax : ĠInt , Ġitem Ref : ĠString ): ĠRuntime Rule Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ rule ( name , ĠRuntime Rule R hs Items Kind . LIST , ĠRuntime Rule Choice Kind . NONE , ĠRuntime Rule List Kind . MULTI , Ġmin , Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref ( item Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġs List ( name : ĠString , Ġmin : ĠInt , Ġmax : ĠInt , Ġitem Ref : ĠString , Ġsep Ref : ĠString ): ĠRuntime Rule Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ rule ( name , ĠRuntime Rule R hs Items Kind . LIST , ĠRuntime Rule Choice Kind . NONE , ĠRuntime Rule List Kind . SEPAR ATED _ LIST , Ġmin , Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref ( item Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref ( sep Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġembedded ( tag : ĠString , Ġembedded Rule Set : ĠRuntime Rule Set , Ġstart Rule : ĠRuntime Rule ): ĠRuntime Rule Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrb Ġ= ĠRuntime Rule Builder ( this , Ġtag , Ġ"", ĠRuntime Rule Kind . EMB ED DED , Ġfalse , Ġfalse , Ġnull , Ġembedded Rule Set , Ġstart Rule ) ĊĠĠĠĠĠĠĠ Ġthis . rule Builders . add ( rb ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrb ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Runtime Rule Set Dsl Marker Ċ internal Ġclass ĠRuntime Rule Builder ( ĊĠĠĠ Ġval Ġr rs b : ĠRuntime Rule Set Builder 2 , ĊĠĠĠ Ġval Ġtag : ĠString , ĊĠĠĠ Ġval Ġvalue : ĠString , ĊĠĠĠ Ġval Ġkind : ĠRuntime Rule Kind , ĊĠĠĠ Ġval Ġis Pattern : ĠBoolean , ĊĠĠĠ Ġval Ġis Skip : ĠBoolean , ĊĠĠĠ Ġval Ġrhs Builder : ĠRuntime Rule Items Builder ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġembedded Rule Set : ĠRuntime Rule Set ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġstart Rule : ĠRuntime Rule ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġrule : ĠRuntime Rule ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġbuild Rule ( number : ĠInt ): ĠRuntime Rule Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġthis . rule ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rule Ġ= ĠRuntime Rule ( this . rr sb . runtime Rule Set . number , Ġnumber , Ġtag , Ġvalue , Ġkind , Ġis Pattern , Ġis Skip , Ġembedded Rule Set , Ġstart Rule ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . rule !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild R hs ( rule Map : ĠMutable Map < String , ĠRuntime Rule >): ĠRuntime Rule Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrhs Ġ= Ġrhs Builder !!. build ( rule Map , Ġthis . rule !! ) ĊĠĠĠĠĠĠĠ Ġthis . rule !!. rhs Opt Ġ= Ġrhs ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . rule !! ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠRuntime Rule Ref ( val Ġtag : ĠString ) Ċ Ċ @ Runtime Rule Set Dsl Marker Ċ internal Ġclass ĠRuntime Rule Items Builder ( ĊĠĠĠ Ġval Ġr rs b : ĠRuntime Rule Set Builder 2 , ĊĠĠĠ Ġval Ġkind : ĠRuntime Rule R hs Items Kind , ĊĠĠĠ Ġval Ġchoice Kind : ĠRuntime Rule Choice Kind , ĊĠĠĠ Ġval Ġlist Kind : ĠRuntime Rule List Kind , ĊĠĠĠ Ġval Ġmin : ĠInt , ĊĠĠĠ Ġval Ġmax : ĠInt , ĊĠĠĠ Ġval Ġis Skip : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġvar Ġadd Empty Rule : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġitems Ġ= Ġmutable ListOf < Runtime Rule Ref >() ĊĊĠĠĠ Ġfun Ġempty () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Empty Rule Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġliteral ( value : ĠString ): ĠRuntime Rule Ref Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġ"' $ value '" ĊĠĠĠĠĠĠĠ Ġthis . rr sb . literal ( tag , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġreturn Ġref ( tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpattern ( pattern : ĠString ): ĠRuntime Rule Ref Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġ"\" $ pattern \"" ĊĠĠĠĠĠĠĠ Ġthis . rr sb . pattern ( tag , Ġpattern ) ĊĠĠĠĠĠĠĠ Ġreturn Ġref ( tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġref ( name : ĠString ): ĠRuntime Rule Ref Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠRuntime Rule Ref ( name ) ĊĠĠĠĠĠĠĠ Ġitems . add ( ref ) ĊĠĠĠĠĠĠĠ Ġreturn Ġref ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild ( rule Map : ĠMutable Map < String , ĠRuntime Rule >, Ġrr : ĠRuntime Rule ): ĠRuntime Rule Item Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems 2 Ġ= Ġif Ġ( add Empty Rule ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġer Ġ= Ġthis . rr sb . empty ( rr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Rule Number Ġ= Ġrule Map . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġer . build Rule ( next Rule Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . rhs Opt Ġ= ĠRuntime Rule Item ( Runtime Rule R hs Items Kind . EMPTY , ĠRuntime Rule Choice Kind . NONE , ĠRuntime Rule List Kind . NONE , Ġ- 1 , Ġ 0 , ĠarrayOf ( rr )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule Map [ r . tag ] Ġ= Ġr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ+ ĠRuntime Rule Ref ( er . tag ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġr Items Ġ= Ġitems 2 . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrule Map [ it . tag ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Rule Ġ${ it . tag } Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrhs Ġ= ĠRuntime Rule Item ( this . kind , Ġthis . choice Kind , Ġthis . list Kind , Ġthis . min , Ġthis . max , Ġr Items . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġrhs ĊĠĠĠ Ġ} Ċ } Ċ