package Ġp if uck . interpreter Ċ Ċ import Ġp if uck . interpreter . Variable Value . Var Bool Ċ import Ġp if uck . interpreter . Variable Value . Var Dec Ċ import Ġp if uck . interpreter . Variable Value . Var Null Ċ import Ġp if uck . interpreter . Variable Value . Var Str Ċ import Ġp if uck . parser . Expression Ċ import Ġp if uck . parser . Expression . Add Ċ import Ġp if uck . parser . Expression . Divide Ċ import Ġp if uck . parser . Expression . Equal Ċ import Ġp if uck . parser . Expression . Greater Ċ import Ġp if uck . parser . Expression . Multiply Ċ import Ġp if uck . parser . Expression . NotEqual Ċ import Ġp if uck . parser . Expression . Small er Ċ import Ġp if uck . parser . Expression . Subtract Ċ import Ġp if uck . parser . Expression . Value Ċ import Ġp if uck . parser . Program Ċ import Ġp if uck . parser . Statement Ċ import Ġp if uck . parser . Statement . Call Ċ import Ġp if uck . parser . Statement . For Ċ import Ġp if uck . parser . Statement . ForEach Ċ import Ġp if uck . parser . Statement . Function Ċ import Ġp if uck . parser . Statement . If Statement Ċ import Ġp if uck . parser . Statement . Include Ċ import Ġp if uck . parser . Statement . Print Ċ import Ġp if uck . parser . Statement . Variable Declaration Ċ import Ġp if uck . parser . User Value Ċ import Ġp if uck . readFile And Parse Ċ import Ġjava . math . BigDecimal Ċ Ċ class ĠInterpreter Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfunctions : ĠMutable Map < String , ĠList < Statement >> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġval Ġvariables : ĠMutable Map < String , ĠVariable Value > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġfun Ġget Variable Or Nothing ( name : ĠString ): ĠVariable Value Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvariables [ name ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠError (" Variable Ġ$ name Ġis Ġused Ġbefore Ġdeclaration .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinterpret Program ( program : ĠProgram ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprogram . lines . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInclude ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġparse And Execute Include ( it . value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPrint ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġprint Value ( it . expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Declaration Ġ-> Ġdeclare Variable ( it . name . value , Ġit . initializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFor Each ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġrun ForEach ( it . till , Ġit . temp Var , Ġit . block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFor ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġrun For Loop ( it . condition , Ġit . after Loop , Ġit . block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIf Statement ĠĠĠĠĠĠĠĠ Ġ-> Ġrun If Statement ( it . condition , Ġit . block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFunction ĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġdeclare Function ( it . name . value , Ġit . block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCall ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġcall Function ( it . name . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Block ( list : ĠList < Statement >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . interpret Program ( Program ( list )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse And Execute Include ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Block ( readFile And Parse ( path ). lines ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Value ( value : ĠExpression ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( evaluate Expression ( value ). to Custom String ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdeclare Variable ( name : ĠString , Ġvalue : ĠExpression ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . variables [ name ] Ġ= ĠVar Null () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . variables [ name ] Ġ= Ġevaluate Expression ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun ForEach ( till : ĠUser Value . Str , Ġtemp Var Name : ĠUser Value . Str , Ġblock : ĠList < Statement >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtill Value Ġ= Ġget Variable Or Nothing ( till . value ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( till Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVar Dec Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal T ill Value Ġ= Ġtill Value . value . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintermediate Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġintermediate .. real T ill Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . variables [ temp Var Name . value ] Ġ= ĠVar Dec ( BigDecimal ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Block ( block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . variables . remove ( temp Var Name . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVar Str Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Value Ġ= Ġtill Value . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġstr Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . variables [ temp Var Name . value ] Ġ= ĠVar Str ( Character . toString ( c )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Block ( block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . variables . remove ( temp Var Name . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠ Ġ-> Ġthrow ĠError (" For Ġeach Ġis Ġnot Ġsupported Ġon Ġ${ till Value . type }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand Ar ith matic Expression ( expr : ĠExpression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdd ĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expr . left Ġ! is ĠUser Value . Str ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Expect Ġleft Ġhand side Ġto Ġbe Ġa Ġvariable .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclare Variable ( expr . left . value , Ġexpr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSubtract Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expr . left Ġ! is ĠUser Value . Str ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Expect Ġleft Ġhand side Ġto Ġbe Ġa Ġvariable .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclare Variable ( expr . left . value , Ġexpr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMultiply Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expr . left Ġ! is ĠUser Value . Str ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Expect Ġleft Ġhand side Ġto Ġbe Ġa Ġvariable .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclare Variable ( expr . left . value , Ġexpr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDiv ide ĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expr . left Ġ! is ĠUser Value . Str ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Expect Ġleft Ġhand side Ġto Ġbe Ġa Ġvariable .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclare Variable ( expr . left . value , Ġexpr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Expecting Ġa Ġarithmetic Ġexpression .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun For Loop ( condition : ĠExpression , Ġafter Loop : ĠExpression , Ġblock : ĠList < Statement >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġintermediate Ġ= Ġevaluate Expression ( condition ) Ġas ? ĠVar Bool ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠError (" For Ġcondition Ġshould Ġreturn Ġa Ġboolean .") ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( intermediate . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Block ( block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Ar ith matic Expression ( after Loop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintermediate Ġ= Ġevaluate Expression ( condition ) Ġas ? ĠVar Bool Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" For Ġcondition Ġshould Ġreturn Ġa Ġboolean .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun If Statement ( condition : ĠExpression , Ġblock : ĠList < Statement >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġevaluate Expression ( condition ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠVar Bool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Block ( block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError ("${ result . type } Ġis Ġnot Ġavailable Ġin Ġif Ġcondition .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdeclare Function ( name : ĠString , Ġblock : ĠList < Statement >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfunctions [ name ] Ġ= Ġblock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Function ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġfunctions [ name ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠError (" Function Ġ$ name Ġshould Ġbe Ġdeclared Ġbefore Ġusage .") ĊĠĠĠĠĠĠĠ Ġrun Block ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġevaluate Expression ( expr : ĠExpression ): ĠVariable Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvariable Or Value : Ġ( value : ĠUser Value ) Ġ-> ĠVariable Value Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠUser Value . Str Ġ&& Ġvariables . containsKey ( it . value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables [ it . value ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVariable Value . from User Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValue ĠĠĠ Ġ-> Ġvariable Or Value ( expr . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdd ĠĠĠĠĠ Ġ-> Ġvariable Or Value ( expr . left ). add ( variable Or Value ( expr . right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSubtract Ġ-> Ġvariable Or Value ( expr . left ). subtract ( variable Or Value ( expr . right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMultiply Ġ-> Ġvariable Or Value ( expr . left ). multiply ( variable Or Value ( expr . right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDiv ide ĠĠ Ġ-> Ġvariable Or Value ( expr . left ). divide ( variable Or Value ( expr . right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEqual ĠĠĠ Ġ-> Ġvariable Or Value ( expr . left ). equal ( variable Or Value ( expr . right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNot Equal Ġ-> Ġvariable Or Value ( expr . left ). not Equal ( variable Or Value ( expr . right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠG reater Ġ Ġ-> Ġvariable Or Value ( expr . left ). greater ( variable Or Value ( expr . right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSmall er Ġ Ġ-> Ġvariable Or Value ( expr . left ). smaller ( variable Or Value ( expr . right )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ