package Ġorg . du ang s use Ċ Ċ import Ġkotlin . jvm . Jvm Static Ċ Ċ type alias ĠObj Ġ= ĠAny ? Ċ type alias ĠGlobals Ġ= ĠMutable Map < String , ĠObj > Ċ type alias ĠProcessor Ġ= ĠScope .( Obj ) Ġ-> ĠObj Ċ Ċ interface ĠScope Ġ{ ĊĠ Ġoperator Ġfun Ġget ( key : ĠString ): ĠObj ĊĠ Ġoperator Ġfun Ġset ( key : ĠString , Ġvalue : ĠObj ) ĊĠ Ġfun Ġenter Block (); Ġfun Ġleave Block () ĊĠ Ġfun Ġclosure () Ġ= Ġthis Ċ } Ċ /** ĠBasic Ġen closed Ġscope Ġimplementation Ġ*/ Ċ open Ġclass ĠDynamic S co ping ( val Ġglobals : ĠGlobals ): ĠScope Ġ{ ĊĠ Ġprivate Ġval Ġstack Ġ= Ġmutable ListOf < Globals ?> () ĊĠ Ġoverride Ġfun Ġget ( key : ĠString ) Ġ= Ġglobals [ key ] ĊĠ Ġoverride Ġfun Ġset ( key : ĠString , Ġvalue : ĠObj ) Ġ{ ĊĠĠĠ Ġif Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġparent Ġ= Ġstack . get Or Init ( stack . last Index , Ġ:: mutable Map Of ) ĊĠĠĠĠĠ Ġparent [ key ] Ġ= Ġglobals [ key ] ĊĠĠĠ Ġ} ĊĠĠĠ Ġglobals [ key ] Ġ= Ġvalue ĊĠ Ġ} ĊĠ Ġoverride Ġfun Ġenter Block () Ġ{ Ġstack . add ( null ) Ġ} ĊĠ Ġoverride Ġfun Ġleave Block () Ġ{ ĊĠĠĠ Ġval Ġparent Ġ= Ġstack . remove At ( stack . last Index ) Ġ?: Ġreturn Ġ// Ġno Ġset () Ġcalled Ġon Ġthat ĊĠĠĠ Ġfor Ġ(( k , Ġold V ) Ġin Ġparent . entries ) Ġglobals [ k ] Ġ= Ġold V ĊĠ Ġ} ĊĠ Ġoverride Ġfun Ġclosure (): ĠLex ical Scope Ġ{ ĊĠĠĠ Ġval Ġshadow ed : ĠGlobals Ġ= Ġmutable Map Of () ĊĠĠĠ Ġfor Ġ( frame Ġin Ġstack ) Ġif Ġ( frame Ġ!= Ġnull ) Ġfor Ġ( key Ġin Ġframe . keys ) Ġ{ ĊĠĠĠĠĠ Ġshadow ed [ key ] Ġ= Ġglobals [ key ] ĊĠĠĠ Ġ} Ġ// Ġstack . flatMap Ġ{ Ġit ?. keys Ġ?: Ġempty Set () Ġ}. associate With To ( mutable Map Of ()) Ġ{ Ġglobals [ it ] Ġ} ĊĠĠĠ Ġreturn ĠLex ical Scope ( globals , Ġshadow ed ) ĊĠ Ġ} Ċ } Ċ /** ĠJust Ġ[ Dynamic S co ping ] Ġwith Ġcloned , Ġflatten ed Ġup values Ġas Ġglobals Ġ*/ Ċ class ĠLex ical Scope ( private Ġval Ġtop Globals : ĠGlobals , Ġup values : ĠGlobals ): ĠDynamic S co ping ( up values ) Ġ{ ĊĠ Ġoverride Ġfun Ġget ( key : ĠString ) Ġ= Ġsuper . get ( key ) Ġ?: Ġtop Globals [ key ] ĊĠ Ġoverride Ġfun Ġclosure () Ġ= ĠLex ical Scope ( top Globals , Ġglobals . to Mutable Map ()) ĊĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Î» .$ globals Ġin Ġ$ top Globals " Ċ } Ċ fun ĠScope . resolve ( name : ĠString ) Ġ= Ġthis [ name ] Ġ?: Ġerror (" undefined Ġvariable Ġ$ name ") Ċ inline Ġfun Ġ< re ified ĠT : Any > ĠScope . get Typed ( name : ĠString , Ġmessage : ĠString ) Ġ= Ġresolve ( name ) Ġas ? ĠT Ġ?: Ġerror ( message ) Ċ Ċ private Ġinline Ġfun Ġ< T > ĠMutable List < T ?> . get Or Init ( index : ĠInt , Ġinit : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠ Ġif Ġ( this [ index ] Ġ== Ġnull ) Ġthis [ index ] Ġ= Ġinit () ĊĠ Ġ@ Suppress (" unchecked _ cast ") Ġreturn Ġthis [ index ] Ġas ĠT Ċ } Ċ private Ġfun Ġimpossible (): ĠNothing Ġ= Ġthrow ĠError () Ċ Ċ /** Ġ[ K ]: [ V ] Ġ= Ġ 1 : 1 Ġ( instead Ġof ĠN : 1 ) Ġbi - direction al Ġmap Ġ*/ Ċ class ĠB idir Map < K , ĠV > Ġprivate Ġconstructor ( private Ġval Ġback : ĠMutable Map < K , ĠV >): ĠMutable Map < K , ĠV > Ġby Ġback Ġ{ ĊĠ Ġprivate Ġval Ġrev Back Ġ= Ġmutable Map Of < V , ĠK >() ĊĠ Ġfun Ġkey Of ( value : ĠV ) Ġ= Ġrev Back [ value ] ĊĠ Ġoverride Ġfun Ġput ( key : ĠK , Ġvalue : ĠV ): ĠV ? Ġ{ ĊĠĠĠ Ġrequire (! rev Back . containsKey ( value )) Ġ{" value Ġ$ value Ġrepeated Ġ( in Ġkey Ġ$ key ) "} ĊĠĠĠ Ġrev Back [ value ] Ġ= Ġkey ĊĠĠĠ Ġreturn Ġback . put ( key , Ġvalue ) ĊĠ Ġ} ĊĠ Ġoverride Ġfun Ġput All ( from : ĠMap < out ĠK , ĠV >) Ġ{ ĊĠĠĠ Ġfrom . values . first OrNull Ġ{ Ġ! rev Back . containsKey ( it ) Ġ} ?. let Ġ{ Ġthrow ĠIllegalArgumentException (" value Ġ$ it Ġrepeated Ġ( in Ġmap Ġ$ from )") Ġ} ĊĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġfrom . entries ) Ġrev Back [ v ] Ġ= Ġk ĊĠĠĠ Ġback . put All ( from ) ĊĠ Ġ} ĊĠ Ġoverride Ġfun Ġremove ( key : ĠK ): ĠV ? Ġ{ ĊĠĠĠ Ġval Ġvalue Ġ= Ġback . remove ( key ) ĊĠĠĠ Ġvalue ?. let ( rev Back :: remove ) ĊĠĠĠ Ġreturn Ġvalue ĊĠ Ġ} ĊĠ Ġoverride Ġval Ġvalues : ĠMutable Collection < V > Ġget () Ġ= Ġrev Back . keys ĊĠ Ġoverride Ġfun Ġcontains Value ( value : ĠV ): ĠBoolean Ġ= Ġrev Back . containsKey ( value ) ĊĠ Ġoverride Ġfun Ġclear () Ġ{ Ġrev Back . clear (); Ġback . clear () Ġ} ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġ< K , ĠV > Ġof ( var arg Ġpairs : ĠPair < K , ĠV >): ĠB idir Map < K , ĠV > Ġ{ ĊĠĠĠĠĠ Ġval Ġbid Ġ= ĠB idir Map < K , ĠV >( mutable Map Of ()) ĊĠĠĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġpairs ) Ġbid [ k ] Ġ= Ġv ĊĠĠĠĠĠ Ġreturn Ġbid ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġ< FORM , ĠK , ĠV > Ġtranslate ( forms : ĠMap < FORM , ĠB idir Map < K , ĠV >>, Ġmode : ĠPair < FORM , ĠFORM >, Ġvalue : ĠK ): ĠK ? Ġ{ ĊĠĠĠĠĠ Ġval Ġ( src , Ġdest ) Ġ= Ġmode ĊĠĠĠĠĠ Ġval Ġstandard Ġ= Ġforms [ src ]?. get ( value ) ĊĠĠĠĠĠ Ġreturn Ġif Ġ( standard Ġ== Ġnull ) Ġnull Ġelse Ġforms [ dest ]?. key Of ( standard ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġ< V > Ġidentity ( var arg Ġvalues : ĠV ) Ġ= ĠB idir Map < V , ĠV >( mutable Map Of ()). apply Ġ{ Ġfor Ġ( value Ġin Ġvalues ) Ġthis [ value ] Ġ= Ġvalue Ġ} ĊĠ Ġ} Ċ } Ċ Ċ //// Ġ== Ġabstract ĠSyntax ĠTree Ġand Ġscript ĠAPI Ġ== Ċ sealed Ġclass ĠTemp lator Ast Ġ{ ĊĠ Ġabstract Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) ĊĊĠ Ġclass ĠPlain ( val Ġtext : ĠString ): ĠTemp lator Ast () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ Ġsb . append ( text ) Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠVal Ref ( val Ġname : ĠString ): ĠTemp lator Ast () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ Ġsb . append ( map . resolve ( name ). toString ()) Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠVal Pipe ( val Ġpipes : ĠList < String >, Ġval Ġname : ĠString ): ĠTemp lator Ast () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ ĊĠĠĠĠĠ Ġval Ġres Ġ= Ġpipes . fold Right ( map . resolve ( name )) Ġ{ Ġit , Ġres : Obj Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( it [ it . length - 1 ] Ġ== Ġ'= ') Ġ{ Ġmap [ it . substring ( 0 , Ġit . length - 1 )] Ġ= Ġres ; Ġres Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġtry Ġ{ Ġmap . get Typed < Processor >( it , Ġ" bad Ġfunction Ġ$ it ")( map , Ġres ) Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( c : ĠControl Exception ) Ġ{ Ġthrow Ġc Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ Ġthrow ĠException (" Failed Ġcalling Ġprocess Ġ$ it : Ġ${ e . message }\ nin Ġ$ pipes Ġ<- Ġ$ name Ġwith Ġres : Ġ$ res ", Ġe ) Ġ} ĊĠĠĠĠĠ Ġ}. toString () ĊĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġ" ok ") Ġsb . append ( res ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠBlock ( val Ġitems : ĠList < Temp lator Ast >): ĠTemp lator Ast () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ Ġitems . forEach Ġ{ Ġit . fill To ( sb , Ġmap ) Ġ} Ġ} ĊĠ Ġ} ĊĠ Ġabstract Ġclass ĠHas Block ( val Ġblock : ĠBlock ): ĠTemp lator Ast () ĊĠ Ġclass ĠBuild String ( val Ġname : ĠString , Ġb : ĠBlock ): ĠHas Block ( b ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ ĊĠĠĠĠĠ Ġval Ġsb 1 Ġ= Ġmap [ name ] Ġas ? ĠStringBuilder Ġ?: ĠStringBuilder (). also Ġ{ Ġmap [ name ] Ġ= Ġit Ġ} ĊĠĠĠĠĠ Ġblock . fill To ( sb 1 , Ġmap ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġabstract Ġclass ĠBase For ( val Ġname : ĠString , Ġval Ġvar Name : ĠString , Ġb : ĠBlock ): ĠHas Block ( b ) Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġon Each ( value : ĠObj , Ġmap : ĠScope ) ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ ĊĠĠĠĠĠ Ġmap . enter Block () ĊĠĠĠĠĠ Ġfor Ġ( it Ġin Ġmap . get Typed < Iterable < *> >( varName , Ġ"$ varName Ġnot Ġiterable ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Each ( it , Ġmap ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ Ġblock . fill To ( sb , Ġmap ) Ġ} Ġcatch Ġ( c : ĠControl Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( c . mode ) Ġ{ ĠBRE AK Ġ-> Ġbreak ; ĠCONTINUE Ġ-> Ġcontinue ; Ġelse Ġ-> Ġ{ Ġmap . leave Block (); Ġthrow Ġc Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmap . leave Block () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠFor In ( name : ĠString , Ġvar Name : ĠString , Ġb : ĠBlock ): ĠBase For ( name , Ġvar Name , Ġb ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Each ( value : ĠObj , Ġmap : ĠScope ) Ġ{ Ġmap [ name ] Ġ= Ġvalue Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠFor Do ( name : ĠString , Ġvar Name : ĠString , Ġb : ĠBlock ): ĠBase For ( name , Ġvar Name , Ġb ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Each ( value : ĠObj , Ġmap : ĠScope ) Ġ{ Ġmap . get Typed < Processor >( name , Ġ" bad Ġdestructor Ġ$ name ")( map , Ġvalue ) Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠIf ( val Ġinverted : ĠBoolean , Ġval Ġvar Name : ĠString , Ġval Ġa : ĠBlock , Ġval Ġb : ĠBlock ): ĠTemp lator Ast () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtruth y Ġ= Ġ( map [ varName ] Ġas ? ĠBoolean ) Ġ== Ġtrue ĊĠĠĠĠĠ Ġmap . enter Block () ĊĠĠĠĠĠ Ġif Ġ( if Ġ( inverted ) Ġ! truth y Ġelse Ġtruth y ) Ġa . fill To ( sb , Ġmap ) Ġelse Ġb . fill To ( sb , Ġmap ) ĊĠĠĠĠĠ Ġmap . leave Block () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠTable ( val Ġvariables : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠ Ġfun Ġfill ( map : ĠScope ) Ġ{ Ġfor Ġ(( k , Ġv ) Ġin Ġvariables . entries ) Ġif Ġ( v . isNotEmpty () Ġ&& Ġv [ 0 ] Ġ== Ġ'$ ') Ġmap [ k ] Ġ= Ġmap [ v . substring ( 1 )] Ġelse Ġmap [ k ] Ġ= Ġv Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠLet In ( val Ġtable : ĠTable , Ġb : ĠBlock ): ĠHas Block ( b ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ ĊĠĠĠĠĠ Ġmap . enter Block () ĊĠĠĠĠĠ Ġtable . fill ( map ) ĊĠĠĠĠĠ Ġblock . fill To ( sb , Ġmap ) ĊĠĠĠĠĠ Ġmap . leave Block () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠDef ( val Ġname : ĠString , Ġval Ġtable : ĠTable , Ġb : ĠBlock ): ĠHas Block ( b ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill To ( sb : ĠAppend able , Ġmap : ĠScope ) Ġ{ ĊĠĠĠĠĠ Ġmap . enter Block () ĊĠĠĠĠĠ Ġtable . fill ( map ) ĊĠĠĠĠĠ Ġval Ġparams Ġ= Ġmutable ListOf < String >(); Ġfor Ġ(( k , Ġv ) Ġin Ġtable . variables . entries ) Ġif Ġ( v Ġ== Ġ"? ") Ġparams . add ( k ) ĊĠĠĠĠĠ Ġval Ġclosed = map . closure (); Ġval Ġout s = StringBuilder () ĊĠĠĠĠĠ Ġval Ġop : ĠProcessor Ġ= Ġproc @ Ġ{ ĊĠĠĠĠĠĠĠ Ġclosed . enter Block () ĊĠĠĠĠĠĠĠ Ġclosed [" it "] Ġ= Ġit ; Ġfor Ġ( k Ġin Ġparams ) Ġclosed [ k ] Ġ= Ġthis [ k ] ĊĠĠĠĠĠĠĠ Ġtry Ġ{ Ġblock . fill To ( outs , Ġclosed ) Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( c : ĠControl Exception ) Ġ{ Ġif Ġ( c . mode Ġ== ĠRETURN ) Ġreturn @ proc Ġc . value Ġelse Ġthrow Ġc Ġ} ĊĠĠĠĠĠĠĠ Ġfinally Ġ{ Ġclosed . leave Block () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġres = outs . toString (); Ġout s . clear (); Ġres ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmap . leave Block () ĊĠĠĠĠĠ Ġmap [ name ] Ġ= Ġop ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġclass ĠControl Exception ( val Ġmode : ĠInt , Ġval Ġvalue : ĠObj ): ĠException () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString ? Ġget () Ġ= Ġ" non - local Ġcontrol #$ mode Ġwith Ġ$ value " ĊĠ Ġ} ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġval Ġnop Ġ= ĠBlock ( emptyList ()) ĊĠĠĠ Ġconst Ġval ĠRETURN Ġ= Ġ 0 ĊĠĠĠ Ġconst Ġval ĠBRE AK Ġ= Ġ 1 ĊĠĠĠ Ġconst Ġval ĠCONTINUE Ġ= Ġ 2 ĊĠ Ġ} Ċ } Ċ Ċ expect Ġfun Ġline Separator (): ĠString Ċ expect Ġfun Ġmain ( var arg Ġargs : ĠString ) Ċ object ĠTemp lator Ġ{ ĊĠ Ġfun Ġfill With ( map : ĠScope , Ġvar arg Ġtemplates : ĠTemp lator Ast ): ĠString Ġ{ ĊĠĠĠ Ġval Ġlast Sb Ġ= ĠStringBuilder () ĊĠĠĠ Ġtemplates . forEach Ġ{ Ġlast Sb . clear (); Ġit . fill To ( last Sb , Ġmap ) Ġ} ĊĠĠĠ Ġreturn Ġlast Sb . toString () ĊĠ Ġ} ĊĠ Ġfun Ġcreate Global ( map : ĠMap < String , ĠObj >): ĠScope Ġ= ĠDynamic S co ping ( map . to Mutable Map (). also Ġ{ Ġit . put All ( init Globals ) Ġ}) ĊĠ Ġfun Ġcompile ( code : ĠString , Ġmode : ĠLang Mode Ġ= ĠLang Mode . Normal ) Ġ= ĠTemp lator Parser ( code , Ġmode ). read Top (). let Ġ{ ĠTemp lator Ast . Block ( it ) Ġ} ĊĠ Ġenum Ġclass ĠLang Mode Ġ{ ĠNormal , ĠPure Ġ} ĊĠ Ġclass ĠParse Error ( message : ĠString , Ġcause : ĠThrowable ? Ġ= Ġnull ): ĠException ( message , Ġcause ) ĊĠ Ġ@ Jvm Static Ġfun Ġmain ( var arg Ġargs : ĠString ) Ġ= Ġorg . du ang s use . main (* args ) ĊĠ Ġval Ġinit Globals : ĠGlobals Ġ= Ġmutable Map Of ("_ " Ġto Ġ" Ġ", Ġ" TAB " Ġto Ġ"\ t ", ĊĠĠĠ Ġ" NL " Ġto Ġline Separator (), Ġ" CR " Ġto Ġ"\ r ", Ġ" LF " Ġto Ġ"\ n ", ĊĠĠĠ Ġ" PLUS " Ġto Ġ"+", Ġ" QUEST _ MARK " Ġto Ġ" ?", Ġ" ok " Ġto Ġ"", Ġ" done " Ġto Ġ"", ĊĠĠĠ Ġ" true " Ġto Ġtrue , Ġ" false " Ġto Ġfalse , Ġ" null " Ġto Ġnull ) ĊĠ Ġval Ġnot Implemented : ĠProcessor Ġ= Ġ{ Ġerror (" not Ġimplemented Ġon Ġthis Ġplatform ") Ġ} ĊĠ Ġinit Ġ{ Ġ// Ġlib Ġprocesses Ġlike Ġvariables / cat , Ġjoin / split , Ġreplace / transform / match , Ġrepeat / map / filter / get ĊĠĠĠ Ġ@ Suppress (" unchecked _ cast ") Ġval Ġfunc Ġ= Ġinit Globals Ġas ĠMutable Map < String , ĠProcessor > ĊĠĠĠ Ġfunc [" return "] Ġ= Ġcontrol Throw ( Temp lator Ast . RETURN ) ĊĠĠĠ Ġfunc [" break "] Ġ= Ġcontrol Throw ( Temp lator Ast . BREAK ) ĊĠĠĠ Ġfunc [" continue "] Ġ= Ġcontrol Throw ( Temp lator Ast . CONTINUE ) ĊĠĠĠ Ġfunc [" variables "] Ġ= Ġ{ Ġif Ġ( it Ġis ĠString Ġ&& Ġit . isNotEmpty ()) Ġresolve ( it ) Ġelse Ġthis . closure () Ġ} ĊĠĠĠ Ġfunc [" puts "] Ġ= Ġ{ Ġprintln ( it ); Ġ"" Ġ}; Ġfunc [" puts Once "] Ġ= Ġ{ Ġprint ( it ); Ġ"" Ġ} ĊĠĠĠ Ġfunc [" require "] Ġ= Ġnot Implemented ĊĠĠĠ Ġfunc [" rename "] Ġ= Ġ{ Ġ Ġ} ĊĠĠĠ Ġfunc [" cat "] Ġ= Ġ{ Ġit . to S (). split ('+ '). join ToString ("") Ġ{ Ġpart Ġ-> Ġthis [ part ]?. to S () Ġ?: Ġpart Ġ} Ġ} ĊĠĠĠ Ġfunc [" range "] Ġ= Ġ{ Ġresolve (" start "). to I () .. resolve (" last "). to I () Ġ} ĊĠĠĠ Ġfunc [" pair "] Ġ= Ġ{ Ġresolve (" first ") Ġto Ġresolve (" second ") Ġ} ĊĠĠĠ Ġfunc [" join "] Ġ= Ġ{ Ġ( it Ġas ĠIterable < *> ). join ToString ( v Separator ()) Ġ} ĊĠĠĠ Ġfunc [" split "] Ġ= Ġ{ Ġval Ġs = it . to S (); Ġv Regex ()?. let Ġ{ Ġre Ġ-> Ġs . split ( re ) Ġ} Ġ?: Ġs . split ( v Separator ()) Ġ} ĊĠĠĠ Ġfunc [" replace "] Ġ= Ġ{ Ġval Ġs = it . to S (); Ġval Ġsubst = resolve (" subst "). to S (); Ġv Regex ()?. let Ġ{ Ġre Ġ-> Ġs . replace ( re , Ġsubst ) Ġ} Ġ?: Ġs . replace ( v Sub str (), Ġsubst ) Ġ} ĊĠĠĠ Ġfunc [" match "] Ġ= Ġ{ Ġval Ġs = it . to S (); Ġv Regex ()?. let Ġ{ Ġre Ġ-> Ġs . matches ( re ) Ġ} Ġ?: Ġs . contains ( v Sub str ()) Ġ} ĊĠĠĠ Ġfunc [" repeat "] Ġ= Ġ{ Ġval Ġsb = StringBuilder (); Ġval Ġn = resolve (" n "). to I (); Ġval Ġitem = resolve (" item "). to S (); Ġfor Ġ(_ t Ġin Ġ( 1 .. n )) Ġsb . append ( item ); Ġsb . toString () Ġ} ĊĠĠĠ Ġfunc [" map "] Ġ= Ġ{ Ġval Ġop = get Typed Req < Processor >(" op ", Ġ" processor "); Ġ( it Ġas ĠIterable < *> ). map Ġ{ Ġitem Ġ-> Ġop ( this , Ġitem ) Ġ} Ġ} ĊĠĠĠ Ġfunc [" filter "] Ġ= Ġ{ Ġval Ġop = get Typed Req < Processor >(" test ", Ġ" predicate "); Ġ( it Ġas ĠIterable < *> ). filter Ġ{ Ġitem Ġ-> Ġop ( this , Ġitem ) Ġ== Ġtrue Ġ} Ġ} ĊĠĠĠ Ġfunc [" get "] Ġ= Ġ{ Ġ( it Ġas ĠList <* >) [( this [" index "] Ġ?: Ġ 0 ). to I ()] Ġ} ĊĠĠĠ Ġfunc [" size "] Ġ= Ġ{ Ġwhen Ġ( it ) Ġ{ Ġis ĠCollection < *> Ġ-> Ġit . size ; Ġis ĠCharSequence Ġ-> Ġit . length ; Ġis ĠArray < *> Ġ-> Ġit . size ; Ġelse Ġ-> Ġerror (" size Ġof Ġ$ it Ġunknown ") Ġ} Ġ} ĊĠĠĠ Ġfunc [" transform "] Ġ= Ġ{ ĊĠĠĠĠĠ Ġval Ġs Ġ= Ġit . to S () ĊĠĠĠĠĠ Ġwhen Ġ( val Ġmode Ġ= Ġresolve (" mode ") Ġas ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" lower " Ġ-> Ġs . toLowerCase () ĊĠĠĠĠĠĠĠ Ġ" upper " Ġ-> Ġs . toUpperCase () ĊĠĠĠĠĠĠĠ Ġ" capitalize " Ġ-> Ġs . capitalize () ĊĠĠĠĠĠĠĠ Ġ" de capitalize " Ġ-> Ġs . de capitalize () ĊĠĠĠĠĠĠĠ Ġ" reverse " Ġ-> Ġs . reversed () ĊĠĠĠĠĠĠĠ Ġ" trim " Ġ-> Ġs . trim () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" unknown Ġmode Ġ$ mode ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġprivate Ġfun ĠObj . to S () Ġ= Ġthis ?. toString () Ġ?: Ġ" ?" ĊĠ Ġprivate Ġfun ĠObj . to I () Ġ= Ġthis . to S (). toInt () ĊĠ Ġprivate Ġfun ĠScope . v Regex () Ġ= Ġ( this [" regex "] Ġas ? ĠString )?. let (:: Regex ) ĊĠ Ġprivate Ġfun ĠScope . v Separator () Ġ= Ġthis [" separator "] Ġas ? ĠString Ġ?: Ġ", Ġ" ĊĠ Ġprivate Ġfun ĠScope . v Sub str () Ġ= Ġget Typed Req < String >(" substr ", Ġ" sub - string ") ĊĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT : Any > ĠScope . get Typed Req ( name : ĠString , Ġdesc : ĠString ) Ġ= Ġget Typed < T >( name , Ġ"$ name : Ġ$ desc Ġis Ġrequired ") ĊĠ Ġprivate Ġfun Ġcontrol Throw ( mode : ĠInt ): ĠProcessor Ġ= Ġ{ Ġthrow ĠTemp lator Ast . Control Exception ( mode , Ġit ) Ġ} Ċ } Ċ Ċ //// Ġ== Ġnon - stre amed ĠParser Ġused Ġin Ġeval Ġ== Ċ abstract Ġclass ĠSub seq Parser ( protected Ġvar Ġtext : ĠCharSequence ) Ġ{ ĊĠ Ġprotected Ġfun Ġdrop ( n : ĠInt ) Ġ{ Ġtext Ġ= Ġtext . run Ġ{ Ġsub Sequence ( n , Ġlength ) Ġ} Ġ} ĊĠ Ġprotected Ġfun Ġdrop To ( sb : ĠAppend able , Ġn : ĠInt ) Ġ{ Ġsb . append ( text . sub Sequence ( 0 , Ġn )); Ġdrop ( n ) Ġ} ĊĠ Ġprotected Ġinline Ġin fix Ġfun ĠInt . minus 1 ( op : Ġ() Ġ-> ĠInt ) Ġ= Ġif Ġ( this Ġ== Ġ- 1 ) Ġop () Ġelse Ġthis Ċ } Ċ class ĠP eek < T >( private Ġval Ġnext : Ġ() Ġ-> ĠT ) Ġ{ ĊĠ Ġobject ĠEnd : ĠException (" no Ġmore ") ĊĠ Ġprivate Ġvar Ġlast Item : ĠT Ġ= Ġnext () ĊĠ Ġprivate Ġvar Ġtail Cons umed Ġ= Ġfalse ĊĠ Ġval Ġpeek Ġget () Ġ= Ġlast Item ĊĠ Ġfun Ġconsume (): ĠT Ġ{ ĊĠĠĠ Ġval Ġtoken Ġ= Ġpeek ĊĠĠĠ Ġtry Ġ{ Ġlast Item Ġ= Ġnext () Ġ} ĊĠĠĠ Ġcatch Ġ(_ : ĠEnd ) Ġ{ Ġif Ġ(! tail Cons umed ) Ġtail Cons umed Ġ= Ġtrue Ġelse Ġthrow ĠEnd Ġ} ĊĠĠĠ Ġreturn Ġtoken ĊĠ Ġ} ĊĠ Ġval Ġis End Ġget () Ġ= Ġtail Cons umed Ċ } Ċ Ċ type alias ĠToken Ġ= ĠPair < Temp lator Lexer . Token Kind , ĠString > Ċ open Ġclass ĠTemp lator Lexer ( text : ĠCharSequence , Ġmode : ĠTemp lator . Lang Mode ): ĠSub seq Parser ( text ) Ġ{ ĊĠ Ġenum Ġclass ĠToken Kind Ġ{ ĠPlain , ĠS quared , ĠBr aced Ġ} ĊĠ Ġprivate Ġval Ġsb Ġ= ĠStringBuilder () ĊĠ Ġprivate Ġfun Ġsb Token ( kind : ĠToken Kind ): ĠToken Ġ{ Ġval Ġs = sb . toString (); Ġsb . clear (); Ġreturn Ġ( kind Ġto Ġs ) Ġ} ĊĠ Ġprivate Ġfun Ġread Token (): ĠToken Ġ{ Ġ// Ġ- { cmd } Ġ- [ ref ] Ġtext ĊĠĠĠ Ġwhile Ġ( text . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġidx Minus Ġ= Ġtext . indexOf ('- ') Ġminus 1 Ġ{ Ġdrop To ( sb , Ġtext . length ); Ġ- 1 Ġ} ĊĠĠĠĠĠ Ġif Ġ( idx Minus Ġ== Ġtext . last Index ) Ġbreak /* = do - while */ ĊĠĠĠĠĠ Ġbr ace Kind [ text [ idx Minus + 1 ]] ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġdrop To ( sb , Ġidx Minus ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sb . isNotEmpty ()) Ġreturn Ġsb Token ( Token Kind . Plain ) ĊĠĠĠĠĠĠĠ Ġdrop ( 2 /* -[ */) ĊĠĠĠĠĠĠĠ Ġval Ġclosing Ġ= Ġwhen Ġ( it ) Ġ{ ĠToken Kind . Squared Ġ-> Ġ'] '; ĠToken Kind . Br aced Ġ-> Ġ'}'; Ġelse Ġ-> Ġimpossible () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġidx Close Ġ= Ġtext . indexOf ( closing ) Ġminus 1 Ġ{ Ġthrow ĠTemp lator . ParseError ("$ it : Ġwhere Ġis Ġ$ closing Ġexpected Ġto Ġclose ?\ n near :\ n $ text ") Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinner Sb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġdrop To ( inner Sb , Ġidx Close ); Ġdrop ( 1 /* ] */) ĊĠĠĠĠĠĠĠ Ġreturn Ġit Ġto Ġinner Sb . toString () ĊĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ Ġdrop To ( sb , Ġidx Minus + 1 /* - */) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( sb . isEmpty ()) Ġthrow ĠP eek . End ĊĠĠĠ Ġreturn Ġsb Token ( Token Kind . Plain ) ĊĠ Ġ} ĊĠ Ġprivate Ġfun Ġread Token 1 (): ĠToken Ġ{ Ġ// Ġ( cmd ) Ġref ĊĠĠĠ Ġwhile Ġ( text . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġidx Par Ġ= Ġtext . indexOf (' (' ) Ġminus 1 Ġ{ Ġdrop To ( sb , Ġtext . length ); Ġ- 1 Ġ} ĊĠĠĠĠĠ Ġif Ġ( idx Par Ġ== Ġtext . last Index ) Ġbreak /* = do - while */ ĊĠĠĠĠĠ Ġdrop To ( sb , Ġidx Par ) ĊĠĠĠĠĠ Ġif Ġ( sb . isNotEmpty ()) Ġreturn Ġsb Token ( Token Kind . Squared ) ĊĠĠĠĠĠ Ġdrop ( 1 /* ( */) ĊĠĠĠĠĠ Ġval Ġidx Close Ġ= Ġtext . indexOf (' )') Ġminus 1 Ġ{ Ġthrow ĠTemp lator . ParseError (" where Ġis Ġ) Ġexpected Ġto Ġclose ?\ n near :\ n $ text ") Ġ} ĊĠĠĠĠĠ Ġval Ġinner Sb Ġ= ĠStringBuilder () ĊĠĠĠĠĠ Ġdrop To ( inner Sb , Ġidx Close ); Ġdrop ( 1 /* ) */) ĊĠĠĠĠĠ Ġreturn ĠToken Kind . Br aced Ġto Ġinner Sb . toString () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( sb . isEmpty ()) Ġthrow ĠP eek . End ĊĠĠĠ Ġreturn Ġsb Token ( Token Kind . Squared ) ĊĠ Ġ} ĊĠ Ġval Ġtoken Ġ= ĠP eek ( when ( mode ) Ġ{ ĠTemp lator . Lang Mode . Normal Ġ-> Ġ:: read Token ; ĠTemp lator . Lang Mode . Pure Ġ-> Ġ:: read Token 1 Ġ}) ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbr ace Kind Ġ= Ġmap Of (' [' Ġto ĠToken Kind . Squared , Ġ'{ ' Ġto ĠToken Kind . Br aced ) ĊĠ Ġ} ĊĠ Ġprotected Ġfun Ġexpect ( kind : ĠToken Kind , Ġname : ĠString , Ġpredicate : Ġ( String ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġfun Ġmismatch (): ĠNothing Ġ= Ġerror (" expect ing Ġ$ kind Ġ$ name ") ĊĠĠĠ Ġval Ġ( tok , Ġtext ) Ġ= Ġtoken . peek ĊĠĠĠ Ġif Ġ( tok Ġ!= Ġkind Ġ|| Ġ! predicate ( text )) Ġmismatch () ĊĠ Ġ} ĊĠ Ġprotected Ġfun Ġerror ( message : ĠString ): ĠNothing Ġ= Ġthrow ĠTemp lator . ParseError ( if Ġ( token . is End ) Ġ"$ message \ nat ĠEOF " Ġelse Ġ"$ message \ n near Ġ${ token . peek } :\ n $ text ") Ċ } Ċ Ċ /** Ċ Ġ* Ġ``` plain Ċ Ġ* ĠTop Ġ= ĠItem * Ċ Ġ* ĠBlock Ġ= ĠItem * Ġend Ċ Ġ* ĠItem Ġ= Ġplain Ġ| ĠVal Ref Ġ| ĠBuild String Ġ| ĠFor Ġ| ĠIf Ġ| ĠLet Ġ| ĠDef Ċ Ġ* ĠVal Ref Ġ= Ġ(' =' ? ĠName )* ĠName Ċ Ġ* ĠBuild String Ġ= Ġbuild String ĠName ĠBlock Ċ Ġ* ĠFor Ġ= Ġfor ĠName Ġ( in Ġ| Ġdo ) ĠName ĠBlock Ċ Ġ* ĠIf Ġ= Ġif Ġ(' !') ? ĠName Ġ( Block Ġ| ĠItem * Ġelse ĠBlock ) Ċ Ġ* ĠTable Ġ= Ġ( Name ' =' Ġ'$ ' ? ~ white )* Ċ Ġ* ĠLet Ġ= Ġ( let ĠTable Ġin ĠBlock ) Ġ| Ġ( let ĠTable Ġdo ĠName *) Ċ Ġ* ĠDef Ġ= Ġdef ĠName ĠTable ĠBlock Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠRecursive Ġdesc ent Ġparser . Ċ Ġ*/ Ċ class ĠTemp lator Parser ( text : ĠCharSequence , Ġmode : ĠTemp lator . Lang Mode ): ĠTemp lator Lexer ( text , Ġmode ) Ġ{ ĊĠ Ġprivate Ġinline Ġfun Ġ< T > Ġas List ( read : Ġ() Ġ-> ĠT ): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġcollected Ġ= Ġmutable ListOf < T >() ĊĠĠĠ Ġtry Ġ{ Ġwhile Ġ( true ) Ġcollected . add ( read ()) Ġ} Ġcatch Ġ(_ : ĠP eek . End ) Ġ{} ĊĠĠĠ Ġreturn Ġcollected ĊĠ Ġ} ĊĠ Ġfun Ġread Top () Ġ= Ġas List (:: read Item ) ĊĠ Ġprivate Ġfun Ġread Block (): ĠTemp lator Ast . Block Ġ{ ĊĠĠĠ Ġval Ġitems Ġ= Ġas List Ġ{ Ġif Ġ( token . peek . run Ġ{ Ġfirst Ġ== ĠToken Kind . Br aced Ġ&& Ġis End ( second ) Ġ}) Ġthrow ĠP eek . End ; Ġread Item () Ġ} ĊĠĠĠ Ġread Block End () ĊĠĠĠ Ġreturn ĠTemp lator Ast . Block ( items ) ĊĠ Ġ} ĊĠ Ġprivate Ġfun Ġis End ( s : ĠString ) Ġ= Ġs . trim () Ġ== Ġ" end " ĊĠ Ġprivate Ġfun Ġread Block End () Ġ{ ĊĠĠĠ Ġexpect ( Token Kind . Br aced , Ġ" end Ġof Ġcode Ġblock ", Ġ:: is End ) /* not ĠEOF */ ĊĠĠĠ Ġtry Ġ{ Ġtoken . consume () Ġ} Ġcatch Ġ(_ : ĠP eek . End ) Ġ{ Ġerror (" expect Ġmore Ġend ") Ġ} ĊĠ Ġ} ĊĠ Ġfun Ġread Item (): ĠTemp lator Ast Ġ{ ĊĠĠĠ Ġval Ġ( tok , Ġtext ) Ġ= Ġtoken . peek ; Ġtoken . consume () ĊĠĠĠ Ġreturn Ġtry Ġ{ Ġwhen Ġ( tok ) Ġ{ ĊĠĠĠĠĠ ĠToken Kind . Plain Ġ-> ĠTemp lator Ast . Plain ( text ) ĊĠĠĠĠĠ ĠToken Kind . Squared Ġ-> Ġ( text . split Ws () Ġ?: Ġerror (" empty Ġref ")). c Val Pipe Ġ{ ĠTemp lator Ast . Val Ref ( it ) Ġ} ĊĠĠĠĠĠ ĠToken Kind . Br aced Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġtext . split Ws () Ġ?: Ġerror (" empty Ġcommand Ġbr ace ") ĊĠĠĠĠĠĠĠ Ġfun Ġt ( i : ĠInt , Ġname : ĠString ) Ġ= Ġtry Ġ{ Ġparts [ i ] Ġ} Ġcatch Ġ(_ : ĠIndex OutOfBoundsException ) Ġ{ Ġerror ("$ name Ġas Ġparam Ġ$ i Ġrequired Ġin Ġ${ parts [ 0 ]} ") Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġtable ( ri : Int Range ): ĠTemp lator Ast . Table Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġri ) Ġ{ Ġval Ġkv = parts [ i ]; Ġval Ġq i = kv . indexOf (' =') Ġminus 1 Ġ{ Ġerror (" expect Ġ= Ġin Ġarg Ġ`$ kv '") Ġ}; Ġm [ kv . substring ( 0 , Ġq i )] Ġ= Ġkv . substring ( qi + 1 , kv . length ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠTemp lator Ast . Table ( m ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġis Else ( s : ĠString ) Ġ= Ġs . trim () Ġ== Ġ" else " ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġcommand Ġ= Ġparts [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" build String " Ġ-> ĠTemp lator Ast . Build String ( t ( 1 , Ġ" name "), Ġread Block ()) ĊĠĠĠĠĠĠĠĠĠ Ġ" for " Ġ-> Ġ{ Ġwhen Ġ( val Ġmode Ġ= Ġt ( 2 , Ġ" mode ")) Ġ{ Ġ" in " Ġ-> ĠTemp lator Ast . For In ( t ( 1 ," name "), Ġt ( 3 ," varName "), Ġread Block ()); Ġ" do " Ġ-> ĠTemp lator Ast . For Do ( t ( 3 ," op Name "), Ġt ( 1 ," varName "), Ġread Block ()); Ġelse Ġ-> Ġerror (" unknown Ġfor - mode Ġ$ mode ") Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ" if " Ġ-> Ġ{ Ġif Ġ( parts . size Ġ== Ġ 2 ) Ġt ( 1 , Ġ" varName "). let Ġ{ Ġval Ġinverted Ġ= Ġ( it [ 0 ] Ġ== Ġ' !'); Ġval Ġvar Name Ġ= Ġit . remove Prefix (" !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġas List Ġ{ Ġif Ġ( token . peek . run Ġ{ Ġfirst Ġ== ĠToken Kind . Br aced Ġ&& Ġ( is Else ( second ) Ġ|| Ġis End ( second )) Ġ}) Ġthrow ĠP eek . End ; Ġread Item () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= ĠTemp lator Ast . Block ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Else ( token . peek . second )) Ġ{ Ġtoken . consume (); ĠTemp lator Ast . If ( inverted , Ġvar Name , Ġblock , Ġread Block ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ Ġread Block End (); ĠTemp lator Ast . If ( inverted , Ġvar Name , Ġblock , ĠTemp lator Ast . nop ) Ġ} Ġ} Ġelse Ġerror (" use Ġif Ġlike Ġ{ if Ġname } Ġor Ġ{ if Ġ! name }") Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ" let " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdi Ġ= Ġparts . indexOf (" do ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( di Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemp lator Ast . Let In ( table ( 1 Ġuntil Ġdi ), ĠTemp lator Ast . Block ( listOf ( parts . sub List ( di + 1 , Ġparts . size ). c Val Pipe Ġ{ ĠTemp lator Ast . Val Pipe ( listOf ( it ), Ġ" done ") Ġ} ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġif Ġ( parts . size Ġ< Ġ 3 Ġ|| Ġparts [ parts . size - 1 ] Ġ!= Ġ" in ") Ġerror (" use Ġlet Ġlike Ġ{ let Ġa = 1 Ġb = 2 Ġin }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTemp lator Ast . Let In ( table ( 1 Ġuntil Ġparts . size - 1 ), Ġread Block ()) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ" def " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts . size Ġ< Ġ 2 ) Ġerror (" use Ġdef Ġname Ġa = 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTemp lator Ast . Def ( t ( 1 , Ġ" name "), Ġtable ( 2 Ġuntil Ġparts . size ), Ġread Block ()) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" unknown Ġcommand Ġ$ command ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ} Ġcatch Ġ( e : ĠTemp lator . ParseError ) Ġ{ Ġthrow ĠTemp lator . ParseError (" `$ text ': Ġ"+ e . message , Ġe . cause ) Ġ} ĊĠ Ġ} ĊĠ Ġprivate Ġinline Ġfun ĠList < String >. c Val Pipe ( single : Ġ( String ) Ġ-> ĠTemp lator Ast ): ĠTemp lator Ast Ġ{ Ġval Ġr Idx = size - 1 ; Ġreturn Ġif Ġ( r Idx == 0 ) Ġsingle ( this [ 0 ]) Ġelse ĠTemp lator Ast . Val Pipe ( sub List ( 0 , Ġr Idx ), Ġthis [ r Idx ]) Ġ} ĊĠ Ġprivate Ġfun ĠCharSequence . split Ws () Ġ= Ġsplit (' Ġ', Ġ'\ t ', Ġ'\ n ', Ġ'\ r '). filter ( String :: isNotEmpty ). take Unless Ġ{ Ġit . isEmpty () Ġ} Ċ } Ċ