#include <iostream>
#include <string>
#include <map>
#include <iomanip>
#include <fstream>
using namespace std;
// your structure
struct person
{
string name, pass, role, mail;
};
// the tokens your format is using
enum class token : char
{
lb = '{',
rb = '}',
sc = ':',
comma = ',',
str,
end
};
token tk; // current token
string str; // if the current token is token::str, str is its value
// get_token breaks the input stream into tokens - this is the lexer, or tokenizer, or scanner
token get_token(istream& is)
{
char c;
if (!(is >> c))
return tk = token::end;
switch (c)
{
case '{':
case '}':
case ':':
case ',':
return tk = token(c);
case '"':
is.unget();
is >> quoted(str);
return tk = token::str;
default: throw "unexpected char";
}
}
// throws if the current token is not the expected one
void expect(istream& is, token expected, const char* error)
{
if (tk != expected)
throw error;
get_token(is);
}
// throws if the current token is not a string
string expect_str(istream& is, const char* error)
{
if (tk != token::str)
throw error;
string s = str;
get_token(is);
return s;
}
// the actual parser; it extracts the tokens one by oneand compares them with the expected order.
// if the order is not what it expects, it throws an exception.
void read(istream& is, person& p)
{
get_token(is); // prepare the first token
expect(is, token::lb, "'{' expected");
map<string, string> m; // key/values storage
while (tk == token::str)
{
string k = expect_str(is, "key expected");
expect(is, token::sc, "':' expected");
string v = expect_str(is, "value expected");
if (m.find(k) == m.end())
m[k] = v;
else
throw "duplicated key";
if (tk == token::comma)
get_token(is);
else
break; // end of of key/value pairs
}
expect(is, token::rb, "'}' expected");
expect(is, token::end, "eof expected");
// check the size of m & the keys & copy from m to p
// ...
}
int main()
{
try
{
person p;
read(cin, p);
}
catch (const char* e)
{
cout << e;
}
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxzdHJpbmc+CiAgICAjaW5jbHVkZSA8bWFwPgogICAgI2luY2x1ZGUgPGlvbWFuaXA+CiAgICAjaW5jbHVkZSA8ZnN0cmVhbT4KCiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIC8vIHlvdXIgc3RydWN0dXJlCiAgICBzdHJ1Y3QgcGVyc29uCiAgICB7CiAgICAgIHN0cmluZyBuYW1lLCBwYXNzLCByb2xlLCBtYWlsOwogICAgfTsKCiAgICAvLyB0aGUgdG9rZW5zIHlvdXIgZm9ybWF0IGlzIHVzaW5nCiAgICBlbnVtIGNsYXNzIHRva2VuIDogY2hhcgogICAgewogICAgICBsYiA9ICd7JywKICAgICAgcmIgPSAnfScsCiAgICAgIHNjID0gJzonLAogICAgICBjb21tYSA9ICcsJywKICAgICAgc3RyLAogICAgICBlbmQKICAgIH07CgogICAgdG9rZW4gdGs7IC8vIGN1cnJlbnQgdG9rZW4KICAgIHN0cmluZyBzdHI7IC8vIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIHRva2VuOjpzdHIsIHN0ciBpcyBpdHMgdmFsdWUKCiAgICAvLyBnZXRfdG9rZW4gYnJlYWtzIHRoZSBpbnB1dCBzdHJlYW0gaW50byB0b2tlbnMgLSB0aGlzIGlzIHRoZSBsZXhlciwgb3IgdG9rZW5pemVyLCBvciBzY2FubmVyCiAgICB0b2tlbiBnZXRfdG9rZW4oaXN0cmVhbSYgaXMpCiAgICB7CiAgICAgIGNoYXIgYzsKICAgICAgaWYgKCEoaXMgPj4gYykpCiAgICAgICAgcmV0dXJuIHRrID0gdG9rZW46OmVuZDsKICAgICAgc3dpdGNoIChjKQogICAgICB7CiAgICAgIGNhc2UgJ3snOgogICAgICBjYXNlICd9JzoKICAgICAgY2FzZSAnOic6CiAgICAgIGNhc2UgJywnOgogICAgICAgIHJldHVybiB0ayA9IHRva2VuKGMpOwogICAgICBjYXNlICciJzoKICAgICAgICBpcy51bmdldCgpOwogICAgICAgIGlzID4+IHF1b3RlZChzdHIpOwogICAgICAgIHJldHVybiB0ayA9IHRva2VuOjpzdHI7CiAgICAgIGRlZmF1bHQ6IHRocm93ICJ1bmV4cGVjdGVkIGNoYXIiOwogICAgICB9CiAgICB9CgogICAgLy8gdGhyb3dzIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCB0aGUgZXhwZWN0ZWQgb25lCiAgICB2b2lkIGV4cGVjdChpc3RyZWFtJiBpcywgdG9rZW4gZXhwZWN0ZWQsIGNvbnN0IGNoYXIqIGVycm9yKQogICAgewogICAgICBpZiAodGsgIT0gZXhwZWN0ZWQpCiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIGdldF90b2tlbihpcyk7CiAgICB9CgogICAgLy8gdGhyb3dzIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCBhIHN0cmluZwogICAgc3RyaW5nIGV4cGVjdF9zdHIoaXN0cmVhbSYgaXMsIGNvbnN0IGNoYXIqIGVycm9yKQogICAgewogICAgICBpZiAodGsgIT0gdG9rZW46OnN0cikKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgc3RyaW5nIHMgPSBzdHI7CiAgICAgIGdldF90b2tlbihpcyk7CiAgICAgIHJldHVybiBzOwogICAgfQoKICAgIC8vIHRoZSBhY3R1YWwgcGFyc2VyOyBpdCBleHRyYWN0cyB0aGUgdG9rZW5zIG9uZSBieSBvbmVhbmQgY29tcGFyZXMgdGhlbSB3aXRoIHRoZSBleHBlY3RlZCBvcmRlci4KICAgIC8vIGlmIHRoZSBvcmRlciBpcyBub3Qgd2hhdCBpdCBleHBlY3RzLCBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uLgogICAgdm9pZCByZWFkKGlzdHJlYW0mIGlzLCBwZXJzb24mIHApCiAgICB7CiAgICAgIGdldF90b2tlbihpcyk7IC8vIHByZXBhcmUgdGhlIGZpcnN0IHRva2VuCgogICAgICBleHBlY3QoaXMsIHRva2VuOjpsYiwgIid7JyBleHBlY3RlZCIpOwoKICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiBtOyAvLyBrZXkvdmFsdWVzIHN0b3JhZ2UKICAgICAgd2hpbGUgKHRrID09IHRva2VuOjpzdHIpCiAgICAgIHsKICAgICAgICBzdHJpbmcgayA9IGV4cGVjdF9zdHIoaXMsICJrZXkgZXhwZWN0ZWQiKTsKICAgICAgICBleHBlY3QoaXMsIHRva2VuOjpzYywgIic6JyBleHBlY3RlZCIpOwogICAgICAgIHN0cmluZyB2ID0gZXhwZWN0X3N0cihpcywgInZhbHVlIGV4cGVjdGVkIik7CgogICAgICAgIGlmIChtLmZpbmQoaykgPT0gbS5lbmQoKSkKICAgICAgICAgIG1ba10gPSB2OwogICAgICAgIGVsc2UKICAgICAgICAgIHRocm93ICJkdXBsaWNhdGVkIGtleSI7CgogICAgICAgIGlmICh0ayA9PSB0b2tlbjo6Y29tbWEpCiAgICAgICAgICBnZXRfdG9rZW4oaXMpOwogICAgICAgIGVsc2UKICAgICAgICAgIGJyZWFrOyAvLyBlbmQgb2Ygb2Yga2V5L3ZhbHVlIHBhaXJzCiAgICAgIH0KCiAgICAgIGV4cGVjdChpcywgdG9rZW46OnJiLCAiJ30nIGV4cGVjdGVkIik7CiAgICAgIGV4cGVjdChpcywgdG9rZW46OmVuZCwgImVvZiBleHBlY3RlZCIpOwoKICAgICAgLy8gY2hlY2sgdGhlIHNpemUgb2YgbSAmIHRoZSBrZXlzICYgY29weSBmcm9tIG0gdG8gcAogICAgICAvLyAuLi4KICAgIH0KCiAgICBpbnQgbWFpbigpCiAgICB7CiAgICAgIHRyeQogICAgICB7CiAgICAgICAgcGVyc29uIHA7CiAgICAgICAgcmVhZChjaW4sIHApOwogICAgICB9CiAgICAgIGNhdGNoIChjb25zdCBjaGFyKiBlKQogICAgICB7CiAgICAgICAgY291dCA8PCBlOwogICAgICB9CiAgICB9Cg==