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(); } }
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(); } }
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)); }