public override void Do(RamMachineCommand command, IRamMachine ram) { RamMachineHelper.DoWithDeepLv(command.Argument, (ramEl, val) => { ramEl.Set(0, func(ramEl.Get(0), val)); }, ram); }
public override void Do(RamMachineCommand command, IRamMachine ram) { if (func(ram.Get(0))) { ram.Jump(command.Argument); } }
public override void Do(RamMachineCommand command, IRamMachine ram) { var splited = RamMachineHelper.SplitToPreArgument(command.Argument); int val = int.Parse(splited.argument); switch (splited.pre) { case null: ram.Set(val, ram.Get(0)); break; case '*': ram.Set((int)ram.Get((int)val), ram.Get(0)); break; } }
public static void Invoke(RamMachineCommand command, IRamMachine ram) { if (ram is null) { throw new ArgumentNullException(nameof(ram)); } try { if (command.Type.EndsWith(":")) { labelCommand.Do(command, ram); } else { commands[command.Type].Do(command, ram); } } catch (Exception exception) when(!(exception is RamMachineRuntimeException)) { throw new RamMachineRuntimeException(command.Line, $"Unexpected exception had occured during runtime ({command})", exception); } }
public void Invoke(IRamMachine ram) { RamMachineController.Invoke(this, ram); }
public abstract void Do(RamMachineCommand command, IRamMachine ram);
public override void Do(RamMachineCommand command, IRamMachine ram) { RamMachineHelper.DoWithDeepLv(command.Argument, (ramEl, val) => ramEl.Write(val), ram); }
public override void Do(RamMachineCommand command, IRamMachine ram) { ram.PushLabel(command.Type.Substring(0, command.Type.Length - 1)); }
public override void Do(RamMachineCommand command, IRamMachine ram) { ram.Jump(command.Argument); }
public override void Do(RamMachineCommand command, IRamMachine ram) { ram.Halt(); }
public static void DoWithDeepLv(string argument, Action <IRamMachine, long> action, IRamMachine ram) { var splited = SplitToPreArgument(argument); int value = int.Parse(splited.argument); switch (splited.pre) { case '=': action(ram, value); break; case null: action(ram, ram.Get(value)); break; case '^': case '*': action(ram, ram.Get((int)ram.Get((int)value))); break; } }