/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠDavid ĠEd wards Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . loop for . r pn Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġbytecode Ġinstruction Ġgenerated Ġfrom Ġa Ġsyntax Ġtree . Ċ Ġ* ĠĊ Ġ* ĠRe cognized Ġinstructions : Ċ Ġ* Ġ``` Ċ Ġ* Ġsym Ġ< symbol > Ċ Ġ* Ġpush sym Ġ< symbol > Ċ Ġ* Ġpush Ġ< number > Ċ Ġ* Ġadd Ġ< args > Ċ Ġ* Ġsub Ġ< args > Ċ Ġ* Ġmul Ġ< args > Ċ Ġ* Ġdiv Ġ< args > Ċ Ġ* Ġmin Ġ< args > Ċ Ġ* Ġmax Ġ< args > Ċ Ġ* Ġmod Ċ Ġ* Ġpow Ċ Ġ* Ġnop Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ sealed Ġclass ĠCode ( val Ġop : ĠString ) Ġ{ ĊĠĠĠ Ġabstract Ġval Ġrepr : ĠString Ċ } Ċ Ċ abstract Ġclass ĠBasic Code ( op : ĠString ) Ġ: ĠCode ( op ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrepr Ġ= Ġop Ċ } Ċ Ċ abstract Ġclass ĠOperator Code ( op : ĠString , Ġval Ġargs : ĠInt ) Ġ: ĠCode ( op ) Ġ{ ĊĠĠĠ Ġabstract Ġval Ġis Associ ative : ĠBoolean ĊĠĠĠ Ġabstract Ġval Ġis Com mut ative : ĠBoolean Ċ } Ċ Ċ abstract Ġclass ĠFixed Operator Code ( op : ĠString , Ġargs : ĠInt ) Ġ: ĠOperator Code ( op , Ġargs ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrepr Ġ= Ġop Ċ } Ċ Ċ abstract Ġclass ĠDynamic Operator Code ( op : ĠString , Ġargs : ĠInt ) Ġ: ĠOperator Code ( op , Ġargs ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrepr Ġ= Ġ"$ op Ġ$ args " Ċ } Ċ Ċ /** Ċ Ġ* ĠDe cla res Ġa Ġsymbol Ġbefore Ġits Ġuse , Ġwhich Ġallows Ġthe Ġinterpreter Ġto Ġbind Ġa Ġvalue . Ċ Ġ*/ Ċ class ĠDeclare Symbol Code ( val Ġname : ĠString ) Ġ: ĠCode (" sym ") Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrepr Ġ= Ġ"$ op Ġ$ name " ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Declare Symbol Code ("$ name ") """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * sym \ s + ([ a - zA - Z ]+ )\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠDeclare Symbol Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( name ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDeclare Symbol Code ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ushes Ġthe Ġsymbol Ġ` name ` Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠPush Symbol Code ( val Ġname : ĠString ) Ġ: ĠCode (" push sym ") Ġ{ ĊĠĠĠ Ġoverride Ġval Ġrepr Ġ= Ġ"$ op Ġ$ name " ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Push Symbol Code ("$ name ") """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * push sym \ s + ([ a - zA - Z ]+ )\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠPush Symbol Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( name ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPush Symbol Code ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ushes Ġthe Ġnumber Ġ` value ` Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠPush Code ( val Ġvalue : ĠDouble ) Ġ: ĠCode (" push ") Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcanonical Ġ= ĊĠĠĠĠĠĠĠ ĠString . format ("% . 1 0 f ", Ġvalue ). reversed (). drop While Ġ{ Ġit Ġ== Ġ' 0 ' Ġ}. drop While Ġ{ Ġit Ġ== Ġ'.' Ġ}. reversed () ĊĊĠĠĠ Ġoverride Ġval Ġrepr Ġ= Ġ"$ op Ġ$ canonical " ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Push Code ($ value ) """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * push \ s + (- ?\ d + |- ?\ d +\ .\ d +)\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠPush Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( value ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPush Code ( value . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ops Ġ` args ` Ġoperands Ġfrom Ġthe Ġevaluation Ġstack , Ġcomputes Ġthe Ġsum , Ġand Ġp ushes Ġthe Ċ Ġ* Ġresult Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠAdd Code ( args : ĠInt ) Ġ: ĠDynamic Operator Code (" add ", Ġargs ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Associ ative Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġis Com mut ative Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Add Code ($ args ) """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * add \ s + (\ d +)\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠAdd Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( args ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( args , Ġ 2 ) Ġ{ ĠAdd Code ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ops Ġ` args ` Ġoperands Ġfrom Ġthe Ġevaluation Ġstack , Ġcomputes Ġthe Ġdifference , Ġand Ġp ushes Ċ Ġ* Ġthe Ġresult Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠSubtract Code ( args : ĠInt ) Ġ: ĠDynamic Operator Code (" sub ", Ġargs ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Associ ative Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġis Com mut ative Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Subtract Code ($ args ) """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * sub \ s + (\ d +)\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠSubtract Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( args ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( args , Ġ 2 ) Ġ{ ĠSubtract Code ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ops Ġ` args ` Ġoperands Ġfrom Ġthe Ġevaluation Ġstack , Ġcomputes Ġthe Ġproduct , Ġand Ġp ushes Ċ Ġ* Ġthe Ġresult Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠMultiply Code ( args : ĠInt ) Ġ: ĠDynamic Operator Code (" mul ", Ġargs ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Associ ative Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġis Com mut ative Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Multiply Code ($ args ) """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * mul \ s + (\ d +)\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠMultiply Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( args ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( args , Ġ 2 ) Ġ{ ĠMultiply Code ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ops Ġ` args ` Ġoperands Ġfrom Ġthe Ġevaluation Ġstack , Ġcomputes Ġthe Ġquot ient , Ġand Ġp ushes Ċ Ġ* Ġthe Ġresult Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠDiv ide Code ( args : ĠInt ) Ġ: ĠDynamic Operator Code (" div ", Ġargs ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Associ ative Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġis Com mut ative Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Divide Code ($ args ) """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * div \ s + (\ d +)\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠDiv ide Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( args ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( args , Ġ 2 ) Ġ{ ĠDiv ide Code ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ops Ġ` args ` Ġoperands Ġfrom Ġthe Ġevaluation Ġstack , Ġcomputes Ġthe Ġminimum , Ġand Ġp ushes Ċ Ġ* Ġthe Ġresult Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠMin Code ( args : ĠInt ) Ġ: ĠDynamic Operator Code (" min ", Ġargs ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Associ ative Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġis Com mut ative Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Min Code ($ args ) """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * min \ s + (\ d +)\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠMin Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( args ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( args , Ġ 2 ) Ġ{ ĠMin Code ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ops Ġ` args ` Ġoperands Ġfrom Ġthe Ġevaluation Ġstack , Ġcomputes Ġthe Ġmaximum , Ġand Ġp ushes Ċ Ġ* Ġthe Ġresult Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠMax Code ( args : ĠInt ) Ġ: ĠDynamic Operator Code (" max ", Ġargs ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Associ ative Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġis Com mut ative Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" Max Code ($ args ) """ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * max \ s + (\ d +)\ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠMax Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( args ) Ġ= Ġit . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( args , Ġ 2 ) Ġ{ ĠMax Code ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ops Ġtwo Ġoperands Ġfrom Ġthe Ġevaluation Ġstack , Ġcomputes Ġthe Ġremainder , Ġand Ġp ushes Ċ Ġ* Ġthe Ġresult Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠMod ulo Code Ġ: ĠFixed Operator Code (" mod ", Ġ 2 ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Associ ative Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġis Com mut ative Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Modulo Code ()" ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * mod \ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠMod ulo Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĠMod ulo Code () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠP ops Ġtwo Ġoperands Ġfrom Ġthe Ġevaluation Ġstack , Ġcomputes Ġthe Ġexponent iation , Ġand Ġp ushes Ċ Ġ* Ġthe Ġresult Ġonto Ġthe Ġevaluation Ġstack . Ċ Ġ*/ Ċ class ĠPower Code Ġ: ĠFixed Operator Code (" pow ", Ġ 2 ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Associ ative Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġis Com mut ative Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Power Code ()" ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * pow \ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠPower Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĠPower Code () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġinstruction Ġthat Ġhas Ġno Ġeffect . Ċ Ġ*/ Ċ class ĠN op Code Ġ: ĠBasic Code (" nop ") Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" N op Code ()" ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpattern Ġ= Ġ""" \ s * nop \ s * """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġfun Ġmatch ( repr : ĠString ): ĠN op Code ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . match Ent ire ( repr )?. let Ġ{ ĠN op Code () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠList < Code >. format (): ĠString Ġ{ ĊĠĠĠ Ġval Ġ(_, Ġ_, Ġout s ) Ġ= Ġthis . fold ( Triple ( 0 , Ġ 0 , Ġ"")) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( pos , Ġframe , Ġout s ), Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġwhen Ġ( c ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPush Symbol Code Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPush Code Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOperator Code Ġ-> Ġ 1 Ġ- Ġc . args ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( pos Ġ+ Ġ 1 , Ġframe Ġ+ Ġf , Ġout s Ġ+ Ġ"$ pos Ġ[$ frame ] Ġ${ c . repr }\ n ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġout s Ċ } Ċ Ċ private Ġfun Ġ< T Ġ: ĠCode > Ġverify ( args : ĠString , Ġlower : ĠInt , Ġfn : Ġ( Int ) Ġ-> ĠT ): ĠT ? Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġargs . toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( n Ġ< Ġlower ) Ġnull Ġelse Ġfn ( n ) ĊĠĠĠ Ġ} Ġcatch Ġ(_ : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠCode s Ġ{ ĊĠĠĠ Ġfun Ġsymbols ( codes : ĠSequence < Code >): ĠSequence < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcodes . flatMap Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġis ĠDeclare Symbol Code ) Ġsequence Of ( c . name ) Ġelse Ġempty Sequence () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse ( repr : ĠString ): ĠCode ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDeclare Symbol Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠPush Symbol Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠPush Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠAdd Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠSubtract Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠMultiply Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠDiv ide Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠMin Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠMax Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠMod ulo Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠPower Code . match ( repr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠN op Code . match ( repr ) ĊĠĠĠ Ġ} Ċ } Ċ