示例#1
0
        static JsonValue Parse(Utf8String segment, List <JsonValue> values, int parentIndex)
        {
            // skip white space
            int pos;

            if (!segment.TrySearchByte(x => !char.IsWhiteSpace((char)x), out pos))
            {
                throw new ParserException("only whitespace");
            }
            segment = segment.Subbytes(pos);

            var valueType = GetValueType(segment);

            switch (valueType)
            {
            case ValueNodeType.Boolean:
            case ValueNodeType.Integer:
            case ValueNodeType.Number:
            case ValueNodeType.Null:
            case ValueNodeType.NaN:
            case ValueNodeType.Infinity:
            case ValueNodeType.MinusInfinity:
            {
                var value = ParsePrimitive(segment, valueType, parentIndex);
                values.Add(value);
                return(value);
            }

            case ValueNodeType.String:
            {
                var value = ParseString(segment, parentIndex);
                values.Add(value);
                return(value);
            }

            case ValueNodeType.Array:     // fall through
            {
                var index = values.Count;
                values.Add(new JsonValue());         // placeholder
                var current = ParseArray(segment, values, index);
                values[index] = new JsonValue(segment.Subbytes(0, current.Bytes.Offset + 1 - segment.Bytes.Offset),
                                              ValueNodeType.Array, parentIndex);
                return(values[index]);
            }

            case ValueNodeType.Object:     // fall through
            {
                var index = values.Count;
                values.Add(new JsonValue());         // placeholder
                var current = ParseObject(segment, values, index);
                values[index] = new JsonValue(segment.Subbytes(0, current.Bytes.Offset + 1 - segment.Bytes.Offset),
                                              ValueNodeType.Object, parentIndex);
                return(values[index]);
            }

            default:
                throw new NotImplementedException();
            }
        }
示例#2
0
        public static JsonNode Parse(JsonNode tree, Utf8String segment)
        {
            // skip white space
            int pos;

            if (!segment.TrySearchByte(x => !char.IsWhiteSpace((char)x), out pos))
            {
                throw new ParserException("only whitespace");
            }
            segment = segment.Subbytes(pos);

            var valueType = GetValueType(segment);

            switch (valueType)
            {
            case ValueNodeType.Boolean:
            case ValueNodeType.Integer:
            case ValueNodeType.Number:
            case ValueNodeType.Null:
            case ValueNodeType.NaN:
            case ValueNodeType.Infinity:
            case ValueNodeType.MinusInfinity:
                return(ParsePrimitive(tree, segment, valueType));

            case ValueNodeType.String:
                return(ParseString(tree, segment));

            case ValueNodeType.Array:     // fall through
                return(ParseArray(tree, segment));

            case ValueNodeType.Object:     // fall through
                return(ParseObject(tree, segment));

            default:
                throw new NotImplementedException();
            }
        }
示例#3
0
        public static ListTreeNode <TomlValue> Parse(Utf8String segment)
        {
            var values = new List <TomlValue>()
            {
                new TomlValue(segment, TomlValueType.Table, -1),
            };
            var current = 0;

            while (!segment.IsEmpty)
            {
                segment = segment.TrimStart();
                if (segment.IsEmpty)
                {
                    break;
                }

                if (segment[0] == '#')
                {
                    // comment line
                    // skip to line end
                    segment = segment.Subbytes(segment.GetLine().ByteLength);
                    continue;
                }

                if (segment.ByteLength >= 4 && segment[0] == '[' && segment[1] == '[')
                {
                    // [[array_name]]
                    throw new NotImplementedException();
                }
                else if (segment.ByteLength >= 2 && segment[0] == '[')
                {
                    // [table_name]
                    int table_end;
                    if (!segment.TrySearchByte(x => x == ']', out table_end))
                    {
                        throw new ParserException("] not found");
                    }
                    var table_name = segment.Subbytes(1, table_end - 1).Trim();
                    if (table_name.IsEmpty)
                    {
                        throw new ParserException("empty table name");
                    }

                    // top level key
                    values.Add(new TomlValue(table_name, TomlValueType.Table, 0));
                    current = values.Count - 1;

                    // skip to line end
                    segment = segment.Subbytes(segment.GetLine().ByteLength);
                }
                else
                {
                    // key = value
                    {
                        var key = ParseLHS(segment, current);
                        switch (key.TomlValueType)
                        {
                        case TomlValueType.BareKey:
                        case TomlValueType.QuotedKey:
                        {
                            values.Add(key);

                            // skip key
                            segment = segment.Subbytes(key.Bytes.Count);
                        }
                        break;

                        case TomlValueType.DottedKey:
                            throw new NotImplementedException();
                        }
                    }

                    {
                        // search and skip =
                        int eq;
                        if (!segment.TrySearchByte(x => x == '=', out eq))
                        {
                            throw new ParserException("= not found");
                        }
                        segment = segment.Subbytes(eq + 1);

                        // skip white space
                        segment = segment.TrimStart();
                    }

                    {
                        var value = ParseRHS(segment, current);
                        values.Add(value);

                        // skip value
                        segment = segment.Subbytes(value.Bytes.Count);

                        // skip to line end
                        segment = segment.Subbytes(segment.GetLine().ByteLength);
                    }
                }
            }

            return(new ListTreeNode <TomlValue>(values));
        }