public IEnumerable <Command> ParseVMCommands(VMCommandsContext context, string[] lines)
            {
                var remainingLines = StripComments(lines);

                return(remainingLines.Select(line => _commandFactory.Create(context, line)));
            }
        public Command Create(VMCommandsContext context, string line)
        {
            var commandFields = line.Split(' ');
            var commandName   = commandFields[0];
            var segment       = commandFields.Length > 1 ? commandFields[1] : null;
            var index         = commandFields.Length > 2 ? commandFields[2] : null;

            switch (commandName)
            {
            case "push":
                return(new Push(context, segment, index));

            case "pop":
                return(new Pop(context, segment, index));

            case "add":
                return(new Add());

            case "sub":
                return(new Sub());

            case "eq":
                return(new Eq());

            case "lt":
                return(new Lt());

            case "gt":
                return(new Gt());

            case "neg":
                return(new Neg());

            case "and":
                return(new And());

            case "or":
                return(new Or());

            case "not":
                return(new Not());

            case "label":
                return(new Label(context, segment));

            case "goto":
                return(new Goto(context, segment));

            case "if-goto":
                return(new IfGoto(context, segment));

            case "function":
                return(new Function(context, segment, index));

            case "return":
                return(new Return(context));

            case "call":
                return(new Call(context, segment, index));

            default:
                throw new NotSupportedException();
            }
        }