/// <summary>
        /// 读取第一个表达式
        /// </summary>
        /// <returns>ReadResult</returns>
        private ReadResult ReadFirstExpression()
        {
            ReadResult result = ReadResult.Empty;

            var token = spResult.Next();

            // 只列出可以出现在最左边的
            switch (token.Type)
            {
            case TokenType.Operator:
                if (OperatorWord.UnaryExpressions.ContainsKey(token.Text))
                {
                    result.Expression = OperatorWord.UnaryExpressions[token.Text](ReadExpression(OperatorPriority.GetOperatorLevel(token.Text)).Expression);
                }
                else if (token.Is(OperatorWord.LeftBracket))
                {
                    result = ParseConvertType();
                }
                else if (token.Is(OperatorWord.Comma))
                {
                    result = ReadExpression();
                }
                else
                {
                    throw new ArgumentException(string.Format("Invalid Left Operator {0}", token.Text));
                }
                break;

            case TokenType.Identifier:
                result = ParseIdentifier(token);
                break;

            case TokenType.DigitValue:
                result.Expression = Expression.Constant(DigitValue.Parse(token.Text), DigitValue.GetType(token.Text));
                break;

            case TokenType.PackageValue:
                // 去掉首尾引号
                if (token.Text.StartsWith(PackageValue.String))
                {
                    result.Expression = Expression.Constant(token.Text.Substring(1, token.Text.Length - 2), PackageValue.All[PackageValue.String]);
                }
                else if (token.Text.StartsWith(PackageValue.Char))
                {
                    result.Expression = Expression.Constant(token.Text[1], PackageValue.All[PackageValue.Char]);
                }
                break;

            default:
                throw new ArgumentException(string.Format("Unsupported TokenType {0}", token.Type));
            }

            return(result);
        }