コード例 #1
0
ファイル: AstMiddleware.cs プロジェクト: furesoft/RegVM
        public void Run(Options parameter, Action <Options> next)
        {
            var source = File.ReadAllText(parameter.Input);
            var parsed = AssemblySource.Parse(source);

            parameter.Tags.Add("AST", parsed);

            next(parameter);
        }
コード例 #2
0
ファイル: Repl.cs プロジェクト: furesoft/RegVM
        public void Run()
        {
            ReadLine.HistoryEnabled        = true;
            ReadLine.AutoCompletionHandler = new AutoCompletionHandler();

            bool ishexMode = false;

            while (true)
            {
                string prefix = ishexMode ? "hex" : "asm";

                var input = ReadLine.Read(prefix + "> ");

                if (ReplCommand.IsCommand(input))
                {
                    var cmd = ReplCommand.Parse(input);
                    switch (cmd.Name)
                    {
                    case "mode":
                        var arg = cmd.Args.First();
                        if (arg == "asm")
                        {
                            ishexMode = false;
                        }
                        else if (arg == "hex")
                        {
                            ishexMode = true;
                        }
                        else
                        {
                            Console.WriteLine($"mode '{arg}' not recognized");
                        }

                        break;

                    case "register":
                        Utils.PrintRegisters(vm.Register);

                        break;

                    case "clear":
                        Console.Clear();
                        break;

                    case "explain":
                        if (cmd.Args.Length == 1)
                        {
                            var errorcodeStr = cmd.Args.First();

                            Console.WriteLine(ErrorTable.GetExplanation(int.Parse(errorcodeStr)));
                        }
                        else
                        {
                            Console.WriteLine("Please specifiy an errorcode");
                        }
                        break;

                    default:
                        Console.WriteLine($"Command '{cmd.Name}' not found");
                        break;
                    }
                }
                else
                {
                    if (ishexMode)
                    {
                        var prog   = ParseHex(input);
                        var reader = new VmReader(prog, vm);
                        vm.RunInstructionLine(reader);
                    }
                    else
                    {
                        var src    = AssemblySource.Parse(input);
                        var writer = new VmWriter();

                        foreach (var line in src.Lines)
                        {
                            writer.Write(line.Opcode);

                            foreach (var operand in line.Operands)
                            {
                                writer.Write(operand);
                            }
                        }

                        vm.Run(writer);

                        vm.Register[Registers.IPR] = 0;
                    }
                }
            }
        }