istream解析EVENT_TYPE(param1; param2; ...)

时间:2010-09-29 17:04:11

标签: c++ parsing istream

我正在尝试找到一种优雅的方法来解析字符串,如:

EVENT_TYPE(param1;param2; ...)

EVENT_TYPE是众多字符串常量之一,每个常量都有零个或多个参数。 到目前为止我认为,鉴于sting“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字符串& 并告诉他们“跳过这些字符”会很好。嗯,事实并非如此。你怎么会这样呢? : - )

感谢您的建议!

2 个答案:

答案 0 :(得分:1)

这看起来很复杂,足以保证“真正的”解析器。由于您已经在使用Boost,请首先尝试:http://boost-spirit.com/home/

答案 1 :(得分:1)

嗯,撇下我的头顶:

// 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(") >> ...;