public static string GetCommandResult(NumberCommand command, bool isBin = false) { var operation = command.GetOperator(); var operationNumber = operation.ToInt(); var resultObj = _commandList[operationNumber].Invoke(command); if (resultObj is NumberCommand isNumberCommandResult) { var numCommandResult = (NumberCommand)resultObj; return((isBin)? numCommandResult.ToBinStr() : numCommandResult.ToString()); } return(resultObj as string); }
public static BitArray CommandToBit(string command) { var resultCommand = new NumberCommand(); var separators = new[] { ' ' }; var splitedCommand = command.Split(separators, StringSplitOptions.RemoveEmptyEntries); if (splitedCommand.Length > 4) { throw new CompilerException(command, "Command has more than 4 parts"); } for (var i = 0; i < splitedCommand.Length - 1; i++) { var operand = splitedCommand[i]; try { var bitPart = OperandToBit(operand); var operandNumber = splitedCommand.Length - i - 1; resultCommand.SetOperand((uint)operandNumber, bitPart); } catch (CompilerException ce) { ce.WrongCommand += " in command :" + command; throw; } } var operatorInStr = splitedCommand.Last(); try { var bitOperator = OperatorToBit(operatorInStr); resultCommand.SetOperator(bitOperator); } catch (CompilerException ce) { ce.WrongCommand += " in command :" + command; throw; } return(resultCommand.GetBitArr()); }
public static string DecodeBinFile(string patch) { var binFile = File.Open(patch, FileMode.Open); var result = new StringBuilder(); using (var br = new BinaryReader(binFile)) { while (br.PeekChar() > -1) { var byteCommand = br.ReadInt32(); var command = new NumberCommand(BitArrayExtension.IntToBitArr(byteCommand)); result.Append(command + ";\n"); } } binFile.Dispose(); return(result.ToString()); }
public static KeyValuePair <string, string> RunCommand(BitArray bitCommand, bool isBinResult = false) { var result = new StringBuilder(); var errors = new StringBuilder(); try { var command = new NumberCommand(bitCommand); var commandCopy = new NumberCommand(bitCommand); var commandResult = GetCommandResult(command, isBinResult); var oldCommandStr = isBinResult ? commandCopy.ToBinStr() : commandCopy.ToString(); result.Append(oldCommandStr + " ---> " + commandResult + "\n"); } catch (Exception e) { errors.Append(e + "\n"); } return(new KeyValuePair <string, string>(result.ToString(), errors.ToString())); }
private static string ReadInBase(NumberCommand command) { return(command.ToBinStr()); }
static void Main(string[] args) { using (reader = File.OpenText("input.txt")) using (writer = new StreamWriter(File.Create("output.txt"))) { QuackVM vm = new QuackVM(); Workflow wf = new Workflow(vm); while (!reader.EndOfStream) { string str = reader.ReadLine(); ICommand cmd = null; switch (str[0]) { case '+': cmd = new PlusCommand(); break; case '-': cmd = new MinusCommand(); break; case '*': cmd = new MultiplyCommand(); break; case '/': cmd = new DivideCommand(); break; case '%': cmd = new ModuloCommand(); break; case '>': cmd = new SetRegisterCommand(str[1]); break; case '<': cmd = new GetRegisterCommand(str[1]); break; case 'P': if (str.Length > 1) { cmd = new PrintRegisterCommand(str[1]); } else { cmd = new PrintCommand(); } break; case 'C': if (str.Length > 1) { cmd = new PrintRegisterCharCommand(str[1]); } else { cmd = new PrintCharCommand(); } break; case ':': cmd = new LabelCommand(str.Substring(1)); break; case 'J': cmd = new GoToLabelCommand(str.Substring(1)); break; case 'Z': cmd = new GoToLabelZCommand(str[1], str.Substring(2)); break; case 'E': cmd = new GoToLabelECommand(str[1], str[2], str.Substring(3)); break; case 'G': cmd = new GoToLabelGCommand(str[1], str[2], str.Substring(3)); break; case 'Q': cmd = new QuitCommand(); break; default: cmd = new NumberCommand(int.Parse(str)); break; } wf.AddCommand(cmd); } while (!wf.IsCompleted()) { wf.ExecuteCurrentCommand(); } } }