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);
        }
예제 #2
0
        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());
        }
예제 #3
0
        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());
 }
예제 #6
0
        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();
                    }
                }
        }