Example #1
0
        /// <summary>
        /// 读取字符串并存入 dict
        /// </summary>
        /// <param name="str"></param>
        /// <param name="offset"></param>
        /// <param name="line"></param>
        /// <param name="column"></param>
        private void ReadObject(SimpleReader reader)
        {
            const char head = '{';
            const char tail = '}';

            if (reader.Char() != head)
            {
                throw new ParseException("异常调用,类型不符", reader);
            }

            while (true)
            {
                reader.JumpSpace();
                var key = ReadStringValue(reader);
                if (key == null)
                {
                    break;
                }
                reader.JumpSpace();
                if (reader.Char() != ':')
                {
                    throw new ParseException("ReadObject 找不到分隔符", reader);
                }

                var    valueType = TestValueType(reader);
                string valueStr;
                switch (valueType)
                {
                case ObjectTypes.Array:
                    valueStr = ReadPairValue(reader, '[', ']');
                    break;

                case ObjectTypes.Object:
                    valueStr = ReadPairValue(reader, '{', '}');
                    break;

                case ObjectTypes.String:
                    valueStr = '"' + ReadStringValue(reader) + '"';
                    break;

                case ObjectTypes.Boolean:
                    valueStr = ReadBooleanValue(reader);
                    break;

                case ObjectTypes.Number:
                    valueStr = ReadNumberValue(reader);
                    break;

                default:
                    throw new NotImplementedException();
                }
                _dict.Add(key, valueStr);
                if (reader.Peek(true) == null || reader.Char() == tail)
                {
                    break;
                }
            }
        }
Example #2
0
        /// <summary>
        /// 读取由 "{" 与 "}" 包围的字符串。
        /// 要求光标被放在开头的 "{" 位置上。
        /// 读取结果将包含开头的 "{" 与结尾的 "}"。
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private void ReadArray(SimpleReader reader)
        {
            const char head = '[';
            const char tail = ']';

            if (reader.Peek(false) == null || reader.Char() != head)
            {
                throw new ParseException("非法调用 ReadArrayValue", reader);
            }

            var key = 0;

            while (true)
            {
                var    valueType = TestValueType(reader);
                string valueStr;
                switch (valueType)
                {
                case ObjectTypes.Array:
                    valueStr = ReadPairValue(reader, '[', ']');
                    break;

                case ObjectTypes.Object:
                    valueStr = ReadPairValue(reader, '{', '}');
                    break;

                case ObjectTypes.String:
                    valueStr = '"' + ReadStringValue(reader) + '"';
                    break;

                case ObjectTypes.Number:
                    valueStr = ReadNumberValue(reader);
                    break;

                default:
                    throw new NotImplementedException();
                }
                _dict.Add(key.ToString(), valueStr);
                key++;
                if (reader.Peek(true) == null)
                {
                    break;
                }
                var c = reader.Char();
                if (c == ',')
                {
                    continue;
                }
                if (c == tail)
                {
                    break;
                }
                throw new ParseException(" ReadArrayValue 解析异常。", reader);
            }
        }
Example #3
0
        /// <summary>
        /// 读取由双引号["]包围的字符串内容,开头必须有 ["] 并且结果的 ["] 也将被跳过,读取内容不包含双引号
        /// 要求当标必须被放在 开头的["] 上面
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private string ReadStringValue(SimpleReader reader)
        {
            if (reader.Char() != '"')
            {
                throw new ParseException("非法调用 ReadStringValue。", reader);
            }
            var  key  = new StringBuilder();
            char?last = null;

            foreach (var c in reader)
            {
                switch (c)
                {
                case '\"':
                    if (last == '\\')
                    {
                        key.Append('\"');
                        break;
                    }
                    return(key.ToString());

                case '\n':
                    throw new ParseException("ReadStringValue 解析异常。", reader);

                case '\r':
                    throw new ParseException("ReadStringValue 解析异常。", reader);

                default:
                    key.Append(c);
                    break;
                }
                last = c;
            }
            throw new ParseException("ReadStringValue 解析异常。", reader);
        }