package Ġgu u Ċ Ċ import Ġgu u . instructions . Call Sub Ċ import Ġgu u . instructions . Instruction Ċ import Ġgu u . instructions . Print Var Ċ import Ġgu u . instructions . Set Var Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util . Deque Ċ Ċ fun Ġcheck Args ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġsize Ġ= Ġargs . size ĊĊĠĠĠ Ġcheck ( size Ġin Ġ 1 .. 2 ) Ġ{ Ġ" Wrong Ġnumber Ġof Ġcommand Ġline Ġarguments " Ġ} ĊĊĠĠĠ Ġif Ġ( size Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġcheck ( args [ 1 ] Ġ== Ġ"- d ") Ġ{ Ġ" Second Ġcommand Ġline Ġargument Ġshould Ġbe Ġ\" - d \"" Ġ} Ċ } Ċ Ċ fun Ġparse File ( ĊĠĠĠ ĠfileName : ĠString , ĊĠĠĠ Ġcontext : ĠExecutionContext Ċ ) Ġ{ ĊĠĠĠ Ġval Ġlines Ġ= ĠFiles . read All Lines ( Path . of ( fileName )) ĊĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . isBlank () Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . trim Start () Ġ} ĊĊĠĠĠ Ġvar Ġcurrent Sub : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġfor Ġ( line Ġin Ġlines ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( line . startsWith (" sub ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Name Ġ= Ġline . split (" Ġ" )[ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Sub Ġ= Ġsub Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . subs [ sub Name ] Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . subs [ current Sub ] !!. add ( parse Instruction ( line , Ġcontext )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġexecute One By One ( ĊĠĠĠ Ġinstructions : ĠList < Instruction >, ĊĠĠĠ Ġcontext : ĠExecutionContext Ċ ) Ġ{ ĊĠĠĠ Ġfor Ġ( instruction Ġin Ġinstructions ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcmd : ĠString ĊĠĠĠĠĠĠĠ Ġloop @ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("( next Ġline ): Ġ$ instruction ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint ("( enter Ġcommand ): Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ= Ġread Line () !!. trim () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cmd Ġ! in Ġcommands ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Wrong Ġcommand ! ĠSupported Ġcommands Ġare Ġ$ commands .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġwhen Ġ( cmd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" o " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction . exec () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" i " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction . exec Into () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" var " Ġ-> Ġprint Vars ( context . vars ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" trace " Ġ-> Ġprint StackTrace ( context . stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġcommands Ġ= Ġset Of (" i ", Ġ" o ", Ġ" trace ", Ġ" var ") Ċ Ċ private Ġfun Ġprint Vars ( vars : ĠMap < String , ĠInt >) Ġ{ ĊĠĠĠ Ġprintln ( vars ) Ċ } Ċ Ċ private Ġfun Ġprint StackTrace ( stack : ĠDe que < Stack Frame >) Ġ{ ĊĠĠĠ Ġstack ĊĠĠĠĠĠĠĠ Ġ. reversed () ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . instruction Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġprintln ("\ t $ it ") Ġ} Ċ } Ċ Ċ private Ġfun Ġparse Instruction ( ĊĠĠĠ Ġline : ĠString , ĊĠĠĠ Ġcontext : ĠExecutionContext Ċ ): ĠInstruction Ġ{ ĊĠĠĠ Ġval Ġop Ġ= Ġline . split (" Ġ") ĊĊĠĠĠ Ġcheck ( op . size Ġin Ġ 2 .. 3 ) Ġ{ Ġ" Wrong Ġnumber Ġof Ġoperands Ġin : Ġ$ line " Ġ} ĊĊĠĠĠ Ġreturn Ġwhen Ġ( op [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" set " Ġ-> ĠSet Var ( op [ 1 ], Ġop [ 2 ]. toInt (), Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ" print " Ġ-> ĠPrint Var ( op [ 1 ], Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ" call " Ġ-> ĠCall Sub ( op [ 1 ], Ġcontext ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Wrong Ġinstruction : Ġ${ op [ 0 ]} ") ĊĠĠĠ Ġ} Ċ } Ċ