1

次のような文字列を解析するエレガントな方法を見つけようとしています。

EVENT_TYPE(param1;param2; ...)

EVENT_TYPE は多くの文字列定数の 1 つで、それぞれに 0 個以上のパラメーターがあります。これまでのところ、文字列「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 に答える