public void Load(string data)
{
var tokenizer = new KeyValuesTokenizer(data);
var token = tokenizer.NextToken();
if (token == null || token.Item1 != TokenType.String)
{
throw new ParseException("Invalid token at " + tokenizer.Location());
}
var key = token.Item2;
token = tokenizer.NextToken();
if (token == null || token.Item1 != TokenType.BlockBegin)
{
throw new ParseException($"Invalid token: {token.Item1}, {token.Item2} at {tokenizer.Location()}");
}
var kv = new KeyValues();
this[key] = kv;
kv.Parse(tokenizer);
token = tokenizer.NextToken();
if (token != null)
{
throw new ParseException("Unexpected token at file end");
}
}