【问题标题】:Using Boost Spirit's stream parser with custom grammar使用 Boost Spirit 的流解析器和自定义语法
【发布时间】:2012-04-27 20:46:57
【问题描述】:

概要

我想利用 Boost Spirit 的 stream parser API 逐步解析 std::istream。但是,我找不到一个很好的例子来说明如何将它与基于迭代器的语法一起使用。从概念上讲,我的目标是解析T 类型的无限对象流。

详情

具有T 类型属性和skipper S 类型属性的Qi 语法通常具有以下形式:

template <typename Iterator>
struct grammar : qi::grammar<Iterator, T(), S>;

如何在基于流的 API 中使用这样的语法?具体来说,我对流 API 的心智模型是我可以按照以下方式做一些事情:

// Callback invoked for each successfully parsed instance of T.
void f(T const& x)
{
}


// What iterator type?
grammar<???> parser;
skipper<???> skipper;

T x;

std::ifstream ifs("/path/to/file");
ifs.unsetf(std::ios::skipws)
while (! ifs.eof())
{
    ifs >> phrase_match(parser, skipper, x);
    if (ifs.good() || ifs.eof())
        f(x);
}

我正在努力整合需要迭代器的传统语法。它如何与流 API 配合使用?

【问题讨论】:

    标签: c++ parsing boost boost-spirit boost-spirit-qi


    【解决方案1】:

    您缺少Spirit multi-pass iterator。但是请注意,除非您竭尽全力确保语法具有最少的回溯,否则不会以增量方式解析流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2012-01-21
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多