【问题标题】:use boost spirit parse int pair to vector使用 boost 精神解析 int 对向量
【发布时间】:2017-10-20 06:39:14
【问题描述】:

字符串内容如下:

20 10 5 3...

它是一对 int 的列表。如何使用精神解析到std::vector<std::pair<int, int>>

    std::string line;
    std::vector<std::pair<int, int>> v;
    boost::spirit::qi::phrase_parse(
        line.cbegin(),
        line.cend(),
        (
                   ???
        ),
        boost::spirit::qi::space
    );

【问题讨论】:

  • 什么是“精神阶段”?

标签: c++ parsing boost-spirit std-pair


【解决方案1】:

你可以做一个简单的解析器表达式,比如*(int_ &gt;&gt; int_)(参见教程和these文档pages)。

Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>

namespace qi = boost::spirit::qi;

int main() {
    std::string line = "20 10 5 3";
    std::vector<std::pair<int, int>> v;
    qi::phrase_parse(line.cbegin(), line.cend(), *(qi::int_ >> qi::int_), qi::space, v);

    for (auto& p : v) {
        std::cout << "(" << p.first << ", " << p.second << ")\n";
    }
}

打印

(20, 10)
(5, 3)

专业提示 1:有效性

如果您想确保没有不需要/意​​外的输入,请检查剩余数据:

  • 解析后检查迭代器

    auto f = line.cbegin(), l = line.cend();
    qi::phrase_parse(f, l, *(qi::int_ >> qi::int_), qi::space, v);
    
    if (f!=l)
        std::cout << "Unparsed input '" << std::string(f,l) << "'\n";
    
  • 或者简单的 require qi::eoi 作为解析器表达式的一部分并检查返回值:

    bool ok = qi::phrase_parse(line.cbegin(), line.cend(), *(qi::int_ >> qi::int_) >> qi::eoi, qi::space, v);
    

专业提示 2:“看妈妈,没有手”

由于语法是可以解析成这个数据结构的最简单的东西,你可以让 Spirit 做所有的猜测:

Live On Coliru

qi::phrase_parse(line.begin(), line.end(), qi::auto_, qi::space, v);

也就是说,一个只包含一个qi::auto_ 的语法。输出还是:

(20, 10)
(5, 3)

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多