Я думаю, в вашем вопросе подразумевается, что переменные могут иметь разные типы, такие как числа, массивы или строки.В этом случае вы должны решить, использовать ли скажем boost::any<>
или boost::variant<>
или создать свой собственный тип переменной ala:
struct Var
{
enum { Double, String, Array } Type;
Type type_;
double double_;
std::string string_;
std::vector<double> array_;
Var(Type t) : type_(t), double_(0) { } // empty double/string/array
Var(double d) : type_(Double), double_(d) { }
Var(const std::string& s) : type_(String), string_(s) { }
...
};
В качестве альтернативы вы можете использовать встроенный полиморфизм C ++ и иметь базовый класспроизводный класс для каждого реального типа данных.Возможно, вам даже будет достаточно всегда хранить текстовое представление и хранить все в std::string
.Как бы вы это ни делали, допустим, вы храните значения в типе с именем «Тип».
Кажется, имя переменных должно быть указано слева от двоеточия.Если вы знаете, что соответствующие переменные будут жестко запрограммированы в вашей программе, тогда вы можете установить эти ранее существующие переменные в значения справа.В противном случае вам нужно динамически создавать переменные, связанные с этими именами идентификаторов: это можно сделать с помощью ключа std::map<std::string, Type>
для идентификатора.Вы можете заполнить его так:
std::map<std::string, Type> variables;
variables["age"] = Type(28);
variables["name"] = Type("Fred");
Для анализа фактического текстового файла вы можете использовать iostreams.Читайте строчку за раз: а
std::string line;
while (getline(cin, line))
{
std::string::pos n = line.find(':');
if (pos != std::string::npos)
{
std::string identifier = line.substr(0, n - 1);
Type var;
{
// try parsing it as a number...
std::istringstream iss = line.substr(n + 1);
char c;
double d;
if (iss >> d && !(iss >> c))
var = d;
}
{
// try parsing it as an array...
std::istringstream iss = line.substr(n + 1);
var.clear(Array);
double d;
if (iss >> c && c == '[')
while (iss >> d)
result.array_.push_back(d);
if (iss && iss >> c && c == ']' && !(is >> c))
// parsed successfully as an array - use "result"
}
{
// it's a string...
var = line.substr(n + 1);
}
Вы должны попытаться начать с этого и попросить конкретной помощи, когда вы застряли.
Примечание: вам может быть легчеполучить работающую (хотя и медленную) программу, отвечающую этому требованию, на таком языке, как Ruby, python или perl.