--- a/object-factory.cc 2018-09-04 20:02:39.000000000 -0300 +++ a/object-factory.cc 2018-09-10 19:58:02.001334404 -0300 @@ -120,13 +120,36 @@ os << "]"; return os; } + +std::string::size_type +findNextAtt (std::string &str, size_t pos) +{ + int level = 0; + for (std::string::size_type i = pos; i < str.size (); i++) + { + if (level == 0 && str[i] == '|') + { + return i; + } + if (str[i] == '[') + { + level++; + } + else if (str[i] == ']') + { + level--; + } + } + return std::string::npos; +} + std::istream & operator >> (std::istream &is, ObjectFactory &factory) { std::string v; is >> v; std::string::size_type lbracket, rbracket; lbracket = v.find ("["); - rbracket = v.find ("]"); + rbracket = v.rfind ("]"); if (lbracket == std::string::npos && rbracket == std::string::npos) { factory.SetTypeId (v); @@ -162,7 +185,7 @@ } else { - std::string::size_type next = parameters.find ("|", cur); + std::string::size_type next = findNextAtt (parameters, cur); std::string value; if (next == std::string::npos) {