private void Read()
        {
            var  constantExpression = new StringBuilder();
            char character;

            while (reader.ReadNext(out character))
            {
                switch (character)
                {
                case '\\':
                    constantExpression.Append(ReadEscapedCharacter());
                    break;

                case '[':
                    visitor.VisitConstant(constantExpression.ToString());
                    constantExpression.Clear();
                    visitor.VisitRange(ReadRange());
                    break;

                default:
                    constantExpression.Append(character);
                    break;
                }
            }

            if (constantExpression.Length > 0)
            {
                visitor.VisitConstant(constantExpression.ToString());
            }
        }
        private void ReadMemberName()
        {
            var  memberName = new StringBuilder();
            char character;

            while (reader.ReadNext(out character))
            {
                if (character == '.' || character == '[')
                {
                    if (memberName.Length > 0)
                    {
                        visitor.VisitMember(memberName.ToString());
                        memberName.Clear();
                    }

                    if (character == '[')
                    {
                        ReadDictionaryStyleMember();
                    }
                }
                else
                {
                    if (!IsAlphaNumeric(character))
                    {
                        throw UnexpectedCharacter();
                    }

                    memberName.Append(character);
                }
            }

            if (memberName.Length > 0)
            {
                visitor.VisitMember(memberName.ToString());
            }
        }