7

私は学ぼうとしていますboost::spirit。例として、一連の単語を解析してvector<string>. 私はこれを試しました:

#include <boost/spirit/include/qi.hpp>
#include <boost/foreach.hpp>

namespace qi = boost::spirit::qi;

int main() {

  std::vector<std::string> words;
  std::string input = "this is a test";

  bool result = qi::phrase_parse(
      input.begin(), input.end(),
      +(+qi::char_),
      qi::space,
      words);

  BOOST_FOREACH(std::string str, words) {
    std::cout << "'" << str << "'" << std::endl;
  }
}

これにより、次の出力が得られます。

'thisisatest'

しかし、各単語が個別に一致する次の出力が必要でした:

'this'
'is'
'a'
'test'

qi::grammar可能であれば、この単純なケースに対して独自のサブクラスを定義する必要は避けたいと思います。

4

3 に答える 3

14

スキップパーサーの目的を根本的に誤解しています(または少なくとも誤用しています)-スキップパーサーqi::spaceとして使用されるは、パーサーの空白にとらわれないようにするためのものa bですab

あなたの場合、単語を区切るために空白が重要です。したがって、空白をスキップするべきではqi::parseなく、次の代わりに使用する必要がありますqi::phrase_parse

#include <vector>
#include <string>
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/spirit/include/qi.hpp>

int main()
{
    namespace qi = boost::spirit::qi;

    std::string const input = "this is a test";

    std::vector<std::string> words;
    bool const result = qi::parse(
        input.begin(), input.end(),
        +qi::alnum % +qi::space,
        words
    );

    BOOST_FOREACH(std::string const& str, words)
    {
        std::cout << '\'' << str << "'\n";
    }
}

(現在、G. Civardi の修正で更新されています。)

于 2012-05-02T21:28:04.747 に答える
2

これが最小バージョンだと思います。qi リスト パーサー セパレーターに qi::omit を適用する必要はありません。出力属性は生成されません。詳細については、http ://www.boost.org/doc/libs/1_48_0/libs/spirit/doc/html/spirit/qi/reference/operator/list.html を参照してください。

#include <string>
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/spirit/include/qi.hpp>

int main()
{
  namespace qi = boost::spirit::qi;

  std::string const input = "this is a test";

  std::vector<std::string> words;
  bool const result = qi::parse(
      input.begin(), input.end(),
      +qi::alnum % +qi::space,
      words
  );

  BOOST_FOREACH(std::string const& str, words)
  {
      std::cout << '\'' << str << "'\n";
  }
}
于 2012-06-09T21:31:23.723 に答える