1

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

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&并告诉这种方式“跳过这些字符”会很好。好吧,事实并非如此。你会怎么做呢?:-)

谢谢你的建议!

4

2 回答 2

1

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

于 2010-09-29T17:09:24.210 回答
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(") >> ...;
于 2010-09-29T17:19:30.600 回答