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()); }
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(); } } }