Ejemplo n.º 1
0
        public string[] GetAssembly()
        {
            var commands = new List <string>();

            while (_parser.HasMoreCommands)
            {
                _parser.Advance();

                switch (_parser.CommandType)
                {
                case CommandType.C_ARITHMETIC:
                    commands.AddRange(_codeWriter.WriteArithmetic(_parser.Arg1()));
                    break;

                case CommandType.C_PUSH:
                case CommandType.C_POP:
                    commands.AddRange(_codeWriter.WritePushPop(_parser.CommandType, _parser.Arg1(), int.Parse(_parser.Arg2())));
                    break;

                case CommandType.C_LABEL:
                    commands.AddRange(_codeWriter.WriteLabel(_parser.Arg1()));
                    break;

                case CommandType.C_GOTO:
                    commands.AddRange(_codeWriter.WriteGoto(_parser.Arg1()));
                    break;

                case CommandType.C_IF:
                    commands.AddRange(_codeWriter.WriteIf(_parser.Arg1()));
                    break;

                case CommandType.C_FUNCTION:
                    commands.AddRange(_codeWriter.WriteFunction(_parser.Arg1(), int.Parse(_parser.Arg2())));
                    break;

                case CommandType.C_RETURN:
                    commands.AddRange(_codeWriter.WriteReturn());
                    break;

                case CommandType.C_CALL:
                    commands.AddRange(_codeWriter.WriteCall(_parser.Arg1(), int.Parse(_parser.Arg2())));
                    break;

                default:
                    break;
                }
            }

            return(commands.ToArray());
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Usage();
                return;
            }
            var vmFileName = args[0];

            if (!File.Exists(vmFileName))
            {
                Usage();
                return;
            }

            var parser       = new Parser(vmFileName);
            var hackFileName = vmFileName.Replace("vm", "asm");

            using (var codeWriter = new CodeWriter(hackFileName))
            {
                while (parser.HasMoreCommands)
                {
                    Console.WriteLine(parser.CurrentCommand());
                    var command = parser.CurrentCommand();
                    if (command.CommandType == CommandType.Arithmetic)
                    {
                        codeWriter.WriteArithmetic(command);
                    }
                    else
                    {
                        codeWriter.WritePushPop(command);
                    }
                    parser.Advance();
                }
            }
        }