istream parse EVENT_TYPE (param1; param2; ...) - PullRequest
1 голос
/ 29 сентября 2010

Я пытаюсь найти элегантный способ разбора строки вроде:

EVENT_TYPE(param1;param2; ...)

EVENT_TYPE - это одна из многих строковых констант, каждая из которых имеет ноль или более параметров. До сих пор я думал, что, учитывая, что строчка "s" содержит EVENT_TYPE (param1; param2), я написал бы:

if (boost::istarts_with(s, "EVENT_TYPE")) {
  std::istringstream iss(s);
  int param1, param2;
  iss >> "EVENT_TYPE(" >> param1 >> ";" >> param2 >> ")";
}

Было бы неплохо дать const string & и сказать таким образом "пропустить эти символы". Ну, это не так. Как бы вы поступили по этому поводу? : -)

Спасибо за совет!

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Хм, с моей головы:

// Beware, brain-compiled code ahead!
class string_const {
public:
  string_const(const std::string& str) : str_(str) {}
  void read(std::istream& is) const
  {
    is >> std::ws; // if leading whitespace ok
    for(std::string::size_type idx=0; idx<str_.size(); ++idx) {
      char ch;
      if(!(is >> ch))
        return;
      if(ch != str_[idx]) {
        str.setstate(std::ios:failbit);
        return;
      }
    }
  }
private:
  std::string str_;
};

inline std::istream& operator>>(std::istream& is, const string_const& str)
{
  str.read(is);
  return is;
}

Используйте это так:

iss >> string_const("EVENT_TYPE(") >> ...;
1 голос
/ 29 сентября 2010

Это выглядит достаточно сложно, чтобы гарантировать "настоящий" синтаксический анализатор.Поскольку вы уже используете Boost, попробуйте сначала: http://boost -spirit.com / home /

...