Assembler.Assembler.ParseOperand C# (CSharp) Method

ParseOperand() private method

private ParseOperand ( ) : Operand
return Operand
        private Operand ParseOperand()
        {
            var t = tokens[pos];
            var ptr = false;
            var b = false;

            if (t.Type == TokenType.Word && t.Value.ToLower() == "byte")
            {
                b = true;
                t = tokens[++pos];
            }

            if (t.Type == TokenType.OpenBracket)
            {
                ptr = true;
                pos++;
            }

            try
            {
                t = tokens[pos++];

                switch (t.Type)
                {
                    case TokenType.Word:
                        {
                            Registers register;
                            if (Enum.TryParse(t.Value, true, out register))
                            {
                                return Operand.FromRegister(register, ptr, b);
                            }
                            else
                            {
                                return Operand.FromLabel(t.Value, t.Line, ptr, b);
                            }
                        }

                    case TokenType.BitwiseNot:
                    case TokenType.OpenParentheses:
                    case TokenType.Number:
                        --pos;
                        return Operand.FromNumber(EvaluateExpression(), ptr, b);

                    case TokenType.String:
                        {
                            var strBytes = Encoding.GetEncoding(437).GetBytes(t.Value);
                            if (strBytes.Length < 1 || strBytes.Length > 2)
                                throw new AssemblerException(string.Format("Bad string literal size on line {0}.", t.Line));
                            return Operand.FromNumber(strBytes.Length == 2 ? BitConverter.ToInt16(strBytes, 0) : (sbyte)strBytes[0], ptr, b);
                        }
                }

                throw new AssemblerException(string.Format("Expected operand on line {0}.", t.Line));
            }
            finally
            {
                if (ptr)
                {
                    Require(TokenType.CloseBracket);
                }
            }
        }