如何使用boost ::精神字序列解析为载体?(How to use boost::spirit t

2019-09-16 23:55发布

我想学习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子类这个简单的例子。

Answer 1:

你从根本上误解(或至少误用)跳过解析器的目的- qi::space ,作为跳读分析器,是为使您的解析器不可知的空白,使得在没有任何区别abab

在你的情况下,空白重要的,因为你希望它分隔单词。 因此,你不应该跳过空格,并要使用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的修复更新。)



Answer 2:

我相信这是最低版本。 气::施加在齐列表解析器分离器省略不是必要 - 它不产生任何输出属性(一个或多个)。 有关详细信息,请参阅: 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";
  }
}


Answer 3:

万一别人碰到我的前导空格的问题。

使用ildjarn的解决方案,我一直,直到我遇到了与一些空格开头的字符串。

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

我花了一段时间才能弄清楚,前导空格导致功能齐的失败::解析(...)。 解决的方法是调用气::解析之前修正输入前导空格()。



文章来源: How to use boost::spirit to parse a sequence of words into a vector?