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