Spirit Qi从Console中解析多线

时间:2015-08-31 16:31:05

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

我使用Console作为输入源。 我寻找一种方式来解析一条线,然后它等待下一行并继续从该点解析。 例如,采用以下语法

start = MultiLine | Line;
Multiline = "{" *(Line) "}";
Line = *(char_("A-Za-z0-9"));

作为输入

{ AAAA
Bbbb
lllll
lalala
}

从文件中取出整个内容很容易。 但是,如果我需要输入来自控制台,我该怎么办? 我希望它能够处理它已经给出的内容,并等待剩余的行。

2 个答案:

答案 0 :(得分:1)

您可以使用从std::cin构造的istream迭代器。如果您的语法与Hartmut在所有示例中的typename iterator模板化,那么它应该可以正常工作。

如果您提供SSCCE,将很容易说明。 istream迭代器只需要创建几行代码。

答案 1 :(得分:1)

在Qi中执行此操作的最“高级”惯用方法是qi::match

<强> Live On Coliru

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

using Line      = std::string;
using MultiLine = std::vector<Line>;

int main() {

    std::cin.unsetf(std::ios::skipws);

    MultiLine block;
    using namespace boost::spirit::qi;

    while (std::cin >> phrase_match('{' >> lexeme[*~char_("\r\n}")] % eol >> '}', blank, block))
    {
        std::cout << "Processing a block of " << block.size() << " lines\n";
        block.clear();
    }
}

打印:

Processing a block of 4 lines
Processing a block of 7 lines

第二行出现延迟一秒后(由于使用了sleep 1

正如克里斯贝克暗示的那样,这会使用boost::spirit::istream_iterator。你也可以明确地使用它,例如如果你想使用递归嵌套规则。