Beispiel #1
0
        public void ConstructorTest()
        {
            string   outputPath = "../../../TestFiles/PrintNumber/UnitTest.vm";
            VmWriter vmWriter   = new VmWriter(outputPath);

            Assert.IsTrue(File.Exists(outputPath), "file not found.");
        }
Beispiel #2
0
        public void WriteGotoTest()
        {
            string outputPath = "../../../TestFiles/PrintNumber/UnitTest.vm";

            using (VmWriter vmWriter = new VmWriter(outputPath))
            {
                vmWriter.WriteGoto("SomeLabel");
            }

            using (StreamReader streamReader = new StreamReader(File.OpenRead("../../../TestFiles/PrintNumber/UnitTest.vm")))
            {
                string line = streamReader.ReadLine().Trim();
                Assert.IsTrue(string.Equals(line, "goto SomeLabel", StringComparison.InvariantCulture));
            }
        }
Beispiel #3
0
        public void WriteArithmeticTest()
        {
            string outputPath = "../../../TestFiles/PrintNumber/UnitTest.vm";

            using (VmWriter vmWriter = new VmWriter(outputPath))
            {
                vmWriter.WriteArithmetic(ArithmeticCommand.Add);
            }

            using (StreamReader streamReader = new StreamReader(File.OpenRead("../../../TestFiles/PrintNumber/UnitTest.vm")))
            {
                string line = streamReader.ReadLine().Trim();
                Assert.IsTrue(string.Equals(line, "add", StringComparison.InvariantCulture));
            }
        }
Beispiel #4
0
        public void WritePopTest()
        {
            string outputPath = "../../../TestFiles/PrintNumber/UnitTest.vm";

            using (VmWriter vmWriter = new VmWriter(outputPath))
            {
                vmWriter.WritePop(Segment.Argument, 1);
            }

            using (StreamReader streamReader = new StreamReader(File.OpenRead("../../../TestFiles/PrintNumber/UnitTest.vm")))
            {
                string line = streamReader.ReadLine().Trim();
                Assert.IsTrue(string.Equals(line, "pop Argument 1", StringComparison.InvariantCulture));
            }
        }
        public static string CompilingJackCode(this VmCompiler vmCompiler, string jackCode)
        {
            using (var tokeniser = new Tokeniser(jackCode))
            {
                var output = new StringWriter();
                var writer = new VmWriter(output);
                var parser = new Parser(new Grammarian());
                parser.Parse(tokeniser);
                var xmlConverter = new XmlConverter();
                Console.WriteLine(xmlConverter.ConvertNode(parser.Tree).OuterXml);
                vmCompiler.Compile(parser.Tree, writer);
                return writer.ToString();
            }

        }
Beispiel #6
0
        public void Run(Options parameter, Action <Options> next)
        {
            var ast    = (AssemblySource)parameter.Tags["AST"];
            var writer = new VmWriter();

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

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

            File.WriteAllBytes(parameter.Output, writer.ToArray());

            next(parameter);
        }
Beispiel #7
0
        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;
                    }
                }
            }
        }